mirror of
https://github.com/python/cpython.git
synced 2025-10-17 20:28:43 +00:00
Issue #18684: Fixed reading out of the buffer in the re module.
This commit is contained in:
commit
02eae6b1f2
3 changed files with 43 additions and 14 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue