diff --git a/src/xml.c b/src/xml.c index 881385a28..54acc4d8f 100644 --- a/src/xml.c +++ b/src/xml.c @@ -516,10 +516,20 @@ lyxml_parse_value(struct lyxml_ctx *xmlctx, char endchar, char **value, uint32_t ADD_CHECK_OVERFLOW(offset, 1, error); if (isdigit(in[offset])) { for (n = 0; isdigit(in[offset]); offset++) { + if (n > 0x10ffff) { + /* too large, would overflow */ + LOGVAL(ctx, NULL, LYVE_SYNTAX, "Invalid character reference \"%.12s\".", p); + goto error; + } n = (LY_BASE_DEC * n) + (in[offset] - '0'); } } else if ((in[offset] == 'x') && isxdigit(in[offset + 1])) { for (n = 0, ++offset; isxdigit(in[offset]); offset++) { + if (n > 0x10ffff) { + /* too large, would overflow */ + LOGVAL(ctx, NULL, LYVE_SYNTAX, "Invalid character reference \"%.12s\".", p); + goto error; + } if (isdigit(in[offset])) { u = (in[offset] - '0'); } else if (in[offset] > 'F') { diff --git a/tests/utests/basic/test_xml.c b/tests/utests/basic/test_xml.c index 5712f3468..c47adbf82 100644 --- a/tests/utests/basic/test_xml.c +++ b/tests/utests/basic/test_xml.c @@ -268,6 +268,22 @@ test_text(void **state) str = "�"; + assert_int_equal(LY_EVALID, lyd_parse_data_mem(ctx, str, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree)); + CHECK_LOG_CTX("Invalid character reference \"�\".", NULL, 1); + + /* leading zeros are fine */ + str = "<<"; + assert_int_equal(LY_SUCCESS, lyd_parse_data_mem(ctx, str, LYD_XML, 0, LYD_VALIDATE_PRESENT, &tree)); + assert_non_null(tree); + lyd_free_all(tree); + tree = NULL; } static void