diff options
Diffstat (limited to 'posix')
-rw-r--r-- | posix/regex_internal.c | 2 | ||||
-rw-r--r-- | posix/regexec.c | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/posix/regex_internal.c b/posix/regex_internal.c index c1605a0..1da5f70 100644 --- a/posix/regex_internal.c +++ b/posix/regex_internal.c @@ -519,6 +519,8 @@ re_string_reconstruct (pstr, idx, eflags, newline) mbstate_t cur_state; wchar_t wc2; + /* XXX Don't use mbrtowc, we know which conversion + to use (UTF-8 -> UCS4). */ memset (&cur_state, 0, sizeof (cur_state)); if (mbrtowc (&wc2, p, raw + offset - p, &cur_state) == raw + offset - p) diff --git a/posix/regexec.c b/posix/regexec.c index 6f4448a..03b97e8 100644 --- a/posix/regexec.c +++ b/posix/regexec.c @@ -2550,6 +2550,12 @@ get_subexp (preg, mctx, bkref_node, bkref_str_idx) sl_str += sl_str_diff; err = get_subexp_sub (preg, mctx, sub_top, sub_last, bkref_node, bkref_str_idx); + + /* Reload buf and bkref_str, since the preceding call might + have reallocated the buffer. */ + buf = (char *) re_string_get_buffer (mctx->input); + bkref_str = buf + bkref_str_idx; + if (err == REG_NOMATCH) continue; if (BE (err != REG_NOERROR, 0)) @@ -2567,8 +2573,7 @@ get_subexp (preg, mctx, bkref_node, bkref_str_idx) sl_str_off = sl_str - sub_top->str_idx; /* The matched string by the sub expression match with the substring at the back reference? */ - if (sl_str_off > 0 - && memcmp (bkref_str++, buf + sl_str - 1, 1) != 0) + if (sl_str_off > 0 && *bkref_str++ != buf[sl_str - 1]) break; /* We don't need to search this sub expression any more. */ if (mctx->state_log[sl_str] == NULL) continue; |