Check for PyUnicode_CopyCharacters() failure
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index bcf26d8..f9974da 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1784,9 +1784,10 @@
(void) va_arg(vargs, char *);
size = PyUnicode_GET_LENGTH(*callresult);
assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
- PyUnicode_CopyCharacters((PyObject*)string, i,
- *callresult, 0,
- size);
+ if (PyUnicode_CopyCharacters((PyObject*)string, i,
+ *callresult, 0,
+ size) < 0)
+ goto fail;
i += size;
/* We're done with the unicode()/repr() => forget it */
Py_DECREF(*callresult);
@@ -1800,9 +1801,10 @@
Py_ssize_t size;
assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
size = PyUnicode_GET_LENGTH(obj);
- PyUnicode_CopyCharacters((PyObject*)string, i,
- obj, 0,
- size);
+ if (PyUnicode_CopyCharacters((PyObject*)string, i,
+ obj, 0,
+ size) < 0)
+ goto fail;
i += size;
break;
}
@@ -1814,17 +1816,19 @@
if (obj) {
size = PyUnicode_GET_LENGTH(obj);
assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string));
- PyUnicode_CopyCharacters((PyObject*)string, i,
- obj, 0,
- size);
+ if (PyUnicode_CopyCharacters((PyObject*)string, i,
+ obj, 0,
+ size) < 0)
+ goto fail;
i += size;
} else {
size = PyUnicode_GET_LENGTH(*callresult);
assert(PyUnicode_KIND(*callresult) <=
PyUnicode_KIND(string));
- PyUnicode_CopyCharacters((PyObject*)string, i,
- *callresult,
- 0, size);
+ if (PyUnicode_CopyCharacters((PyObject*)string, i,
+ *callresult,
+ 0, size) < 0)
+ goto fail;
i += size;
Py_DECREF(*callresult);
}
@@ -1838,9 +1842,10 @@
/* unused, since we already have the result */
(void) va_arg(vargs, PyObject *);
assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string));
- PyUnicode_CopyCharacters((PyObject*)string, i,
- *callresult, 0,
- PyUnicode_GET_LENGTH(*callresult));
+ if (PyUnicode_CopyCharacters((PyObject*)string, i,
+ *callresult, 0,
+ PyUnicode_GET_LENGTH(*callresult)) < 0)
+ goto fail;
i += PyUnicode_GET_LENGTH(*callresult);
/* We're done with the unicode()/repr() => forget it */
Py_DECREF(*callresult);
@@ -8141,8 +8146,7 @@
else {
/* In case the maximum character changed, we need to
convert the string to the new category. */
- PyObject *v = PyUnicode_New(
- PyUnicode_GET_LENGTH(self), maxchar_new);
+ PyObject *v = PyUnicode_New(PyUnicode_GET_LENGTH(self), maxchar_new);
if (v == NULL) {
Py_DECREF(u);
return NULL;
@@ -8151,12 +8155,25 @@
/* If the maxchar increased so that the kind changed, not all
characters are representable anymore and we need to fix the
string again. This only happens in very few cases. */
- PyUnicode_CopyCharacters(v, 0, (PyObject*)self, 0, PyUnicode_GET_LENGTH(self));
+ if (PyUnicode_CopyCharacters(v, 0,
+ (PyObject*)self, 0,
+ PyUnicode_GET_LENGTH(self)) < 0)
+ {
+ Py_DECREF(u);
+ return NULL;
+ }
maxchar_old = fixfct((PyUnicodeObject*)v);
assert(maxchar_old > 0 && maxchar_old <= maxchar_new);
}
- else
- PyUnicode_CopyCharacters(v, 0, u, 0, PyUnicode_GET_LENGTH(self));
+ else {
+ if (PyUnicode_CopyCharacters(v, 0,
+ u, 0,
+ PyUnicode_GET_LENGTH(self)) < 0)
+ {
+ Py_DECREF(u);
+ return NULL;
+ }
+ }
Py_DECREF(u);
return v;
@@ -8455,12 +8472,14 @@
itemlen = PyUnicode_GET_LENGTH(item);
/* Copy item, and maybe the separator. */
if (i) {
- PyUnicode_CopyCharacters(res, res_offset,
- sep, 0, seplen);
+ if (PyUnicode_CopyCharacters(res, res_offset,
+ sep, 0, seplen) < 0)
+ goto onError;
res_offset += seplen;
}
- PyUnicode_CopyCharacters(res, res_offset,
- item, 0, itemlen);
+ if (PyUnicode_CopyCharacters(res, res_offset,
+ item, 0, itemlen) < 0)
+ goto onError;
res_offset += itemlen;
}
assert(res_offset == PyUnicode_GET_LENGTH(res));
@@ -8508,6 +8527,8 @@
{
PyObject *u;
Py_UCS4 maxchar;
+ int kind;
+ void *data;
if (left < 0)
left = 0;
@@ -8528,14 +8549,21 @@
if (fill > maxchar)
maxchar = fill;
u = PyUnicode_New(left + _PyUnicode_LENGTH(self) + right, maxchar);
- if (u) {
- int kind = PyUnicode_KIND(u);
- void *data = PyUnicode_DATA(u);
- if (left)
- FILL(kind, data, fill, 0, left);
- if (right)
- FILL(kind, data, fill, left + _PyUnicode_LENGTH(self), right);
- PyUnicode_CopyCharacters(u, left, (PyObject*)self, 0, _PyUnicode_LENGTH(self));
+ if (!u)
+ return NULL;
+
+ kind = PyUnicode_KIND(u);
+ data = PyUnicode_DATA(u);
+ if (left)
+ FILL(kind, data, fill, 0, left);
+ if (right)
+ FILL(kind, data, fill, left + _PyUnicode_LENGTH(self), right);
+ if (PyUnicode_CopyCharacters(u, left,
+ (PyObject*)self, 0,
+ _PyUnicode_LENGTH(self)) < 0)
+ {
+ Py_DECREF(u);
+ return NULL;
}
return (PyUnicodeObject*)u;
@@ -8821,8 +8849,12 @@
u = PyUnicode_New(slen, maxchar);
if (!u)
goto error;
- PyUnicode_CopyCharacters(u, 0,
- (PyObject*)self, 0, slen);
+ if (PyUnicode_CopyCharacters(u, 0,
+ (PyObject*)self, 0, slen) < 0)
+ {
+ Py_DECREF(u);
+ return NULL;
+ }
rkind = PyUnicode_KIND(u);
for (i = 0; i < PyUnicode_GET_LENGTH(u); i++)
if (PyUnicode_READ(rkind, PyUnicode_DATA(u), i) == u1) {
@@ -9437,8 +9469,7 @@
goto onError;
maxchar = PyUnicode_MAX_CHAR_VALUE(u);
- if (PyUnicode_MAX_CHAR_VALUE(v) > maxchar)
- maxchar = PyUnicode_MAX_CHAR_VALUE(v);
+ maxchar = PY_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(v));
/* Concat the two Unicode strings */
w = PyUnicode_New(
@@ -9446,9 +9477,12 @@
maxchar);
if (w == NULL)
goto onError;
- PyUnicode_CopyCharacters(w, 0, u, 0, PyUnicode_GET_LENGTH(u));
- PyUnicode_CopyCharacters(w, PyUnicode_GET_LENGTH(u), v, 0,
- PyUnicode_GET_LENGTH(v));
+ if (PyUnicode_CopyCharacters(w, 0, u, 0, PyUnicode_GET_LENGTH(u)) < 0)
+ goto onError;
+ if (PyUnicode_CopyCharacters(w, PyUnicode_GET_LENGTH(u),
+ v, 0,
+ PyUnicode_GET_LENGTH(v)) < 0)
+ goto onError;
Py_DECREF(u);
Py_DECREF(v);
return w;
@@ -10396,8 +10430,12 @@
unicode = PyUnicode_New(len, maxchar);
if (unicode == NULL)
return NULL;
- PyUnicode_CopyCharacters(unicode, 0,
- (PyObject*)self, start, len);
+ if (PyUnicode_CopyCharacters(unicode, 0,
+ (PyObject*)self, start, len) < 0)
+ {
+ Py_DECREF(unicode);
+ return NULL;
+ }
return unicode;
}