summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-01-12 07:22:52 (GMT)
committerGitHub <noreply@github.com>2019-01-12 07:22:52 (GMT)
commit08a81df05004147ee174ece645679576ab867860 (patch)
treee476019c267516a9801b28b123aa6a9454e84afb /Objects/stringobject.c
parent0167c08163f44f4a033497102244bbb6150f606b (diff)
downloadcpython-08a81df05004147ee174ece645679576ab867860.zip
cpython-08a81df05004147ee174ece645679576ab867860.tar.gz
cpython-08a81df05004147ee174ece645679576ab867860.tar.bz2
bpo-33817: Fix _PyString_Resize() and _PyUnicode_Resize() for empty strings. (GH-11515)
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index b21afb4..efb0d14 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -3893,13 +3893,31 @@ _PyString_Resize(PyObject **pv, Py_ssize_t newsize)
register PyObject *v;
register PyStringObject *sv;
v = *pv;
- if (!PyString_Check(v) || Py_REFCNT(v) != 1 || newsize < 0 ||
- PyString_CHECK_INTERNED(v)) {
+ if (!PyString_Check(v) || newsize < 0) {
*pv = 0;
Py_DECREF(v);
PyErr_BadInternalCall();
return -1;
}
+ if (Py_SIZE(v) == 0) {
+ if (newsize == 0) {
+ return 0;
+ }
+ *pv = PyString_FromStringAndSize(NULL, newsize);
+ Py_DECREF(v);
+ return (*pv == NULL) ? -1 : 0;
+ }
+ if (Py_REFCNT(v) != 1 || PyString_CHECK_INTERNED(v)) {
+ *pv = 0;
+ Py_DECREF(v);
+ PyErr_BadInternalCall();
+ return -1;
+ }
+ if (newsize == 0) {
+ *pv = PyString_FromStringAndSize(NULL, 0);
+ Py_DECREF(v);
+ return (*pv == NULL) ? -1 : 0;
+ }
/* XXX UNREF/NEWREF interface should be more symmetrical */
_Py_DEC_REFTOTAL;
_Py_ForgetReference(v);