mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
[3.11] gh-105375: Improve PyErr_WarnExplicit() error handling (GH-105610) (#105660)
Bail on first error to prevent exceptions from possibly being
overwritten.
(cherry picked from commit 567d6ae8e7
)
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
This commit is contained in:
parent
87e493b11a
commit
05c73e1cd8
2 changed files with 18 additions and 12 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a bug in :c:func:`PyErr_WarnExplicit` where an exception could end up
|
||||||
|
being overwritten if the API failed internally.
|
|
@ -1231,25 +1231,29 @@ PyErr_WarnExplicit(PyObject *category, const char *text,
|
||||||
const char *module_str, PyObject *registry)
|
const char *module_str, PyObject *registry)
|
||||||
{
|
{
|
||||||
PyObject *message = PyUnicode_FromString(text);
|
PyObject *message = PyUnicode_FromString(text);
|
||||||
|
if (message == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
|
PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
|
||||||
|
if (filename == NULL) {
|
||||||
|
Py_DECREF(message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
PyObject *module = NULL;
|
PyObject *module = NULL;
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
if (message == NULL || filename == NULL)
|
|
||||||
goto exit;
|
|
||||||
if (module_str != NULL) {
|
if (module_str != NULL) {
|
||||||
module = PyUnicode_FromString(module_str);
|
module = PyUnicode_FromString(module_str);
|
||||||
if (module == NULL)
|
if (module == NULL) {
|
||||||
goto exit;
|
Py_DECREF(filename);
|
||||||
|
Py_DECREF(message);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = PyErr_WarnExplicitObject(category, message, filename, lineno,
|
int ret = PyErr_WarnExplicitObject(category, message, filename, lineno,
|
||||||
module, registry);
|
module, registry);
|
||||||
|
|
||||||
exit:
|
|
||||||
Py_XDECREF(message);
|
|
||||||
Py_XDECREF(module);
|
Py_XDECREF(module);
|
||||||
Py_XDECREF(filename);
|
Py_DECREF(filename);
|
||||||
|
Py_DECREF(message);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue