summaryrefslogtreecommitdiff
path: root/src/regex
diff options
context:
space:
mode:
authorSzabolcs Nagy <nsz@port70.net>2015-03-25 18:25:09 +0000
committerRich Felker <dalias@aerifal.cx>2015-03-27 20:24:30 -0400
commitc498efe117539a9d40d90b588c033316701c4b3e (patch)
tree23a5ec4059db7e0baa14316f0c8cf32cd973e6cc /src/regex
parent32dee9b9b1e557a73cc4427455cd00cb2571436c (diff)
downloadmusl-c498efe117539a9d40d90b588c033316701c4b3e.tar.gz
musl-c498efe117539a9d40d90b588c033316701c4b3e.tar.bz2
musl-c498efe117539a9d40d90b588c033316701c4b3e.tar.xz
musl-c498efe117539a9d40d90b588c033316701c4b3e.zip
regex: fix character class repetitions
Internally regcomp needs to copy some iteration nodes before translating the AST into TNFA representation. Literal nodes were not copied correctly: the class type and list of negated class types were not copied so classes were ignored (in the non-negated case an ignored char class caused the literal to match everything). This affects iterations when the upper bound is finite, larger than one or the lower bound is larger than one. So eg. the EREs [[:digit:]]{2} [^[:space:]ab]{1,4} were treated as .{2} [^ab]{1,4} The fix is done with minimal source modification to copy the necessary fields, but the AST preparation and node handling code of tre will need to be cleaned up for clarity.
Diffstat (limited to 'src/regex')
-rw-r--r--src/regex/regcomp.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/regex/regcomp.c b/src/regex/regcomp.c
index dfa9727c..978dd87f 100644
--- a/src/regex/regcomp.c
+++ b/src/regex/regcomp.c
@@ -1700,6 +1700,11 @@ tre_copy_ast(tre_mem_t mem, tre_stack_t *stack, tre_ast_node_t *ast,
*result = tre_ast_new_literal(mem, min, max, pos);
if (*result == NULL)
status = REG_ESPACE;
+ else {
+ tre_literal_t *p = (*result)->obj;
+ p->class = lit->class;
+ p->neg_classes = lit->neg_classes;
+ }
if (pos > *max_pos)
*max_pos = pos;