diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-05-19 00:03:09 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-05-19 00:03:09 (GMT) |
commit | f3f22a278d146d54bddc14042573737c3440cf84 (patch) | |
tree | 12956d8cf1c871a16824267571cdd59cbea05fa4 /Objects | |
parent | 82e02b587620354de092fbd1ff364f1b5d97f330 (diff) | |
download | cpython-f3f22a278d146d54bddc14042573737c3440cf84.zip cpython-f3f22a278d146d54bddc14042573737c3440cf84.tar.gz cpython-f3f22a278d146d54bddc14042573737c3440cf84.tar.bz2 |
Issue #6697: Fix a crash if a module attribute name contains a surrogate
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/moduleobject.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 9ef7339..6c6eac1 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -263,10 +263,15 @@ _PyModule_Clear(PyObject *m) pos = 0; while (PyDict_Next(d, &pos, &key, &value)) { if (value != Py_None && PyUnicode_Check(key)) { - const char *s = _PyUnicode_AsString(key); - if (s[0] == '_' && s[1] != '_') { - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# clear[1] %s\n", s); + Py_UNICODE *u = PyUnicode_AS_UNICODE(key); + if (u[0] == '_' && u[1] != '_') { + if (Py_VerboseFlag > 1) { + const char *s = _PyUnicode_AsString(key); + if (s != NULL) + PySys_WriteStderr("# clear[1] %s\n", s); + else + PyErr_Clear(); + } PyDict_SetItem(d, key, Py_None); } } @@ -276,10 +281,17 @@ _PyModule_Clear(PyObject *m) pos = 0; while (PyDict_Next(d, &pos, &key, &value)) { if (value != Py_None && PyUnicode_Check(key)) { - const char *s = _PyUnicode_AsString(key); - if (s[0] != '_' || strcmp(s, "__builtins__") != 0) { - if (Py_VerboseFlag > 1) - PySys_WriteStderr("# clear[2] %s\n", s); + Py_UNICODE *u = PyUnicode_AS_UNICODE(key); + if (u[0] != '_' + || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0) + { + if (Py_VerboseFlag > 1) { + const char *s = _PyUnicode_AsString(key); + if (s != NULL) + PySys_WriteStderr("# clear[2] %s\n", s); + else + PyErr_Clear(); + } PyDict_SetItem(d, key, Py_None); } } |