]> granicus.if.org Git - python/commitdiff
[Backport to 2-5maint of r52147 | andrew.kuchling ; the buildbots seem OK
authorAndrew M. Kuchling <amk@amk.ca>
Thu, 5 Oct 2006 17:26:33 +0000 (17:26 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Thu, 5 Oct 2006 17:26:33 +0000 (17:26 +0000)
 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.

Misc/NEWS
Modules/_sre.c

index 85587ebf3a69e8e6a05b14b71169c889c8b14d92..7a8e4de2f1b84d9a4f7c0eb2cec8f6728087a129 100644 (file)
--- 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
 -------
index 9e3a1e822b0421f3eb01547dbc7dd83900721bfd..c1eb71cf2697cd1e26573470643401d11c8bf797 100644 (file)
@@ -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);