]> granicus.if.org Git - python/commitdiff
Issue #11694: Raise ConversionError in xdrlib as documented
authorPetri Lehtinen <petri@digip.org>
Fri, 10 Oct 2014 18:21:52 +0000 (21:21 +0300)
committerPetri Lehtinen <petri@digip.org>
Fri, 10 Oct 2014 18:21:52 +0000 (21:21 +0300)
Lib/test/test_xdrlib.py
Lib/xdrlib.py
Misc/NEWS

index 6004c9f1c67c12e5e54bec5b9b2726df7e047016..70496d63b43f10245f5f478bc26c81e3b3b9e246 100644 (file)
@@ -51,8 +51,32 @@ class XDRTest(unittest.TestCase):
         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():
     support.run_unittest(XDRTest)
+    support.run_unittest(ConversionErrorTest)
 
 if __name__ == "__main__":
     test_main()
index c05cf87e4a1ddfd9deea264f39b0cafb80a9c99e..d6e1aeb527266af97f0338806a673894ec2f3c64 100644 (file)
@@ -6,6 +6,7 @@ See: RFC 1014
 
 import struct
 from io import BytesIO
+from functools import wraps
 
 __all__ = ["Error", "Packer", "Unpacker", "ConversionError"]
 
@@ -31,6 +32,16 @@ class Error(Exception):
 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]) from None
+    return result
 
 
 class Packer:
@@ -47,9 +58,11 @@ class Packer:
     # 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))
 
@@ -60,20 +73,24 @@ class Packer:
         else: self.__buf.write(b'\0\0\0\0')
 
     def pack_uhyper(self, x):
-        self.pack_uint(x>>32 & 0xffffffff)
-        self.pack_uint(x & 0xffffffff)
+        try:
+            self.pack_uint(x>>32 & 0xffffffff)
+        except (TypeError, struct.error) as e:
+            raise ConversionError(e.args[0]) from None
+        try:
+            self.pack_uint(x & 0xffffffff)
+        except (TypeError, struct.error) as e:
+            raise ConversionError(e.args[0]) from None
 
     pack_hyper = pack_uhyper
 
+    @raise_conversion_error
     def pack_float(self, x):
-        try: self.__buf.write(struct.pack('>f', x))
-        except struct.error as 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 as msg:
-            raise ConversionError(msg)
+        self.__buf.write(struct.pack('>d', x))
 
     def pack_fstring(self, n, s):
         if n < 0:
index eec96b989aff3ac6c4dd421713882994514ffa53..c490be5a3d4e1c42ccbcc20e58b2a337dc154689 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #11694: Raise ConversionError in xdrlib as documented.  Patch
+  by Filip GruszczyƄski and Claudiu Popa.
+
 - Issue #22462: Fix pyexpat's creation of a dummy frame to make it
   appear in exception tracebacks.