Issue #11694: Raise ConversionError in xdrlib as documented

This commit is contained in:
Petri Lehtinen 2014-10-10 21:11:34 +03:00
parent c305ad7350
commit f85a856fb0
3 changed files with 52 additions and 8 deletions

View 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():
test_support.run_unittest(XDRTest)
test_support.run_unittest(ConversionErrorTest)
if __name__ == "__main__":
test_main()

View File

@ -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:

View File

@ -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