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:
parent
fb4a624105
commit
1813d318fd
|
@ -1309,7 +1309,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
self.run_embedded_interpreter("test_audit_run_file", timeout=3, returncode=1)
|
self.run_embedded_interpreter("test_audit_run_file", timeout=3, returncode=1)
|
||||||
|
|
||||||
def test_audit_run_interactivehook(self):
|
def test_audit_run_interactivehook(self):
|
||||||
startup = os.path.join(self.oldcwd, support.TESTFN) + ".py"
|
startup = os.path.join(self.oldcwd, support.TESTFN) + (support.TESTFN or '') + ".py"
|
||||||
with open(startup, "w", encoding="utf-8") as f:
|
with open(startup, "w", encoding="utf-8") as f:
|
||||||
print("import sys", file=f)
|
print("import sys", file=f)
|
||||||
print("sys.__interactivehook__ = lambda: None", file=f)
|
print("sys.__interactivehook__ = lambda: None", file=f)
|
||||||
|
@ -1321,7 +1321,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
os.unlink(startup)
|
os.unlink(startup)
|
||||||
|
|
||||||
def test_audit_run_startup(self):
|
def test_audit_run_startup(self):
|
||||||
startup = os.path.join(self.oldcwd, support.TESTFN) + ".py"
|
startup = os.path.join(self.oldcwd, support.TESTFN) + (support.TESTFN or '') + ".py"
|
||||||
with open(startup, "w", encoding="utf-8") as f:
|
with open(startup, "w", encoding="utf-8") as f:
|
||||||
print("pass", file=f)
|
print("pass", file=f)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix decoding errors with audit when open files with non-ASCII names on non-UTF-8
|
||||||
|
locale.
|
|
@ -1416,15 +1416,12 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
|
||||||
if (name != Py_None) {
|
if (name != Py_None) {
|
||||||
if (PyUnicode_FSConverter(name, &name2) == 0)
|
if (PyUnicode_FSConverter(name, &name2) == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (PyBytes_Check(name2))
|
name_str = PyBytes_AS_STRING(name2);
|
||||||
name_str = PyBytes_AS_STRING(name2);
|
|
||||||
else
|
|
||||||
name_str = PyByteArray_AS_STRING(name2);
|
|
||||||
} else {
|
} else {
|
||||||
name_str = NULL;
|
name_str = NULL;
|
||||||
name2 = NULL;
|
name2 = NULL;
|
||||||
}
|
}
|
||||||
if (PySys_Audit("ctypes.dlopen", "s", name_str) < 0) {
|
if (PySys_Audit("ctypes.dlopen", "O", name) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
handle = ctypes_dlopen(name_str, mode);
|
handle = ctypes_dlopen(name_str, mode);
|
||||||
|
|
|
@ -391,13 +391,20 @@ pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode)
|
||||||
if (startup == NULL) {
|
if (startup == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (PySys_Audit("cpython.run_startup", "s", startup) < 0) {
|
PyObject *startup_obj = PyUnicode_DecodeFSDefault(startup);
|
||||||
|
if (startup_obj == NULL) {
|
||||||
return pymain_err_print(exitcode);
|
return pymain_err_print(exitcode);
|
||||||
}
|
}
|
||||||
|
if (PySys_Audit("cpython.run_startup", "O", startup_obj) < 0) {
|
||||||
|
Py_DECREF(startup_obj);
|
||||||
|
return pymain_err_print(exitcode);
|
||||||
|
}
|
||||||
|
Py_DECREF(startup_obj);
|
||||||
|
|
||||||
FILE *fp = _Py_fopen(startup, "r");
|
FILE *fp = _Py_fopen(startup, "r");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
int save_errno = errno;
|
int save_errno = errno;
|
||||||
|
PyErr_Clear();
|
||||||
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
|
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
|
||||||
|
|
||||||
errno = save_errno;
|
errno = save_errno;
|
||||||
|
|
|
@ -1274,7 +1274,12 @@ _Py_open_impl(const char *pathname, int flags, int gil_held)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (gil_held) {
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1284,12 +1289,16 @@ _Py_open_impl(const char *pathname, int flags, int gil_held)
|
||||||
Py_END_ALLOW_THREADS
|
Py_END_ALLOW_THREADS
|
||||||
} while (fd < 0
|
} while (fd < 0
|
||||||
&& errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
&& errno == EINTR && !(async_err = PyErr_CheckSignals()));
|
||||||
if (async_err)
|
if (async_err) {
|
||||||
return -1;
|
Py_DECREF(pathname_obj);
|
||||||
if (fd < 0) {
|
|
||||||
PyErr_SetFromErrnoWithFilename(PyExc_OSError, pathname);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (fd < 0) {
|
||||||
|
PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, pathname_obj, NULL);
|
||||||
|
Py_DECREF(pathname_obj);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
Py_DECREF(pathname_obj);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fd = open(pathname, flags);
|
fd = open(pathname, flags);
|
||||||
|
@ -1385,9 +1394,15 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode)
|
||||||
FILE*
|
FILE*
|
||||||
_Py_fopen(const char *pathname, const char *mode)
|
_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;
|
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);
|
FILE *f = fopen(pathname, mode);
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
|
|
Loading…
Reference in New Issue