mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 10:22:41 +08:00
Update.
2004-01-19 Jakub Jelinek <jakub@redhat.com> * posix/regexec.c (get_subexp): Remove bkref_str variable. Extend buffers if needed before comparisons. (get_subexp_sub): Handle clean_state_log_if_needed failure.
This commit is contained in:
parent
ec6e8624bb
commit
c1baba0f7b
@ -1,3 +1,9 @@
|
|||||||
|
2004-01-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
* posix/regexec.c (get_subexp): Remove bkref_str variable.
|
||||||
|
Extend buffers if needed before comparisons.
|
||||||
|
(get_subexp_sub): Handle clean_state_log_if_needed failure.
|
||||||
|
|
||||||
2004-01-17 Ulrich Drepper <drepper@redhat.com>
|
2004-01-17 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* sysdeps/i386/i486/bits/atomic.h (atomic_add): Fix test for using
|
* sysdeps/i386/i486/bits/atomic.h (atomic_add): Fix test for using
|
||||||
|
@ -2551,7 +2551,6 @@ get_subexp (mctx, bkref_node, bkref_str_idx)
|
|||||||
re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
|
re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
|
||||||
re_sub_match_last_t *sub_last;
|
re_sub_match_last_t *sub_last;
|
||||||
int sub_last_idx, sl_str, bkref_str_off;
|
int sub_last_idx, sl_str, bkref_str_off;
|
||||||
const char *bkref_str;
|
|
||||||
|
|
||||||
if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
|
if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
|
||||||
continue; /* It isn't related. */
|
continue; /* It isn't related. */
|
||||||
@ -2567,9 +2566,24 @@ get_subexp (mctx, bkref_node, bkref_str_idx)
|
|||||||
sl_str_diff = sub_last->str_idx - sl_str;
|
sl_str_diff = sub_last->str_idx - sl_str;
|
||||||
/* The matched string by the sub expression match with the substring
|
/* The matched string by the sub expression match with the substring
|
||||||
at the back reference? */
|
at the back reference? */
|
||||||
if (sl_str_diff > 0
|
if (sl_str_diff > 0)
|
||||||
&& memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
|
{
|
||||||
break; /* We don't need to search this sub expression any more. */
|
if (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0))
|
||||||
|
{
|
||||||
|
/* Not enough chars for a successful match. */
|
||||||
|
if (bkref_str_off + sl_str_diff > mctx->input.len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
err = clean_state_log_if_needed (mctx,
|
||||||
|
bkref_str_off
|
||||||
|
+ sl_str_diff);
|
||||||
|
if (BE (err != REG_NOERROR, 0))
|
||||||
|
return err;
|
||||||
|
buf = (const char *) re_string_get_buffer (&mctx->input);
|
||||||
|
}
|
||||||
|
if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
|
||||||
|
break; /* We don't need to search this sub expression any more. */
|
||||||
|
}
|
||||||
bkref_str_off += sl_str_diff;
|
bkref_str_off += sl_str_diff;
|
||||||
sl_str += sl_str_diff;
|
sl_str += sl_str_diff;
|
||||||
err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
|
err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
|
||||||
@ -2584,7 +2598,6 @@ get_subexp (mctx, bkref_node, bkref_str_idx)
|
|||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
bkref_str = buf + bkref_str_off;
|
|
||||||
|
|
||||||
if (sub_last_idx < sub_top->nlasts)
|
if (sub_last_idx < sub_top->nlasts)
|
||||||
continue;
|
continue;
|
||||||
@ -2598,8 +2611,24 @@ get_subexp (mctx, bkref_node, bkref_str_idx)
|
|||||||
sl_str_off = sl_str - sub_top->str_idx;
|
sl_str_off = sl_str - sub_top->str_idx;
|
||||||
/* The matched string by the sub expression match with the substring
|
/* The matched string by the sub expression match with the substring
|
||||||
at the back reference? */
|
at the back reference? */
|
||||||
if (sl_str_off > 0 && *bkref_str++ != buf[sl_str - 1])
|
if (sl_str_off > 0)
|
||||||
break; /* We don't need to search this sub expression any more. */
|
{
|
||||||
|
if (BE (bkref_str_off >= mctx->input.valid_len, 0))
|
||||||
|
{
|
||||||
|
/* If we are at the end of the input, we cannot match. */
|
||||||
|
if (bkref_str_off >= mctx->input.len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
err = extend_buffers (mctx);
|
||||||
|
if (BE (err != REG_NOERROR, 0))
|
||||||
|
return err;
|
||||||
|
|
||||||
|
buf = (const char *) re_string_get_buffer (&mctx->input);
|
||||||
|
}
|
||||||
|
if (buf [bkref_str_off++] != buf[sl_str - 1])
|
||||||
|
break; /* We don't need to search this sub expression
|
||||||
|
any more. */
|
||||||
|
}
|
||||||
if (mctx->state_log[sl_str] == NULL)
|
if (mctx->state_log[sl_str] == NULL)
|
||||||
continue;
|
continue;
|
||||||
/* Does this state have a ')' of the sub expression? */
|
/* Does this state have a ')' of the sub expression? */
|
||||||
@ -2659,8 +2688,7 @@ get_subexp_sub (mctx, sub_top, sub_last, bkref_node, bkref_str)
|
|||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
|
to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
|
||||||
clean_state_log_if_needed (mctx, to_idx);
|
return clean_state_log_if_needed (mctx, to_idx);
|
||||||
return REG_NOERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
|
/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
|
||||||
|
Loading…
Reference in New Issue
Block a user