]> granicus.if.org Git - python/commitdiff
Issue #3129: Trailing digits in format string are no longer ignored.
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Fri, 11 Jun 2010 16:04:59 +0000 (16:04 +0000)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Fri, 11 Jun 2010 16:04:59 +0000 (16:04 +0000)
Lib/test/test_struct.py
Misc/NEWS
Modules/_struct.c

index 0c8cd2cea02b4c6dfec0643a5d2b14da40e3c01d..b9faa28d73b01c6a2de2ec4991b925933e2674e9 100644 (file)
@@ -443,7 +443,7 @@ class StructTest(unittest.TestCase):
 
         # Test bogus offset (issue 3694)
         sb = small_buf
-        self.assertRaises(TypeError, struct.pack_into, b'1', sb, None)
+        self.assertRaises(TypeError, struct.pack_into, b'', sb, None)
 
     def test_pack_into_fn(self):
         test_string = b'Reykjavik rocks, eow!'
@@ -510,6 +510,32 @@ class StructTest(unittest.TestCase):
         def test_crasher(self):
             self.assertRaises(MemoryError, struct.pack, "357913941b", "a")
 
+    def test_trailing_counter(self):
+        store = array.array('b', b' '*100)
+
+        # format lists containing only count spec should result in an error
+        self.assertRaises(struct.error, struct.pack, '12345')
+        self.assertRaises(struct.error, struct.unpack, '12345', '')
+        self.assertRaises(struct.error, struct.pack_into, '12345', store, 0)
+        self.assertRaises(struct.error, struct.unpack_from, '12345', store, 0)
+
+        # Format lists with trailing count spec should result in an error
+        self.assertRaises(struct.error, struct.pack, 'c12345', 'x')
+        self.assertRaises(struct.error, struct.unpack, 'c12345', 'x')
+        self.assertRaises(struct.error, struct.pack_into, 'c12345', store, 0,
+                           'x')
+        self.assertRaises(struct.error, struct.unpack_from, 'c12345', store,
+                           0)
+
+        # Mixed format tests
+        self.assertRaises(struct.error, struct.pack, '14s42', 'spam and eggs')
+        self.assertRaises(struct.error, struct.unpack, '14s42',
+                          'spam and eggs')
+        self.assertRaises(struct.error, struct.pack_into, '14s42', store, 0,
+                          'spam and eggs')
+        self.assertRaises(struct.error, struct.unpack_from, '14s42', store, 0)
+
+
 
 def test_main():
     run_unittest(StructTest)
index 21b396267e43c396c5252b9544412f30df541fcf..48a73227a82dbe960e0d278df24dfabd12d6fd1b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1283,6 +1283,10 @@ Library
 Extension Modules
 -----------------
 
+- Issue #3129: Trailing digits in format string are no longer ignored.
+  For example, "1" or "ilib123" are now invalid formats and cause 
+  ``struct.error`` to be raised.
+
 - Issue #7384: If the system readline library is linked against ncurses,
   the curses module must be linked against ncurses as well. Otherwise it
   is not safe to load both the readline and curses modules in an application.
index 26179cc572c7339cac5d5c072c9bff57bfae3335..2e594e8f783d490acb42ea3ee94fcb3e0e40ed8a 100644 (file)
@@ -1195,8 +1195,11 @@ prepare_s(PyStructObject *self)
                 }
                 num = x;
             }
-            if (c == '\0')
-                break;
+            if (c == '\0') {
+                PyErr_SetString(StructError,
+                                "repeat count given without format specifier");
+                return -1;
+            }
         }
         else
             num = 1;