diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2020-06-24 05:46:05 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-24 05:46:05 (GMT) |
commit | 6c6810d98979add7a89391c3c38990d0859f7a29 (patch) | |
tree | 3ce70553118d4e9276cd84f8dc4c2850257c24af /Python | |
parent | bf2e515fa43406d4bd9c4c53ecc9364034d8f9f6 (diff) | |
download | cpython-6c6810d98979add7a89391c3c38990d0859f7a29.zip cpython-6c6810d98979add7a89391c3c38990d0859f7a29.tar.gz cpython-6c6810d98979add7a89391c3c38990d0859f7a29.tar.bz2 |
bpo-41094: Fix decoding errors with audit when open files. (GH-21095)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/fileutils.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/Python/fileutils.c b/Python/fileutils.c index 22e72bd..2c86828 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1274,7 +1274,12 @@ _Py_open_impl(const char *pathname, int flags, int gil_held) #endif if (gil_held) { - if (PySys_Audit("open", "sOi", pathname, Py_None, flags) < 0) { + PyObject *pathname_obj = PyUnicode_DecodeFSDefault(pathname); + if (pathname_obj == NULL) { + return -1; + } + if (PySys_Audit("open", "OOi", pathname_obj, Py_None, flags) < 0) { + Py_DECREF(pathname_obj); return -1; } @@ -1284,12 +1289,16 @@ _Py_open_impl(const char *pathname, int flags, int gil_held) Py_END_ALLOW_THREADS } while (fd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals())); - if (async_err) + if (async_err) { + Py_DECREF(pathname_obj); return -1; + } if (fd < 0) { - PyErr_SetFromErrnoWithFilename(PyExc_OSError, pathname); + PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, pathname_obj, NULL); + Py_DECREF(pathname_obj); return -1; } + Py_DECREF(pathname_obj); } else { fd = open(pathname, flags); @@ -1385,9 +1394,15 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode) FILE* _Py_fopen(const char *pathname, const char *mode) { - if (PySys_Audit("open", "ssi", pathname, mode, 0) < 0) { + PyObject *pathname_obj = PyUnicode_DecodeFSDefault(pathname); + if (pathname_obj == NULL) { + return NULL; + } + if (PySys_Audit("open", "Osi", pathname_obj, mode, 0) < 0) { + Py_DECREF(pathname_obj); return NULL; } + Py_DECREF(pathname_obj); FILE *f = fopen(pathname, mode); if (f == NULL) |