]> granicus.if.org Git - python/commitdiff
Check whether a string resize is necessary at the end
authorWalter Dörwald <walter@livinglogic.de>
Tue, 3 Sep 2002 13:53:40 +0000 (13:53 +0000)
committerWalter Dörwald <walter@livinglogic.de>
Tue, 3 Sep 2002 13:53:40 +0000 (13:53 +0000)
of PyString_DecodeEscape(). This prevents a call to
_PyString_Resize() for the empty string, which would
result in a PyErr_BadInternalCall(), because the
empty string has more than one reference.

This closes SF bug http://www.python.org/sf/603937

Lib/test/test_codecs.py
Objects/stringobject.c

index 0362d2624ff7859b0f51ab21e534bcf29fd2c970..36cebd55359a351bd581048e78b232de152bf38b 100644 (file)
@@ -23,9 +23,16 @@ class UTF16Test(unittest.TestCase):
         f = reader(s)
         self.assertEquals(f.read(), u"spamspam")
 
+class EscapeDecodeTest(unittest.TestCase):
+    def test_empty_escape_decode(self):
+        self.assertEquals(codecs.escape_decode(""), ("", 0))
+
 
 def test_main():
-    test_support.run_unittest(UTF16Test)
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(UTF16Test))
+    suite.addTest(unittest.makeSuite(EscapeDecodeTest))
+    test_support.run_suite(suite)
 
 
 if __name__ == "__main__":
index 31f188a5b9e8ae5767dee7301aaf95e1a350c855..dd38ee3c859605531ade7ff7136daf428c7bdc38 100644 (file)
@@ -533,8 +533,8 @@ PyObject *PyString_DecodeEscape(const char *s,
        char *p, *buf;
        const char *end;
        PyObject *v;
-       v = PyString_FromStringAndSize((char *)NULL, 
-                                      recode_encoding ? 4*len:len);
+       int newlen = recode_encoding ? 4*len:len;
+       v = PyString_FromStringAndSize((char *)NULL, newlen);
        if (v == NULL)
                return NULL;
        p = buf = PyString_AsString(v);
@@ -660,7 +660,8 @@ PyObject *PyString_DecodeEscape(const char *s,
                        break;
                }
        }
-       _PyString_Resize(&v, (int)(p - buf));
+       if (p-buf < newlen)
+               _PyString_Resize(&v, (int)(p - buf));
        return v;
   failed:
        Py_DECREF(v);