summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2011-10-04 18:53:03 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2011-10-04 18:53:03 (GMT)
commite1335c711c555567a9951dd5c1dfde85545445d4 (patch)
treece073dc242b4399ed8bcc67062d7896fb717908d
parente06e145943854d398adfe053cec757e269af0631 (diff)
downloadcpython-e1335c711c555567a9951dd5c1dfde85545445d4.zip
cpython-e1335c711c555567a9951dd5c1dfde85545445d4.tar.gz
cpython-e1335c711c555567a9951dd5c1dfde85545445d4.tar.bz2
Fix usage og PyUnicode_READY()
-rw-r--r--Modules/_io/stringio.c4
-rw-r--r--Objects/unicodeobject.c14
-rw-r--r--Python/getargs.c21
3 files changed, 27 insertions, 12 deletions
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
index c40163f..a4536b1 100644
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -131,6 +131,10 @@ write_str(stringio *self, PyObject *obj)
return -1;
assert(PyUnicode_Check(decoded));
+ if (PyUnicode_READY(decoded)) {
+ Py_DECREF(decoded);
+ return -1;
+ }
len = PyUnicode_GET_LENGTH(decoded);
assert(len >= 0);
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index b628eeb..cd67f60 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -2120,6 +2120,10 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace");
if (!str_obj)
goto fail;
+ if (PyUnicode_READY(str_obj)) {
+ Py_DECREF(str_obj);
+ goto fail;
+ }
argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj);
maxchar = Py_MAX(maxchar, argmaxchar);
n += PyUnicode_GET_LENGTH(str_obj);
@@ -10062,17 +10066,17 @@ PyUnicode_Append(PyObject **p_left, PyObject *right)
goto error;
}
+ if (PyUnicode_READY(left))
+ goto error;
+ if (PyUnicode_READY(right))
+ goto error;
+
if (PyUnicode_CheckExact(left) && left != unicode_empty
&& PyUnicode_CheckExact(right) && right != unicode_empty
&& unicode_resizable(left)
&& (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left)
|| _PyUnicode_WSTR(left) != NULL))
{
- if (PyUnicode_READY(left))
- goto error;
- if (PyUnicode_READY(right))
- goto error;
-
/* Don't resize for ascii += latin1. Convert ascii to latin1 requires
to change the structure size, but characters are stored just after
the structure, and so it requires to move all charactres which is
diff --git a/Python/getargs.c b/Python/getargs.c
index 0e7d9c4..2c2db36 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -834,14 +834,21 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'C': {/* unicode char */
int *p = va_arg(*p_va, int *);
- if (PyUnicode_Check(arg) &&
- PyUnicode_GET_LENGTH(arg) == 1) {
- int kind = PyUnicode_KIND(arg);
- void *data = PyUnicode_DATA(arg);
- *p = PyUnicode_READ(kind, data, 0);
- }
- else
+ int kind;
+ void *data;
+
+ if (!PyUnicode_Check(arg))
+ return converterr("a unicode character", arg, msgbuf, bufsize);
+
+ if (PyUnicode_READY(arg))
+ RETURN_ERR_OCCURRED;
+
+ if (PyUnicode_GET_LENGTH(arg) != 1)
return converterr("a unicode character", arg, msgbuf, bufsize);
+
+ kind = PyUnicode_KIND(arg);
+ data = PyUnicode_DATA(arg);
+ *p = PyUnicode_READ(kind, data, 0);
break;
}