From b337a3b0ed69d6fb4092fe1b796fd87025fb2915 Mon Sep 17 00:00:00 2001 From: "andrew.kuchling" Date: Thu, 5 Oct 2006 17:26:33 +0000 Subject: [PATCH] [Backport to 2-5maint of r52147 | andrew.kuchling ; the buildbots seem OK with this change.] Cause a PyObject_Malloc() failure to trigger a MemoryError, and then add 'if (PyErr_Occurred())' checks to various places so that NULL is returned properly. git-svn-id: http://svn.python.org/projects/python/branches/release25-maint@52164 6015fed2-1504-0410-9fe1-9d1591cc4771 --- Misc/NEWS | 1 + Modules/_sre.c | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 85587ebf3..7a8e4de2f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,7 @@ Extension Modules - Fix itertools.count(n) to work with negative numbers again. +- Make regex engine raise MemoryError if allocating memory fails. Library ------- diff --git a/Modules/_sre.c b/Modules/_sre.c index 9e3a1e822..c1eb71cf2 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1166,9 +1166,10 @@ entrance: /* install new repeat context */ ctx->u.rep = (SRE_REPEAT*) PyObject_MALLOC(sizeof(*ctx->u.rep)); - /* XXX(nnorwitz): anything else we need to do on error? */ - if (!ctx->u.rep) + if (!ctx->u.rep) { + PyErr_NoMemory(); RETURN_FAILURE; + } ctx->u.rep->count = -1; ctx->u.rep->pattern = ctx->pattern; ctx->u.rep->prev = state->repeat; @@ -1884,6 +1885,8 @@ pattern_match(PatternObject* self, PyObject* args, PyObject* kw) } TRACE(("|%p|%p|END\n", PatternObject_GetCode(self), state.ptr)); + if (PyErr_Occurred()) + return NULL; state_fini(&state); @@ -1922,6 +1925,9 @@ pattern_search(PatternObject* self, PyObject* args, PyObject* kw) state_fini(&state); + if (PyErr_Occurred()) + return NULL; + return pattern_new_match(self, &state, status); } @@ -2071,6 +2077,9 @@ pattern_findall(PatternObject* self, PyObject* args, PyObject* kw) #endif } + if (PyErr_Occurred()) + goto error; + if (status <= 0) { if (status == 0) break; @@ -2198,6 +2207,9 @@ pattern_split(PatternObject* self, PyObject* args, PyObject* kw) #endif } + if (PyErr_Occurred()) + goto error; + if (status <= 0) { if (status == 0) break; @@ -2347,6 +2359,9 @@ pattern_subx(PatternObject* self, PyObject* ptemplate, PyObject* string, #endif } + if (PyErr_Occurred()) + goto error; + if (status <= 0) { if (status == 0) break; @@ -3250,6 +3265,8 @@ scanner_match(ScannerObject* self, PyObject *unused) status = sre_umatch(state, PatternObject_GetCode(self->pattern)); #endif } + if (PyErr_Occurred()) + return NULL; match = pattern_new_match((PatternObject*) self->pattern, state, status); @@ -3281,6 +3298,8 @@ scanner_search(ScannerObject* self, PyObject *unused) status = sre_usearch(state, PatternObject_GetCode(self->pattern)); #endif } + if (PyErr_Occurred()) + return NULL; match = pattern_new_match((PatternObject*) self->pattern, state, status); -- 2.11.4.GIT