summaryrefslogtreecommitdiff
path: root/Lib/xdrlib.py
diff options
context:
space:
mode:
authorPetri Lehtinen <petri@digip.org>2014-10-10 21:21:52 +0300
committerPetri Lehtinen <petri@digip.org>2014-10-10 21:21:52 +0300
commit3894b2a24f1a0a94601cc2436f779aa666a2f9dd (patch)
treead33521c60dde42da697b9542b3b53a5d4b1e178 /Lib/xdrlib.py
parent866c4e2188eba458f8277e8e67a1601cd17b7855 (diff)
downloadcpython-git-3894b2a24f1a0a94601cc2436f779aa666a2f9dd.tar.gz
Issue #11694: Raise ConversionError in xdrlib as documented
Diffstat (limited to 'Lib/xdrlib.py')
-rw-r--r--Lib/xdrlib.py33
1 files changed, 25 insertions, 8 deletions
diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py
index c05cf87e4a..d6e1aeb527 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: