[Python-checkins] cpython (3.4): 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/7ef6e5f53418
changeset: 92930:7ef6e5f53418
branch: 3.4
parent: 92925:72cff635a3ce
user: Petri Lehtinen <petri at digip.org>
date: Fri Oct 10 21:21:52 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():
support.run_unittest(XDRTest)
+ 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
@@ -6,6 +6,7 @@
import struct
from io import BytesIO
+from functools import wraps
__all__ = ["Error", "Packer", "Unpacker", "ConversionError"]
@@ -31,6 +32,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]) from None
+ return result
class Packer:
@@ -47,9 +58,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))
@@ -60,20 +73,24 @@
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:
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@
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.
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list