Fix up regcomp/regexec
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Dec 2011 22:13:56 +0000 (17:13 -0500)
committerUlrich Drepper <drepper@gmail.com>
Fri, 30 Dec 2011 22:13:56 +0000 (17:13 -0500)
The problem is that parse_bracket_symbol is miscompiled, and it turns
out it is because of an incorrect attribute on re_string_fetch_byte_case.
Unlike re_string_peek_byte_case, this one is really not pure, it modifies memory
(increments pstr->cur_idx), and with the pure attribute GCC assumed it doesn't
and it cached the presumed value of regexp->cur_idx in a variable across the
 for (;; ++i)
   {
     if (i >= BRACKET_NAME_BUF_SIZE)
       return REG_EBRACK;
     if (token->type == OP_OPEN_CHAR_CLASS)
       ch = re_string_fetch_byte_case (regexp);
     else
       ch = re_string_fetch_byte (regexp);
     if (re_string_eoi(regexp))
       return REG_EBRACK;
     if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
       break;
     elem->opr.name[i] = ch;
   }

ChangeLog
posix/regex_internal.c

index e81ffc1..7a534b4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-30  Jakub Jelinek  <jakub@redhat.com>
+
+       * posix/regex_internal.c (re_string_fetch_byte_case): Remove
+       pure attribute.
+
 2011-12-23  Ulrich Drepper  <drepper@gmail.com>
 
        * version.h (RELEASE): Bump for 2.15 release.
index bc19243..124f8cc 100644 (file)
@@ -868,7 +868,7 @@ re_string_peek_byte_case (const re_string_t *pstr, int idx)
 }
 
 static unsigned char
-internal_function __attribute ((pure))
+internal_function
 re_string_fetch_byte_case (re_string_t *pstr)
 {
   if (BE (!pstr->mbs_allocated, 1))