Skip to content

Commit 0f6c94b

Browse files
authored
ly common BUGFIX reused character group index
Fixes #2507
1 parent b136a8a commit 0f6c94b

2 files changed

Lines changed: 50 additions & 3 deletions

File tree

src/ly_common.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg
813813
{NULL, NULL}
814814
};
815815

816-
size_t idx, idx2, start, end;
816+
size_t idx, idx2, start, end, ublock;
817817
char *perl_regex, *ptr;
818818

819819
perl_regex = *regex;
@@ -849,6 +849,7 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg
849849
return ly_err_new(err, LY_EVALID, 0, NULL, NULL, "Regular expression \"%s\" is not valid (\"%s\": %s).",
850850
pattern, perl_regex + start + 5, "unknown block name");
851851
}
852+
ublock = idx;
852853

853854
/* make the space in the string and replace the block (but we cannot include brackets if it was already enclosed in them) */
854855
for (idx2 = 0, idx = 0; idx2 < start; ++idx2) {
@@ -863,10 +864,10 @@ ly_pat_compile_xmlschema_chblocks_xmlschema2perl(const char *pattern, char **reg
863864
if (idx) {
864865
/* skip brackets */
865866
memmove(perl_regex + start + (URANGE_LEN - 2), perl_regex + end, strlen(perl_regex + end) + 1);
866-
memcpy(perl_regex + start, ublock2urange[idx][1] + 1, URANGE_LEN - 2);
867+
memcpy(perl_regex + start, ublock2urange[ublock][1] + 1, URANGE_LEN - 2);
867868
} else {
868869
memmove(perl_regex + start + URANGE_LEN, perl_regex + end, strlen(perl_regex + end) + 1);
869-
memcpy(perl_regex + start, ublock2urange[idx][1], URANGE_LEN);
870+
memcpy(perl_regex + start, ublock2urange[ublock][1], URANGE_LEN);
870871
}
871872
}
872873

tests/utests/types/string.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,52 @@ test_data_xml(void **state)
817817
CHECK_LOG_CTX("Unsatisfied pattern - \"abc\" does not match \"a.*b\".", "/T_ANCHOR:port", 1);
818818
TEST_ERROR_XML("T_ANCHOR", "cab");
819819
CHECK_LOG_CTX("Unsatisfied pattern - \"cab\" does not match \"a.*b\".", "/T_ANCHOR:port", 1);
820+
821+
/* Unicode block test 1 - Basic Latin */
822+
schema = MODULE_CREATE_YANG("T_UB_1", "leaf port {type string { pattern '\\p{IsBasicLatin}+';} } ");
823+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
824+
TEST_SUCCESS_XML("T_UB_1", "B4s1cLatin!", STRING, "B4s1cLatin!");
825+
826+
/* Unicode block test 2 - Basic Latin within brackets */
827+
schema = MODULE_CREATE_YANG("T_UB_2", "leaf port {type string { pattern '[\\p{IsBasicLatin}]+';} } ");
828+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
829+
TEST_SUCCESS_XML("T_UB_2", "B4s1cLatin!", STRING, "B4s1cLatin!");
830+
831+
/* Unicode block test 3 - Latin-1 Supplement */
832+
schema = MODULE_CREATE_YANG("T_UB_3", "leaf port {type string { pattern '[\\p{IsLatin-1Supplement}]+';} } ");
833+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
834+
TEST_SUCCESS_XML("T_UB_3", "ÁÉÍÓÖÜ", STRING, "ÁÉÍÓÖÜ");
835+
836+
/* Unicode block test 4 - Latin-1 Supplement */
837+
schema = MODULE_CREATE_YANG("T_UB_4", "leaf port {type string { pattern '[\\p{IsLatin-1Supplement}]+';} } ");
838+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
839+
TEST_SUCCESS_XML("T_UB_4", "ÁÉÍÓÖÜ", STRING, "ÁÉÍÓÖÜ");
840+
841+
/* Unicode block test 5 - Latin Extended-A */
842+
schema = MODULE_CREATE_YANG("T_UB_5", "leaf port {type string { pattern '[\\p{IsLatinExtended-A}]+';} } ");
843+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
844+
TEST_SUCCESS_XML("T_UB_5", "ŐŰőű", STRING, "ŐŰőű");
845+
846+
/* Unicode block test 6 - Basic Latin, Latin-1 Supplement, and Latin Extended-A */
847+
schema = MODULE_CREATE_YANG("T_UB_6", "leaf port {type string {"
848+
" pattern '[\\p{IsBasicLatin}\\p{IsLatin-1Supplement}\\p{IsLatinExtended-A}]+';"
849+
"}} ");
850+
UTEST_ADD_MODULE(schema, LYS_IN_YANG, NULL, NULL);
851+
TEST_SUCCESS_XML("T_UB_6", "Árvíztűrő tükörfúrógép!", STRING, "Árvíztűrő tükörfúrógép!");
852+
853+
/* Unicode block test 7 - Unknown Unicode block */
854+
schema = MODULE_CREATE_YANG("T_UB_7", "leaf port {type string { pattern '\\p{IsUnknownUnicodeBlock}+';} } ");
855+
UTEST_INVALID_MODULE(schema, LYS_IN_YANG, NULL, LY_EVALID);
856+
CHECK_LOG_CTX("Regular expression \"\\p{IsUnknownUnicodeBlock}+\" "
857+
"is not valid (\"UnknownUnicodeBlock}+\": unknown block name).", "/T_UB_7:port", 0);
858+
859+
/* Unicode block test 8 - Unknown Unicode block with Basic Latin */
860+
schema = MODULE_CREATE_YANG("T_UB_8", "leaf port {type string { "
861+
" pattern '[\\p{IsBasicLatin}\\p{IsUnknownUnicodeBlock}]+';"
862+
"}} ");
863+
UTEST_INVALID_MODULE(schema, LYS_IN_YANG, NULL, LY_EVALID);
864+
CHECK_LOG_CTX("Regular expression \"[\\p{IsBasicLatin}\\p{IsUnknownUnicodeBlock}]+\" "
865+
"is not valid (\"UnknownUnicodeBlock}]+\": unknown block name).", "/T_UB_8:port", 0);
820866
}
821867

822868
static void

0 commit comments

Comments
 (0)