when running the expression r'(a)(b)?b' over 'ab', lastindex must be
1, not 2.
+- Fixed bug #581080: sre scanner was not checking the buffer limit
+ before increasing the current pointer. This was creating an infinite
+ loop in the search function, once the pointer exceeded the buffer
+ limit.
+
Library
-------
for (;;) {
while (ptr < end && (SRE_CODE) ptr[0] != chr)
ptr++;
- if (ptr == end)
+ if (ptr >= end)
return 0;
TRACE(("|%p|%p|SEARCH LITERAL\n", pattern, ptr));
state->start = ptr;
for (;;) {
while (ptr < end && !SRE_CHARSET(charset, ptr[0]))
ptr++;
- if (ptr == end)
+ if (ptr >= end)
return 0;
TRACE(("|%p|%p|SEARCH CHARSET\n", pattern, ptr));
state->start = ptr;
match = pattern_new_match((PatternObject*) self->pattern,
state, status);
- if (status == 0 || state->ptr == state->start)
+ if ((status == 0 || state->ptr == state->start) &&
+ state->ptr < state->end)
state->start = (void*) ((char*) state->ptr + state->charsize);
else
state->start = state->ptr;
match = pattern_new_match((PatternObject*) self->pattern,
state, status);
- if (status == 0 || state->ptr == state->start)
+ if ((status == 0 || state->ptr == state->start) &&
+ state->ptr < state->end)
state->start = (void*) ((char*) state->ptr + state->charsize);
else
state->start = state->ptr;