--- /dev/null
+Such C API functions as ``PyErr_SetString()``, ``PyErr_Format()``,
+``PyErr_SetFromErrnoWithFilename()`` and many others no longer crash or
+ignore errors if it failed to format the error message or decode the
+filename. Instead, they keep a corresponding error.
const char *string)
{
PyObject *value = PyUnicode_FromString(string);
- _PyErr_SetObject(tstate, exception, value);
- Py_XDECREF(value);
+ if (value != NULL) {
+ _PyErr_SetObject(tstate, exception, value);
+ Py_DECREF(value);
+ }
}
void
PyObject *
PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
{
- PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
+ PyObject *name = NULL;
+ if (filename) {
+ name = PyUnicode_DecodeFSDefault(filename);
+ if (name == NULL) {
+ return NULL;
+ }
+ }
PyObject *result = PyErr_SetFromErrnoWithFilenameObjects(exc, name, NULL);
Py_XDECREF(name);
return result;
int ierr,
const char *filename)
{
- PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
+ PyObject *name = NULL;
+ if (filename) {
+ name = PyUnicode_DecodeFSDefault(filename);
+ if (name == NULL) {
+ return NULL;
+ }
+ }
PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObjects(exc,
ierr,
name,
int ierr,
const char *filename)
{
- PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
+ PyObject *name = NULL;
+ if (filename) {
+ name = PyUnicode_DecodeFSDefault(filename);
+ if (name == NULL) {
+ return NULL;
+ }
+ }
PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObjects(
PyExc_OSError,
ierr, name, NULL);
_PyErr_Clear(tstate);
string = PyUnicode_FromFormatV(format, vargs);
-
- _PyErr_SetObject(tstate, exception, string);
- Py_XDECREF(string);
+ if (string != NULL) {
+ _PyErr_SetObject(tstate, exception, string);
+ Py_DECREF(string);
+ }
return NULL;
}