diff options
author | Ezio Melotti <ezio.melotti@gmail.com> | 2012-03-11 23:17:02 (GMT) |
---|---|---|
committer | Ezio Melotti <ezio.melotti@gmail.com> | 2012-03-11 23:17:02 (GMT) |
commit | 11f8b6872a779b6b03fc070ad64ed778c835435a (patch) | |
tree | c6eabf7b222c7bcb0093f0eaac4aec0639f75df2 | |
parent | f60845b70a78c0e29dc0e865c6cd9e2e35e635f5 (diff) | |
download | cpython-11f8b6872a779b6b03fc070ad64ed778c835435a.zip cpython-11f8b6872a779b6b03fc070ad64ed778c835435a.tar.gz cpython-11f8b6872a779b6b03fc070ad64ed778c835435a.tar.bz2 |
#14161: fix the __repr__ of file objects to escape the file name.
-rw-r--r-- | Lib/test/test_file2k.py | 7 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/fileobject.c | 14 |
3 files changed, 19 insertions, 4 deletions
diff --git a/Lib/test/test_file2k.py b/Lib/test/test_file2k.py index 399f119..0c892bd 100644 --- a/Lib/test/test_file2k.py +++ b/Lib/test/test_file2k.py @@ -89,6 +89,13 @@ class AutoFileTests(unittest.TestCase): def testRepr(self): # verify repr works self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN)) + # see issue #14161 + # Windows doesn't like \r\n\t" in the file name, but ' is ok + fname = 'xx\rxx\nxx\'xx"xx' if sys.platform != "win32" else "xx'xx" + with open(fname, 'w') as f: + self.addCleanup(os.remove, fname) + self.assertTrue(repr(f).startswith( + "<open file %r, mode 'w' at" % fname)) def testErrors(self): self.f.close() @@ -9,6 +9,8 @@ What's New in Python 2.7.4 Core and Builtins ----------------- +- Issue #14161: fix the __repr__ of file objects to escape the file name. + - Issue #1469629: Allow cycles through an object's __dict__ slot to be collected. (For example if ``x.__dict__ is x``). diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 737ebb7..79b9aad 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -635,10 +635,11 @@ file_dealloc(PyFileObject *f) static PyObject * file_repr(PyFileObject *f) { + PyObject *ret = NULL; + PyObject *name = NULL; if (PyUnicode_Check(f->f_name)) { #ifdef Py_USING_UNICODE - PyObject *ret = NULL; - PyObject *name = PyUnicode_AsUnicodeEscapeString(f->f_name); + name = PyUnicode_AsUnicodeEscapeString(f->f_name); const char *name_str = name ? PyString_AsString(name) : "?"; ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>", f->f_fp == NULL ? "closed" : "open", @@ -649,11 +650,16 @@ file_repr(PyFileObject *f) return ret; #endif } else { - return PyString_FromFormat("<%s file '%s', mode '%s' at %p>", + name = PyObject_Repr(f->f_name); + if (name == NULL) + return NULL; + ret = PyString_FromFormat("<%s file %s, mode '%s' at %p>", f->f_fp == NULL ? "closed" : "open", - PyString_AsString(f->f_name), + PyString_AsString(name), PyString_AsString(f->f_mode), f); + Py_XDECREF(name); + return ret; } } |