summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-06-24 16:45:27 (GMT)
committerGitHub <noreply@github.com>2020-06-24 16:45:27 (GMT)
commit7329c8c7a263015c5dae04fc9fb7ec9d58508c76 (patch)
tree78a7d75f1adece0b96ad80feeabc202c2777d8f5
parent6c56356109616ea1292aafa48d30536279ec0937 (diff)
downloadcpython-7329c8c7a263015c5dae04fc9fb7ec9d58508c76.zip
cpython-7329c8c7a263015c5dae04fc9fb7ec9d58508c76.tar.gz
cpython-7329c8c7a263015c5dae04fc9fb7ec9d58508c76.tar.bz2
bpo-41094: Fix decoding errors with audit when open files. (GH-21095)
(cherry picked from commit 6c6810d98979add7a89391c3c38990d0859f7a29) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
-rw-r--r--Lib/test/test_embed.py4
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst2
-rw-r--r--Modules/_ctypes/callproc.c7
-rw-r--r--Modules/main.c9
-rw-r--r--Python/fileutils.c23
5 files changed, 33 insertions, 12 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index b7b7058..e4fed51 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -1353,7 +1353,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
returncode=1)
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:
print("import sys", file=f)
print("sys.__interactivehook__ = lambda: None", file=f)
@@ -1366,7 +1366,7 @@ class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
os.unlink(startup)
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:
print("pass", file=f)
try:
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst
new file mode 100644
index 0000000..6dd45e2
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-23-23-26-42.bpo-41094.zEIJse.rst
@@ -0,0 +1,2 @@
+Fix decoding errors with audit when open files with non-ASCII names on non-UTF-8
+locale.
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index af6e1e8..6030cc3 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1415,15 +1415,12 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
if (name != Py_None) {
if (PyUnicode_FSConverter(name, &name2) == 0)
return NULL;
- if (PyBytes_Check(name2))
- name_str = PyBytes_AS_STRING(name2);
- else
- name_str = PyByteArray_AS_STRING(name2);
+ name_str = PyBytes_AS_STRING(name2);
} else {
name_str = NULL;
name2 = NULL;
}
- if (PySys_Audit("ctypes.dlopen", "s", name_str) < 0) {
+ if (PySys_Audit("ctypes.dlopen", "O", name) < 0) {
return NULL;
}
handle = ctypes_dlopen(name_str, mode);
diff --git a/Modules/main.c b/Modules/main.c
index bc3a2ed..8e3b35c 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -379,13 +379,20 @@ pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode)
if (startup == NULL) {
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);
}
+ 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");
if (fp == NULL) {
int save_errno = errno;
+ PyErr_Clear();
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
errno = save_errno;
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)