Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r60920:1370dfe72906
Date: 2013-02-06 15:31 -0800
http://bitbucket.org/pypy/pypy/changeset/1370dfe72906/

Log:    forbid pickling of _io objects

diff --git a/pypy/module/_io/interp_bufferedio.py 
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -796,6 +796,7 @@
     'BufferedReader', W_BufferedIOBase.typedef,
     __new__ = generic_new_descr(W_BufferedReader),
     __init__  = interp2app(W_BufferedReader.descr_init),
+    __getstate__ = interp2app(W_BufferedReader.getstate_w),
     __module__ = "_io",
 
     read = interp2app(W_BufferedReader.read_w),
@@ -843,6 +844,7 @@
     'BufferedWriter', W_BufferedIOBase.typedef,
     __new__ = generic_new_descr(W_BufferedWriter),
     __init__  = interp2app(W_BufferedWriter.descr_init),
+    __getstate__ = interp2app(W_BufferedWriter.getstate_w),
     __module__ = "_io",
 
     write = interp2app(W_BufferedWriter.write_w),
@@ -939,6 +941,7 @@
     '_io.BufferedRWPair', W_BufferedIOBase.typedef,
     __new__ = generic_new_descr(W_BufferedRWPair),
     __init__  = interp2app(W_BufferedRWPair.descr_init),
+    __getstate__ = interp2app(W_BufferedRWPair.getstate_w),
     closed = GetSetProperty(W_BufferedRWPair.closed_get_w),
     **methods
 )
@@ -969,6 +972,7 @@
     'BufferedRandom', W_BufferedIOBase.typedef,
     __new__ = generic_new_descr(W_BufferedRandom),
     __init__ = interp2app(W_BufferedRandom.descr_init),
+    __getstate__ = interp2app(W_BufferedRandom.getstate_w),
     __module__ = "_io",
 
     read = interp2app(W_BufferedRandom.read_w),
diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py
--- a/pypy/module/_io/interp_fileio.py
+++ b/pypy/module/_io/interp_fileio.py
@@ -438,6 +438,7 @@
     __new__  = interp2app(W_FileIO.descr_new.im_func),
     __init__  = interp2app(W_FileIO.descr_init),
     __repr__ = interp2app(W_FileIO.repr_w),
+    __getstate__ = interp2app(W_FileIO.getstate_w),
 
     seek = interp2app(W_FileIO.seek_w),
     tell = interp2app(W_FileIO.tell_w),
diff --git a/pypy/module/_io/interp_iobase.py b/pypy/module/_io/interp_iobase.py
--- a/pypy/module/_io/interp_iobase.py
+++ b/pypy/module/_io/interp_iobase.py
@@ -164,6 +164,11 @@
     def seekable_w(self, space):
         return space.w_False
 
+    def getstate_w(self, space):
+        raise operationerrfmt(space.w_TypeError,
+                              "cannot serialize '%s' object",
+                              space.type(self).getname(space))
+
     # ______________________________________________________________
 
     def readline_w(self, space, w_limit=None):
diff --git a/pypy/module/_io/interp_textio.py b/pypy/module/_io/interp_textio.py
--- a/pypy/module/_io/interp_textio.py
+++ b/pypy/module/_io/interp_textio.py
@@ -989,9 +989,10 @@
     __new__ = generic_new_descr(W_TextIOWrapper),
     __init__  = interp2app(W_TextIOWrapper.descr_init),
     __repr__ = interp2app(W_TextIOWrapper.descr_repr),
+    __next__ = interp2app(W_TextIOWrapper.next_w),
+    __getstate__ = interp2app(W_TextIOWrapper.getstate_w),
     __module__ = "_io",
 
-    __next__ = interp2app(W_TextIOWrapper.next_w),
     read = interp2app(W_TextIOWrapper.read_w),
     readline = interp2app(W_TextIOWrapper.readline_w),
     write = interp2app(W_TextIOWrapper.write_w),
diff --git a/pypy/module/_io/test/test_io.py b/pypy/module/_io/test/test_io.py
--- a/pypy/module/_io/test/test_io.py
+++ b/pypy/module/_io/test/test_io.py
@@ -351,3 +351,22 @@
         self._check_warn_on_dealloc(self.tmpfile, 'wb', buffering=0)
         self._check_warn_on_dealloc(self.tmpfile, 'wb')
         self._check_warn_on_dealloc(self.tmpfile, 'w')
+
+    def test_pickling(self):
+        import _io
+        import pickle
+        # Pickling file objects is forbidden
+        for kwargs in [
+                {"mode": "w"},
+                {"mode": "wb"},
+                {"mode": "wb", "buffering": 0},
+                {"mode": "r"},
+                {"mode": "rb"},
+                {"mode": "rb", "buffering": 0},
+                {"mode": "w+"},
+                {"mode": "w+b"},
+                {"mode": "w+b", "buffering": 0},
+            ]:
+            for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
+                with _io.open(self.tmpfile, **kwargs) as f:
+                    raises(TypeError, pickle.dumps, f, protocol)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to