Issue #28715: Added error checks for PyUnicode_AsUTF8().

This commit is contained in:
Serhiy Storchaka 2016-11-20 08:47:21 +02:00
parent 93ff8725b3
commit 144f77a981
5 changed files with 20 additions and 10 deletions

View File

@ -734,8 +734,7 @@ PyCStructType_setattro(PyObject *self, PyObject *key, PyObject *value)
return -1; return -1;
if (value && PyUnicode_Check(key) && if (value && PyUnicode_Check(key) &&
/* XXX struni _PyUnicode_AsString can fail (also in other places)! */ _PyUnicode_EqualToASCIIString(key, "_fields_"))
0 == strcmp(_PyUnicode_AsString(key), "_fields_"))
return PyCStructUnionType_update_stgdict(self, value, 1); return PyCStructUnionType_update_stgdict(self, value, 1);
return 0; return 0;
} }
@ -749,7 +748,7 @@ UnionType_setattro(PyObject *self, PyObject *key, PyObject *value)
return -1; return -1;
if (PyUnicode_Check(key) && if (PyUnicode_Check(key) &&
0 == strcmp(_PyUnicode_AsString(key), "_fields_")) _PyUnicode_EqualToASCIIString(key, "_fields_"))
return PyCStructUnionType_update_stgdict(self, value, 0); return PyCStructUnionType_update_stgdict(self, value, 0);
return 0; return 0;
} }

View File

@ -1670,7 +1670,9 @@ POINTER(PyObject *self, PyObject *cls)
return result; return result;
} }
if (PyUnicode_CheckExact(cls)) { if (PyUnicode_CheckExact(cls)) {
char *name = _PyUnicode_AsString(cls); const char *name = PyUnicode_AsUTF8(cls);
if (name == NULL)
return NULL;
buf = PyMem_Malloc(strlen(name) + 3 + 1); buf = PyMem_Malloc(strlen(name) + 3 + 1);
if (buf == NULL) if (buf == NULL)
return PyErr_NoMemory(); return PyErr_NoMemory();

View File

@ -925,11 +925,14 @@ static PyMethodDef oss_mixer_methods[] = {
static PyObject * static PyObject *
oss_getattro(oss_audio_t *self, PyObject *nameobj) oss_getattro(oss_audio_t *self, PyObject *nameobj)
{ {
char *name = ""; const char *name = "";
PyObject * rval = NULL; PyObject * rval = NULL;
if (PyUnicode_Check(nameobj)) if (PyUnicode_Check(nameobj)) {
name = _PyUnicode_AsString(nameobj); name = PyUnicode_AsUTF8(nameobj);
if (name == NULL)
return NULL;
}
if (strcmp(name, "closed") == 0) { if (strcmp(name, "closed") == 0) {
rval = (self->fd == -1) ? Py_True : Py_False; rval = (self->fd == -1) ? Py_True : Py_False;

View File

@ -2024,16 +2024,18 @@ ast_for_atom(struct compiling *c, const node *n)
errtype = "value error"; errtype = "value error";
if (errtype) { if (errtype) {
char buf[128]; char buf[128];
const char *s = NULL;
PyObject *type, *value, *tback, *errstr; PyObject *type, *value, *tback, *errstr;
PyErr_Fetch(&type, &value, &tback); PyErr_Fetch(&type, &value, &tback);
errstr = PyObject_Str(value); errstr = PyObject_Str(value);
if (errstr) { if (errstr)
char *s = _PyUnicode_AsString(errstr); s = PyUnicode_AsUTF8(errstr);
if (s) {
PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s); PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
Py_DECREF(errstr);
} else { } else {
PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype); PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
} }
Py_XDECREF(errstr);
ast_error(c, n, buf); ast_error(c, n, buf);
Py_DECREF(type); Py_DECREF(type);
Py_XDECREF(value); Py_XDECREF(value);

View File

@ -147,6 +147,10 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
/* Package context is needed for single-phase init */ /* Package context is needed for single-phase init */
oldcontext = _Py_PackageContext; oldcontext = _Py_PackageContext;
_Py_PackageContext = PyUnicode_AsUTF8(name_unicode); _Py_PackageContext = PyUnicode_AsUTF8(name_unicode);
if (_Py_PackageContext == NULL) {
_Py_PackageContext = oldcontext;
goto error;
}
m = p0(); m = p0();
_Py_PackageContext = oldcontext; _Py_PackageContext = oldcontext;