]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #9402: pyexpat uses Py_DECREF() instead of PyObject_DEL()
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 10 Sep 2010 22:25:19 +0000 (22:25 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 10 Sep 2010 22:25:19 +0000 (22:25 +0000)
Fix a crash if Python is compiled in pydebug mode.

Lib/test/test_pyexpat.py
Modules/pyexpat.c

index 38983481c814d18bf8da1faef14d7ed435b0830e..6f63d53a2390bee1d155b2632b20562a2be141bb 100644 (file)
@@ -221,6 +221,25 @@ class InterningTest(unittest.TestCase):
             # L should have the same string repeated over and over.
             self.assertTrue(tag is entry)
 
+    def test_issue9402(self):
+        # create an ExternalEntityParserCreate with buffer text
+        class ExternalOutputter:
+            def __init__(self, parser):
+                self.parser = parser
+                self.parser_result = None
+
+            def ExternalEntityRefHandler(self, context, base, sysId, pubId):
+                external_parser = self.parser.ExternalEntityParserCreate("")
+                self.parser_result = external_parser.Parse("", 1)
+                return 1
+
+        parser = expat.ParserCreate(namespace_separator='!')
+        parser.buffer_text = 1
+        out = ExternalOutputter(parser)
+        parser.ExternalEntityRefHandler = out.ExternalEntityRefHandler
+        parser.Parse(data, 1)
+        self.assertEquals(out.parser_result, 1)
+
 
 class BufferTextTest(unittest.TestCase):
     def setUp(self):
index 165343207cd481b69cd8746179df95665ea39167..f24584c63d43950d25ee6d9bddf99721b3ff248c 100644 (file)
@@ -973,21 +973,7 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
         return NULL;
     new_parser->buffer_size = self->buffer_size;
     new_parser->buffer_used = 0;
-    if (self->buffer != NULL) {
-        new_parser->buffer = malloc(new_parser->buffer_size);
-        if (new_parser->buffer == NULL) {
-#ifndef Py_TPFLAGS_HAVE_GC
-            /* Code for versions 2.0 and 2.1 */
-            PyObject_Del(new_parser);
-#else
-            /* Code for versions 2.2 and later. */
-            PyObject_GC_Del(new_parser);
-#endif
-            return PyErr_NoMemory();
-        }
-    }
-    else
-        new_parser->buffer = NULL;
+    new_parser->buffer = NULL;
     new_parser->ordered_attributes = self->ordered_attributes;
     new_parser->specified_attributes = self->specified_attributes;
     new_parser->in_callback = 0;
@@ -1003,6 +989,13 @@ xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
     PyObject_GC_Init(new_parser);
 #endif
 
+    if (self->buffer != NULL) {
+        new_parser->buffer = malloc(new_parser->buffer_size);
+        if (new_parser->buffer == NULL) {
+            Py_DECREF(new_parser);
+            return PyErr_NoMemory();
+        }
+    }
     if (!new_parser->itself) {
         Py_DECREF(new_parser);
         return PyErr_NoMemory();