|
|
|
@ -357,6 +357,11 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, |
|
|
|
|
|
|
|
memset(state, 0, sizeof(SRE_STATE)); |
|
|
|
|
|
|
|
state->mark = PyMem_New(void *, pattern->groups * 2); |
|
|
|
if (!state->mark) { |
|
|
|
PyErr_NoMemory(); |
|
|
|
goto err; |
|
|
|
} |
|
|
|
state->lastmark = -1; |
|
|
|
state->lastindex = -1; |
|
|
|
|
|
|
|
@ -409,6 +414,8 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string, |
|
|
|
|
|
|
|
return string; |
|
|
|
err: |
|
|
|
PyMem_Del(state->mark); |
|
|
|
state->mark = NULL; |
|
|
|
if (state->buffer.buf) |
|
|
|
PyBuffer_Release(&state->buffer); |
|
|
|
return NULL; |
|
|
|
@ -421,6 +428,8 @@ state_fini(SRE_STATE* state) |
|
|
|
PyBuffer_Release(&state->buffer); |
|
|
|
Py_XDECREF(state->string); |
|
|
|
data_stack_dealloc(state); |
|
|
|
PyMem_Del(state->mark); |
|
|
|
state->mark = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
/* calculate offset from start of string */ |
|
|
|
@ -560,6 +569,7 @@ pattern_match(PatternObject *self, PyObject *args, PyObject *kwargs) |
|
|
|
PyObject *pattern = NULL; |
|
|
|
SRE_STATE state; |
|
|
|
Py_ssize_t status; |
|
|
|
PyObject *match; |
|
|
|
|
|
|
|
if (!PyArg_ParseTupleAndKeywords(args, kwargs, |
|
|
|
"|Onn$O:match", _keywords, |
|
|
|
@ -579,12 +589,14 @@ pattern_match(PatternObject *self, PyObject *args, PyObject *kwargs) |
|
|
|
status = sre_match(&state, PatternObject_GetCode(self), 0); |
|
|
|
|
|
|
|
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); |
|
|
|
if (PyErr_Occurred()) |
|
|
|
if (PyErr_Occurred()) { |
|
|
|
state_fini(&state); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
match = pattern_new_match(self, &state, status); |
|
|
|
state_fini(&state); |
|
|
|
|
|
|
|
return (PyObject *)pattern_new_match(self, &state, status); |
|
|
|
return match; |
|
|
|
} |
|
|
|
|
|
|
|
static PyObject* |
|
|
|
@ -592,6 +604,7 @@ pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kw) |
|
|
|
{ |
|
|
|
SRE_STATE state; |
|
|
|
Py_ssize_t status; |
|
|
|
PyObject *match; |
|
|
|
|
|
|
|
PyObject *string = NULL, *string2 = NULL; |
|
|
|
Py_ssize_t start = 0; |
|
|
|
@ -616,12 +629,14 @@ pattern_fullmatch(PatternObject* self, PyObject* args, PyObject* kw) |
|
|
|
status = sre_match(&state, PatternObject_GetCode(self), 1); |
|
|
|
|
|
|
|
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); |
|
|
|
if (PyErr_Occurred()) |
|
|
|
if (PyErr_Occurred()) { |
|
|
|
state_fini(&state); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
match = pattern_new_match(self, &state, status); |
|
|
|
state_fini(&state); |
|
|
|
|
|
|
|
return pattern_new_match(self, &state, status); |
|
|
|
return match; |
|
|
|
} |
|
|
|
|
|
|
|
static PyObject* |
|
|
|
@ -629,6 +644,7 @@ pattern_search(PatternObject* self, PyObject* args, PyObject* kw) |
|
|
|
{ |
|
|
|
SRE_STATE state; |
|
|
|
Py_ssize_t status; |
|
|
|
PyObject *match; |
|
|
|
|
|
|
|
PyObject *string = NULL, *string2 = NULL; |
|
|
|
Py_ssize_t start = 0; |
|
|
|
@ -652,12 +668,14 @@ pattern_search(PatternObject* self, PyObject* args, PyObject* kw) |
|
|
|
|
|
|
|
TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); |
|
|
|
|
|
|
|
state_fini(&state); |
|
|
|
|
|
|
|
if (PyErr_Occurred()) |
|
|
|
if (PyErr_Occurred()) { |
|
|
|
state_fini(&state); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
return pattern_new_match(self, &state, status); |
|
|
|
match = pattern_new_match(self, &state, status); |
|
|
|
state_fini(&state); |
|
|
|
return match; |
|
|
|
} |
|
|
|
|
|
|
|
static PyObject* |
|
|
|
@ -1417,7 +1435,7 @@ _compile(PyObject* self_, PyObject* args) |
|
|
|
PyObject* groupindex = NULL; |
|
|
|
PyObject* indexgroup = NULL; |
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "OiO!|nOO", &pattern, &flags, |
|
|
|
if (!PyArg_ParseTuple(args, "OiO!nOO", &pattern, &flags, |
|
|
|
&PyList_Type, &code, &groups, |
|
|
|
&groupindex, &indexgroup)) |
|
|
|
return NULL; |
|
|
|
@ -1933,10 +1951,9 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) |
|
|
|
static int |
|
|
|
_validate_outer(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups) |
|
|
|
{ |
|
|
|
if (groups < 0 || groups > 100 || code >= end || end[-1] != SRE_OP_SUCCESS) |
|
|
|
if (groups < 0 || (size_t)groups > SRE_MAXGROUPS || |
|
|
|
code >= end || end[-1] != SRE_OP_SUCCESS) |
|
|
|
FAIL; |
|
|
|
if (groups == 0) /* fix for simplejson */ |
|
|
|
groups = 100; /* 100 groups should always be safe */ |
|
|
|
return _validate_inner(code, end-1, groups); |
|
|
|
} |
|
|
|
|
|
|
|
@ -2747,6 +2764,12 @@ PyMODINIT_FUNC PyInit__sre(void) |
|
|
|
Py_DECREF(x); |
|
|
|
} |
|
|
|
|
|
|
|
x = PyLong_FromUnsignedLong(SRE_MAXGROUPS); |
|
|
|
if (x) { |
|
|
|
PyDict_SetItemString(d, "MAXGROUPS", x); |
|
|
|
Py_DECREF(x); |
|
|
|
} |
|
|
|
|
|
|
|
x = PyUnicode_FromString(copyright); |
|
|
|
if (x) { |
|
|
|
PyDict_SetItemString(d, "copyright", x); |
|
|
|
|