Issue #6697: _lsprof: normalizeUserObj() doesn't encode/decode (UTF-8) the

module name anymore, only work on unicode strings. Therefore it doesn't
truncate module names with embedded NUL characters, or fail if the module name
contains surrogate characters (UTF-8 encoder fails on a surrogate character).

Patch written by Alexander Belopolsky.
This commit is contained in:
Victor Stinner 2011-06-20 14:59:53 +02:00
parent 99563b1df8
commit 7edb5dfcbc
1 changed files with 19 additions and 26 deletions

View File

@ -176,36 +176,29 @@ normalizeUserObj(PyObject *obj)
if (fn->m_self == NULL) {
/* built-in function: look up the module name */
PyObject *mod = fn->m_module;
const char *modname;
if (mod && PyUnicode_Check(mod)) {
/* XXX: The following will truncate module names with embedded
* null-characters. It is unlikely that this can happen in
* practice and the concequences are not serious enough to
* introduce extra checks here.
*/
modname = _PyUnicode_AsString(mod);
if (modname == NULL) {
modname = "<encoding error>";
PyErr_Clear();
PyObject *modname = NULL;
if (mod != NULL) {
if (PyUnicode_Check(mod)) {
modname = mod;
Py_INCREF(modname);
}
else if (PyModule_Check(mod)) {
modname = PyModule_GetNameObject(mod);
if (modname == NULL)
PyErr_Clear();
}
}
else if (mod && PyModule_Check(mod)) {
modname = PyModule_GetName(mod);
if (modname == NULL) {
PyErr_Clear();
modname = "builtins";
if (modname != NULL) {
if (PyUnicode_CompareWithASCIIString(modname, "builtins") != 0) {
PyObject *result;
result = PyUnicode_FromFormat("<%U.%s>", modname,
fn->m_ml->ml_name);
Py_DECREF(modname);
return result;
}
Py_DECREF(modname);
}
else {
modname = "builtins";
}
if (strcmp(modname, "builtins") != 0)
return PyUnicode_FromFormat("<%s.%s>",
modname,
fn->m_ml->ml_name);
else
return PyUnicode_FromFormat("<%s>",
fn->m_ml->ml_name);
return PyUnicode_FromFormat("<%s>", fn->m_ml->ml_name);
}
else {
/* built-in method: try to return