Issue #6697: Check that _PyUnicode_AsString() result is not NULL in typeobject

Type name and slots are already checked for surrogates somewhere else, but it's
better to ensure that the result is not NULL.
This commit is contained in:
Victor Stinner 2010-05-19 01:42:46 +00:00
parent 8699950b04
commit e5f99f398c
1 changed files with 12 additions and 2 deletions

View File

@ -1347,8 +1347,14 @@ consistent method resolution\norder (MRO) for bases");
i = 0; i = 0;
while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) { while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
PyObject *name = class_name(k); PyObject *name = class_name(k);
off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", char *name_str;
name ? _PyUnicode_AsString(name) : "?"); if (name != NULL) {
name_str = _PyUnicode_AsString(name);
if (name_str == NULL)
name_str = "?"
} else
name_str = "?"
off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str);
Py_XDECREF(name); Py_XDECREF(name);
if (--n && (size_t)(off+1) < sizeof(buf)) { if (--n && (size_t)(off+1) < sizeof(buf)) {
buf[off++] = ','; buf[off++] = ',';
@ -2220,6 +2226,10 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
for (i = 0; i < nslots; i++, mp++) { for (i = 0; i < nslots; i++, mp++) {
mp->name = _PyUnicode_AsString( mp->name = _PyUnicode_AsString(
PyTuple_GET_ITEM(slots, i)); PyTuple_GET_ITEM(slots, i));
if (mp->name == NULL) {
Py_DECREF(type);
return NULL;
}
mp->type = T_OBJECT_EX; mp->type = T_OBJECT_EX;
mp->offset = slotoffset; mp->offset = slotoffset;