diff options
author | Petri Lehtinen <petri@digip.org> | 2014-10-10 18:21:52 (GMT) |
---|---|---|
committer | Petri Lehtinen <petri@digip.org> | 2014-10-10 18:21:52 (GMT) |
commit | 3894b2a24f1a0a94601cc2436f779aa666a2f9dd (patch) | |
tree | ad33521c60dde42da697b9542b3b53a5d4b1e178 /Lib/xdrlib.py | |
parent | 866c4e2188eba458f8277e8e67a1601cd17b7855 (diff) | |
download | cpython-3894b2a24f1a0a94601cc2436f779aa666a2f9dd.zip cpython-3894b2a24f1a0a94601cc2436f779aa666a2f9dd.tar.gz cpython-3894b2a24f1a0a94601cc2436f779aa666a2f9dd.tar.bz2 |
Issue #11694: Raise ConversionError in xdrlib as documented
Diffstat (limited to 'Lib/xdrlib.py')
-rw-r--r-- | Lib/xdrlib.py | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py index c05cf87..d6e1aeb 100644 --- a/Lib/xdrlib.py +++ b/Lib/xdrlib.py @@ -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: |