From f85a856fb0ca43408c2deb01d9deb2efd7cb28b7 Mon Sep 17 00:00:00 2001 From: Petri Lehtinen Date: Fri, 10 Oct 2014 21:11:34 +0300 Subject: [PATCH] Issue #11694: Raise ConversionError in xdrlib as documented --- 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 index 9ba8885c0a..91d4162445 100644 --- a/Lib/test/test_xdrlib.py +++ b/Lib/test/test_xdrlib.py @@ -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(): 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 index ef172dd37d..7afba497ae 100644 --- a/Lib/xdrlib.py +++ b/Lib/xdrlib.py @@ -9,6 +9,7 @@ try: 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 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]) + return result class Packer: @@ -50,9 +61,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)) @@ -63,20 +76,24 @@ class Packer: 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 index b497fa34fc..4f09b02a27 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -34,6 +34,9 @@ Core and Builtins 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 -- 2.50.1