[Python-checkins] cpython (2.7): Issue #11694: Raise ConversionError in xdrlib as documented

petri.lehtinen python-checkins at python.org
Fri Oct 10 20:30:31 CEST 2014


https://hg.python.org/cpython/rev/9cee201388c9
changeset:   92929:9cee201388c9
branch:      2.7
user:        Petri Lehtinen <petri at digip.org>
date:        Fri Oct 10 21:11:34 2014 +0300
summary:
  Issue #11694: Raise ConversionError in xdrlib as documented

files:
  Lib/test/test_xdrlib.py |  24 +++++++++++++++++++++
  Lib/xdrlib.py           |  33 +++++++++++++++++++++-------
  Misc/NEWS               |   3 ++
  3 files changed, 52 insertions(+), 8 deletions(-)


diff --git a/Lib/test/test_xdrlib.py b/Lib/test/test_xdrlib.py
--- a/Lib/test/test_xdrlib.py
+++ b/Lib/test/test_xdrlib.py
@@ -51,8 +51,32 @@
         up.done()
         self.assertRaises(EOFError, up.unpack_uint)
 
+class ConversionErrorTest(unittest.TestCase):
+
+    def setUp(self):
+        self.packer = xdrlib.Packer()
+
+    def assertRaisesConversion(self, *args):
+        self.assertRaises(xdrlib.ConversionError, *args)
+
+    def test_pack_int(self):
+        self.assertRaisesConversion(self.packer.pack_int, 'string')
+
+    def test_pack_uint(self):
+        self.assertRaisesConversion(self.packer.pack_uint, 'string')
+
+    def test_float(self):
+        self.assertRaisesConversion(self.packer.pack_float, 'string')
+
+    def test_double(self):
+        self.assertRaisesConversion(self.packer.pack_double, 'string')
+
+    def test_uhyper(self):
+        self.assertRaisesConversion(self.packer.pack_uhyper, 'string')
+
 def test_main():
     test_support.run_unittest(XDRTest)
+    test_support.run_unittest(ConversionErrorTest)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py
--- a/Lib/xdrlib.py
+++ b/Lib/xdrlib.py
@@ -9,6 +9,7 @@
     from cStringIO import StringIO as _StringIO
 except ImportError:
     from StringIO import StringIO as _StringIO
+from functools import wraps
 
 __all__ = ["Error", "Packer", "Unpacker", "ConversionError"]
 
@@ -34,6 +35,16 @@
 class ConversionError(Error):
     pass
 
+def raise_conversion_error(function):
+    """ Wrap any raised struct.errors in a ConversionError. """
+
+    @wraps(function)
+    def result(self, value):
+        try:
+            return function(self, value)
+        except struct.error as e:
+            raise ConversionError(e.args[0])
+    return result
 
 
 class Packer:
@@ -50,9 +61,11 @@
     # backwards compatibility
     get_buf = get_buffer
 
+    @raise_conversion_error
     def pack_uint(self, x):
         self.__buf.write(struct.pack('>L', x))
 
+    @raise_conversion_error
     def pack_int(self, x):
         self.__buf.write(struct.pack('>l', x))
 
@@ -63,20 +76,24 @@
         else: self.__buf.write('\0\0\0\0')
 
     def pack_uhyper(self, x):
-        self.pack_uint(x>>32 & 0xffffffffL)
-        self.pack_uint(x & 0xffffffffL)
+        try:
+            self.pack_uint(x>>32 & 0xffffffffL)
+        except (TypeError, struct.error) as e:
+            raise ConversionError(e.args[0])
+        try:
+            self.pack_uint(x & 0xffffffffL)
+        except (TypeError, struct.error) as e:
+            raise ConversionError(e.args[0])
 
     pack_hyper = pack_uhyper
 
+    @raise_conversion_error
     def pack_float(self, x):
-        try: self.__buf.write(struct.pack('>f', x))
-        except struct.error, msg:
-            raise ConversionError, msg
+        self.__buf.write(struct.pack('>f', x))
 
+    @raise_conversion_error
     def pack_double(self, x):
-        try: self.__buf.write(struct.pack('>d', x))
-        except struct.error, msg:
-            raise ConversionError, msg
+        self.__buf.write(struct.pack('>d', x))
 
     def pack_fstring(self, n, s):
         if n < 0:
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -34,6 +34,9 @@
 Library
 -------
 
+- Issue #11694: Raise ConversionError in xdrlib as documented.  Patch
+  by Filip Gruszczyński and Claudiu Popa.
+
 - Issue #1686: Fix string.Template when overriding the pattern attribute.
 
 - Issue #11866: Eliminated race condition in the computation of names

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list