Issue #18684: Fixed reading out of the buffer in the re module.

This commit is contained in:
Serhiy Storchaka 2015-07-06 14:03:01 +03:00
commit 02eae6b1f2
3 changed files with 43 additions and 14 deletions

View file

@ -994,7 +994,7 @@ _sre_SRE_Pattern_split_impl(PatternObject *self, PyObject *string,
}
if (state.start == state.ptr) {
if (last == state.end)
if (last == state.end || state.ptr == state.end)
break;
/* skip one character */
state.start = (void*) ((char*) state.ptr + state.charsize);
@ -1191,6 +1191,8 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string,
next:
/* move on */
if (state.ptr == state.end)
break;
if (state.ptr == state.start)
state.start = (void*) ((char*) state.ptr + state.charsize);
else
@ -2564,6 +2566,9 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self)
PyObject* match;
Py_ssize_t status;
if (state->start == NULL)
Py_RETURN_NONE;
state_reset(state);
state->ptr = state->start;
@ -2575,10 +2580,14 @@ _sre_SRE_Scanner_match_impl(ScannerObject *self)
match = pattern_new_match((PatternObject*) self->pattern,
state, status);
if (status == 0 || state->ptr == state->start)
if (status == 0)
state->start = NULL;
else if (state->ptr != state->start)
state->start = state->ptr;
else if (state->ptr != state->end)
state->start = (void*) ((char*) state->ptr + state->charsize);
else
state->start = state->ptr;
state->start = NULL;
return match;
}
@ -2597,6 +2606,9 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self)
PyObject* match;
Py_ssize_t status;
if (state->start == NULL)
Py_RETURN_NONE;
state_reset(state);
state->ptr = state->start;
@ -2608,10 +2620,14 @@ _sre_SRE_Scanner_search_impl(ScannerObject *self)
match = pattern_new_match((PatternObject*) self->pattern,
state, status);
if (status == 0 || state->ptr == state->start)
if (status == 0)
state->start = NULL;
else if (state->ptr != state->start)
state->start = state->ptr;
else if (state->ptr != state->end)
state->start = (void*) ((char*) state->ptr + state->charsize);
else
state->start = state->ptr;
state->start = NULL;
return match;
}