Commit 36025478 authored by Victor Stinner's avatar Victor Stinner

(Merge 3.3) Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character

outside the range U+0000-U+10ffff.
parents c1903898 d21b58c0
...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character outside
the range U+0000-U+10ffff.
- Issue #17275: Corrected class name in init error messages of the C version of - Issue #17275: Corrected class name in init error messages of the C version of
BufferedWriter and BufferedRandom. BufferedWriter and BufferedRandom.
......
...@@ -241,7 +241,7 @@ static int unicode_modifiable(PyObject *unicode); ...@@ -241,7 +241,7 @@ static int unicode_modifiable(PyObject *unicode);
static PyObject * static PyObject *
_PyUnicode_FromUCS1(const unsigned char *s, Py_ssize_t size); _PyUnicode_FromUCS1(const Py_UCS1 *s, Py_ssize_t size);
static PyObject * static PyObject *
_PyUnicode_FromUCS2(const Py_UCS2 *s, Py_ssize_t size); _PyUnicode_FromUCS2(const Py_UCS2 *s, Py_ssize_t size);
static PyObject * static PyObject *
...@@ -432,7 +432,7 @@ unicode_result_wchar(PyObject *unicode) ...@@ -432,7 +432,7 @@ unicode_result_wchar(PyObject *unicode)
if (len == 1) { if (len == 1) {
wchar_t ch = _PyUnicode_WSTR(unicode)[0]; wchar_t ch = _PyUnicode_WSTR(unicode)[0];
if (ch < 256) { if ((Py_UCS4)ch < 256) {
PyObject *latin1_char = get_latin1_char((unsigned char)ch); PyObject *latin1_char = get_latin1_char((unsigned char)ch);
Py_DECREF(unicode); Py_DECREF(unicode);
return latin1_char; return latin1_char;
...@@ -1757,7 +1757,7 @@ PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) ...@@ -1757,7 +1757,7 @@ PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
/* Single character Unicode objects in the Latin-1 range are /* Single character Unicode objects in the Latin-1 range are
shared when using this constructor */ shared when using this constructor */
if (size == 1 && *u < 256) if (size == 1 && (Py_UCS4)*u < 256)
return get_latin1_char((unsigned char)*u); return get_latin1_char((unsigned char)*u);
/* If not empty and not single character, copy the Unicode data /* If not empty and not single character, copy the Unicode data
...@@ -1865,7 +1865,7 @@ _PyUnicode_FromASCII(const char *buffer, Py_ssize_t size) ...@@ -1865,7 +1865,7 @@ _PyUnicode_FromASCII(const char *buffer, Py_ssize_t size)
PyObject *unicode; PyObject *unicode;
if (size == 1) { if (size == 1) {
#ifdef Py_DEBUG #ifdef Py_DEBUG
assert(s[0] < 128); assert((unsigned char)s[0] < 128);
#endif #endif
return get_latin1_char(s[0]); return get_latin1_char(s[0]);
} }
...@@ -1907,7 +1907,7 @@ align_maxchar(Py_UCS4 maxchar) ...@@ -1907,7 +1907,7 @@ align_maxchar(Py_UCS4 maxchar)
} }
static PyObject* static PyObject*
_PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size) _PyUnicode_FromUCS1(const Py_UCS1* u, Py_ssize_t size)
{ {
PyObject *res; PyObject *res;
unsigned char max_char; unsigned char max_char;
...@@ -2792,8 +2792,8 @@ PyUnicode_FromOrdinal(int ordinal) ...@@ -2792,8 +2792,8 @@ PyUnicode_FromOrdinal(int ordinal)
return NULL; return NULL;
} }
if (ordinal < 256) if ((Py_UCS4)ordinal < 256)
return get_latin1_char(ordinal); return get_latin1_char((unsigned char)ordinal);
v = PyUnicode_New(1, ordinal); v = PyUnicode_New(1, ordinal);
if (v == NULL) if (v == NULL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment