regex: fix newline matching with negated brackets
authorJulien Ramseier <j.ramseier@gmail.com>
Tue, 21 Mar 2017 16:24:23 +0000 (12:24 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 21 Mar 2017 16:24:23 +0000 (12:24 -0400)
With REG_NEWLINE, POSIX says:
"A <newline> in string shall not be matched by a period outside
a bracket expression or by any form of a non-matching list"

src/regex/regcomp.c

index 5a7b53a7dbdc8e426e9cae83314acc60846f0bd2..fb24556ebe12e33cd07d86a7953e2ce30f45c3b7 100644 (file)
@@ -636,6 +636,20 @@ static reg_errcode_t parse_bracket(tre_parse_ctx_t *ctx, const char *s)
                goto parse_bracket_done;
 
        if (neg.negate) {
+               /*
+                * With REG_NEWLINE, POSIX requires that newlines are not matched by
+                * any form of a non-matching list.
+                */
+               if (ctx->cflags & REG_NEWLINE) {
+                       lit = tre_new_lit(&ls);
+                       if (!lit) {
+                               err = REG_ESPACE;
+                               goto parse_bracket_done;
+                       }
+                       lit->code_min = '\n';
+                       lit->code_max = '\n';
+                       lit->position = -1;
+               }
                /* Sort the array if we need to negate it. */
                qsort(ls.a, ls.len, sizeof *ls.a, tre_compare_lit);
                /* extra lit for the last negated range */