summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-05-19 00:03:09 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-05-19 00:03:09 (GMT)
commitf3f22a278d146d54bddc14042573737c3440cf84 (patch)
tree12956d8cf1c871a16824267571cdd59cbea05fa4 /Objects
parent82e02b587620354de092fbd1ff364f1b5d97f330 (diff)
downloadcpython-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.c28
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);
}
}