[tor-commits] [stem/master] Provide a nicer error message for packing negative numbers with unsigned types

atagar at torproject.org atagar at torproject.org
Sun Aug 26 20:49:21 UTC 2018


commit 2fa32642d4b734821746d2488334ef68c38ad634
Author: Dave Rolek <dmr-x at riseup.net>
Date:   Mon Aug 6 21:45:26 2018 +0000

    Provide a nicer error message for packing negative numbers with unsigned types
---
 stem/client/datatype.py  | 3 +++
 test/unit/client/size.py | 9 +++++++++
 2 files changed, 12 insertions(+)

diff --git a/stem/client/datatype.py b/stem/client/datatype.py
index 5ca4e820..e19adfb1 100644
--- a/stem/client/datatype.py
+++ b/stem/client/datatype.py
@@ -349,6 +349,7 @@ class Size(Field):
     self.name = name
     self.size = size
     self.format = pack_format
+    self.unsigned = pack_format.isupper()
 
   @staticmethod
   def pop(packed):
@@ -357,6 +358,8 @@ class Size(Field):
   def pack(self, content):
     if not stem.util._is_int(content):
       raise ValueError('Size.pack encodes an integer, but was a %s' % type(content).__name__)
+    if self.unsigned and content < 0:
+      raise ValueError('A %s field cannot pack negative values, but %i was tried' % (self.name, content))
 
     packed = struct.pack(self.format, content)
 
diff --git a/test/unit/client/size.py b/test/unit/client/size.py
index eebe3619..3d7d796f 100644
--- a/test/unit/client/size.py
+++ b/test/unit/client/size.py
@@ -7,17 +7,22 @@ import unittest
 
 from stem.client.datatype import Size
 
+SIGNED_CHAR = Size('SIGNED_CHAR', 1, '!b')
+
 
 class TestSize(unittest.TestCase):
   def test_attributes(self):
     self.assertEqual('CHAR', Size.CHAR.name)
     self.assertEqual('!B', Size.CHAR.format)
+    self.assertEqual(True, Size.CHAR.unsigned)
 
     self.assertEqual(1, Size.CHAR.size)
     self.assertEqual(2, Size.SHORT.size)
     self.assertEqual(4, Size.LONG.size)
     self.assertEqual(8, Size.LONG_LONG.size)
 
+    self.assertEqual(False, SIGNED_CHAR.unsigned)
+
   def test_pack(self):
     self.assertEqual(b'\x12', Size.CHAR.pack(18))
     self.assertEqual(b'\x00\x12', Size.SHORT.pack(18))
@@ -26,9 +31,13 @@ class TestSize(unittest.TestCase):
 
     self.assertRaisesWith(ValueError, 'Size.pack encodes an integer, but was a str', Size.CHAR.pack, 'hi')
 
+    self.assertRaisesWith(ValueError, 'A CHAR field cannot pack negative values, but -1 was tried', Size.CHAR.pack, -1)
+
     bad_size = Size('BAD_SIZE', 1, '!H')
     self.assertRaisesRegexp(ValueError, re.escape("'\\x00\\x12' is the wrong size for a BAD_SIZE field"), bad_size.pack, 18)
 
+    self.assertEqual(b'\xFF', SIGNED_CHAR.pack(-1))
+
   def test_unpack(self):
     self.assertEqual(18, Size.CHAR.unpack(b'\x12'))
     self.assertEqual(18, Size.SHORT.unpack(b'\x00\x12'))





More information about the tor-commits mailing list