mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Check whether a string resize is necessary at the end
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
This commit is contained in:
parent
8e790e7007
commit
8709a420c4
2 changed files with 12 additions and 4 deletions
|
@ -23,9 +23,16 @@ class UTF16Test(unittest.TestCase):
|
||||||
f = reader(s)
|
f = reader(s)
|
||||||
self.assertEquals(f.read(), u"spamspam")
|
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():
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -533,8 +533,8 @@ PyObject *PyString_DecodeEscape(const char *s,
|
||||||
char *p, *buf;
|
char *p, *buf;
|
||||||
const char *end;
|
const char *end;
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
v = PyString_FromStringAndSize((char *)NULL,
|
int newlen = recode_encoding ? 4*len:len;
|
||||||
recode_encoding ? 4*len:len);
|
v = PyString_FromStringAndSize((char *)NULL, newlen);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
p = buf = PyString_AsString(v);
|
p = buf = PyString_AsString(v);
|
||||||
|
@ -660,7 +660,8 @@ PyObject *PyString_DecodeEscape(const char *s,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_PyString_Resize(&v, (int)(p - buf));
|
if (p-buf < newlen)
|
||||||
|
_PyString_Resize(&v, (int)(p - buf));
|
||||||
return v;
|
return v;
|
||||||
failed:
|
failed:
|
||||||
Py_DECREF(v);
|
Py_DECREF(v);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue