Issue #13441: _PyUnicode_CheckConsistency() dumps the string if the maximum

character is bigger than U+10FFFF and locale.localeconv() dumps the string
before decoding it.

Temporary hack to debug the issue #13441.
This commit is contained in:
Victor Stinner 2011-11-21 14:31:41 +01:00
parent a996f1e1a0
commit da29cc36aa
2 changed files with 39 additions and 0 deletions

View File

@ -79,6 +79,23 @@ str2uni(const char* s)
return res2; return res2;
} }
#ifdef Py_DEBUG
void
dump_str(const char *name, const char *value)
{
size_t i, len = strlen(value);
printf("Decode localeconv() %s: {", name);
for (i=0; i<len; i++) {
unsigned char ch = value[i];
if (i)
printf(" 0x%02x", ch);
else
printf("0x%02x", ch);
}
printf("} (len=%u)\n", len);
}
#endif
/* support functions for formatting floating point numbers */ /* support functions for formatting floating point numbers */
PyDoc_STRVAR(setlocale__doc__, PyDoc_STRVAR(setlocale__doc__,
@ -184,11 +201,20 @@ PyLocale_localeconv(PyObject* self)
/* hopefully, the localeconv result survives the C library calls /* hopefully, the localeconv result survives the C library calls
involved herein */ involved herein */
#ifdef Py_DEBUG
#define RESULT_STRING(s)\
dump_str(#s, l->s); \
x = str2uni(l->s); \
if (!x) goto failed;\
PyDict_SetItemString(result, #s, x);\
Py_XDECREF(x)
#else
#define RESULT_STRING(s)\ #define RESULT_STRING(s)\
x = str2uni(l->s); \ x = str2uni(l->s); \
if (!x) goto failed;\ if (!x) goto failed;\
PyDict_SetItemString(result, #s, x);\ PyDict_SetItemString(result, #s, x);\
Py_XDECREF(x) Py_XDECREF(x)
#endif
#define RESULT_INT(i)\ #define RESULT_INT(i)\
x = PyLong_FromLong(l->i);\ x = PyLong_FromLong(l->i);\

View File

@ -391,6 +391,19 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
if (ch > maxchar) if (ch > maxchar)
maxchar = ch; maxchar = ch;
} }
if (maxchar > 0x10FFFF) {
printf("Invalid Unicode string! {");
for (i=0; i < ascii->length; i++)
{
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (i)
printf(", U+%04x", ch);
else
printf("U+%04x", ch);
}
printf("} (len=%u)\n", ascii->length);
abort();
}
if (kind == PyUnicode_1BYTE_KIND) { if (kind == PyUnicode_1BYTE_KIND) {
if (ascii->state.ascii == 0) { if (ascii->state.ascii == 0) {
assert(maxchar >= 128); assert(maxchar >= 128);