bpo-41094: Fix decoding errors with audit when open files. (GH-21095)

(cherry picked from commit 6c6810d989)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2020-06-24 09:45:27 -07:00 committed by GitHub
parent 6c56356109
commit 7329c8c7a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 14 deletions

View file

@ -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)
return -1;
if (fd < 0) {
PyErr_SetFromErrnoWithFilename(PyExc_OSError, pathname);
if (async_err) {
Py_DECREF(pathname_obj);
return -1;
}
if (fd < 0) {
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)