From e4110dc11f9e90d3a7fcd8f0a5f9ded344f433c6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 1 Jan 2013 23:05:55 +0100 Subject: [PATCH] Issue #9644: Fix the encoding used by os.statvfs(): use the filesystem encoding with the surrogateescape error handler, instead of UTF-8 in strict mode. --- Lib/test/test_os.py | 9 +++++++++ Misc/NEWS | 4 ++++ Modules/posixmodule.c | 10 +++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index 5b67da17baa..bd799b2040d 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1057,6 +1057,15 @@ if sys.platform != 'win32': f = open(os.path.join(self.dir, fn), 'rb') f.close() + @unittest.skipUnless(hasattr(os, 'statvfs'), + "need os.statvfs()") + def test_statvfs(self): + # issue #9645 + for fn in self.unicodefn: + # should not fail with file not found error + fullname = os.path.join(self.dir, fn) + os.statvfs(fullname) + def test_stat(self): for fn in self.unicodefn: os.stat(os.path.join(self.dir, fn)) diff --git a/Misc/NEWS b/Misc/NEWS index b9b14a79ba6..45c2e321256 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -189,6 +189,10 @@ Core and Builtins Library ------- +- Issue #9644: Fix the encoding used by os.statvfs(): use the filesystem + encoding with the surrogateescape error handler, instead of UTF-8 in strict + mode. + - Issue #16819: IDLE method completion now correctly works for bytes literals. - Issue #9586: Redefine SEM_FAILED on MacOSX to keep compiler happy. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0d2919b84e0..e7e530589cf 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6463,18 +6463,22 @@ Perform a statvfs system call on the given path."); static PyObject * posix_statvfs(PyObject *self, PyObject *args) { + PyObject *opath, *result = NULL; char *path; int res; struct statvfs st; - if (!PyArg_ParseTuple(args, "s:statvfs", &path)) + if (!PyArg_ParseTuple(args, "O&:statvfs", PyUnicode_FSConverter, &opath)) return NULL; + path = PyBytes_AS_STRING(opath); Py_BEGIN_ALLOW_THREADS res = statvfs(path, &st); Py_END_ALLOW_THREADS if (res != 0) - return posix_error_with_filename(path); + return posix_error_with_allocated_filename(opath); - return _pystatvfs_fromstructstatvfs(st); + result = _pystatvfs_fromstructstatvfs(st); + Py_DECREF(opath); + return result; } #endif /* HAVE_STATVFS */