Fix usage og PyUnicode_READY()

This commit is contained in:
Victor Stinner 2011-10-04 20:53:03 +02:00
parent e06e145943
commit e1335c711c
3 changed files with 27 additions and 12 deletions

View file

@ -131,6 +131,10 @@ write_str(stringio *self, PyObject *obj)
return -1; return -1;
assert(PyUnicode_Check(decoded)); assert(PyUnicode_Check(decoded));
if (PyUnicode_READY(decoded)) {
Py_DECREF(decoded);
return -1;
}
len = PyUnicode_GET_LENGTH(decoded); len = PyUnicode_GET_LENGTH(decoded);
assert(len >= 0); assert(len >= 0);

View file

@ -2120,6 +2120,10 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace"); str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace");
if (!str_obj) if (!str_obj)
goto fail; goto fail;
if (PyUnicode_READY(str_obj)) {
Py_DECREF(str_obj);
goto fail;
}
argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj); argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj);
maxchar = Py_MAX(maxchar, argmaxchar); maxchar = Py_MAX(maxchar, argmaxchar);
n += PyUnicode_GET_LENGTH(str_obj); n += PyUnicode_GET_LENGTH(str_obj);
@ -10062,17 +10066,17 @@ PyUnicode_Append(PyObject **p_left, PyObject *right)
goto error; goto error;
} }
if (PyUnicode_READY(left))
goto error;
if (PyUnicode_READY(right))
goto error;
if (PyUnicode_CheckExact(left) && left != unicode_empty if (PyUnicode_CheckExact(left) && left != unicode_empty
&& PyUnicode_CheckExact(right) && right != unicode_empty && PyUnicode_CheckExact(right) && right != unicode_empty
&& unicode_resizable(left) && unicode_resizable(left)
&& (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left)
|| _PyUnicode_WSTR(left) != NULL)) || _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 /* Don't resize for ascii += latin1. Convert ascii to latin1 requires
to change the structure size, but characters are stored just after to change the structure size, but characters are stored just after
the structure, and so it requires to move all charactres which is the structure, and so it requires to move all charactres which is

View file

@ -834,14 +834,21 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'C': {/* unicode char */ case 'C': {/* unicode char */
int *p = va_arg(*p_va, int *); int *p = va_arg(*p_va, int *);
if (PyUnicode_Check(arg) && int kind;
PyUnicode_GET_LENGTH(arg) == 1) { void *data;
int kind = PyUnicode_KIND(arg);
void *data = PyUnicode_DATA(arg); if (!PyUnicode_Check(arg))
*p = PyUnicode_READ(kind, data, 0);
}
else
return converterr("a unicode character", arg, msgbuf, bufsize); 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; break;
} }