From: Jakub Jelinek Date: Fri, 30 Dec 2011 22:13:56 +0000 (-0500) Subject: Fix up regcomp/regexec X-Git-Tag: upstream/2.30~11764 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ba92745c36eb3c3f3af0ce1b0aebd255c63a13b;p=external%2Fglibc.git Fix up regcomp/regexec 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; } --- diff --git a/ChangeLog b/ChangeLog index e81ffc1..7a534b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-12-30 Jakub Jelinek + + * posix/regex_internal.c (re_string_fetch_byte_case): Remove + pure attribute. + 2011-12-23 Ulrich Drepper * version.h (RELEASE): Bump for 2.15 release. diff --git a/posix/regex_internal.c b/posix/regex_internal.c index bc19243..124f8cc 100644 --- a/posix/regex_internal.c +++ b/posix/regex_internal.c @@ -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))