summaryrefslogtreecommitdiffstats
path: root/Python/errors.c
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-08-20 21:07:24 (GMT)
committerGitHub <noreply@github.com>2023-08-20 21:07:24 (GMT)
commit97d67e9dabb3d66525a46dc4d802195ced24e6ef (patch)
tree4501b9e9e344524eb8e6f05e43cc0e5bdf897860 /Python/errors.c
parent7f5a741a28a7b87c9cdb1db87fcb3f0b9ed8ac2a (diff)
downloadcpython-97d67e9dabb3d66525a46dc4d802195ced24e6ef.zip
cpython-97d67e9dabb3d66525a46dc4d802195ced24e6ef.tar.gz
cpython-97d67e9dabb3d66525a46dc4d802195ced24e6ef.tar.bz2
[3.12] gh-107915: Handle errors in C API functions PyErr_Set*() and PyErr_Format() (GH-107918) (#108134)
* gh-107915: Handle errors in C API functions PyErr_Set*() and PyErr_Format() (GH-107918) 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. (cherry picked from commit 633ea217a85f6b6ba5bdbc73094254d5811b3485) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> * Define PY_SSIZE_T_CLEAN. --------- Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Python/errors.c')
-rw-r--r--Python/errors.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/Python/errors.c b/Python/errors.c
index a8000ac..f1d3007 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -292,8 +292,10 @@ _PyErr_SetString(PyThreadState *tstate, PyObject *exception,
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
@@ -915,7 +917,13 @@ PyErr_SetFromErrnoWithFilenameObjects(PyObject *exc, PyObject *filenameObject, P
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;
@@ -1012,7 +1020,13 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilename(
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,
@@ -1036,7 +1050,13 @@ PyObject *PyErr_SetFromWindowsErrWithFilename(
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);
@@ -1161,9 +1181,10 @@ _PyErr_FormatV(PyThreadState *tstate, PyObject *exception,
_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;
}