Index: Lib/test/test_struct.py =================================================================== --- Lib/test/test_struct.py (revision 81890) +++ Lib/test/test_struct.py (working copy) @@ -443,7 +443,7 @@ # 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'l', sb, None) def test_pack_into_fn(self): test_string = b'Reykjavik rocks, eow!' @@ -510,7 +510,33 @@ 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: Modules/_struct.c =================================================================== --- Modules/_struct.c (revision 81890) +++ Modules/_struct.c (working copy) @@ -1195,8 +1195,11 @@ } num = x; } - if (c == '\0') - break; + if (c == '\0') { + PyErr_SetString(StructError, + "repeat count given without format specifier"); + return -1; + } } else num = 1;