Avoid possible undefined behaviour from signed overflow in `struct` module
As discovered via oss-fuzz.
hugecount2 = '{}b{}H'.format(sys.maxsize//2, sys.maxsize//2)
self.assertRaises(struct.error, struct.calcsize, hugecount2)
+ hugecount3 = '{}i{}q'.format(sys.maxsize // 4, sys.maxsize // 8)
+ self.assertRaises(struct.error, struct.calcsize, hugecount3)
+
def test_trailing_counter(self):
store = array.array('b', b' '*100)
--- /dev/null
+Avoid undefined behaviour from signed integer overflow when parsing format
+strings in the :mod:`struct` module.
case 's': _Py_FALLTHROUGH;
case 'p': len++; ncodes++; break;
case 'x': break;
- default: len += num; if (num) ncodes++; break;
+ default:
+ if (num > PY_SSIZE_T_MAX - len) {
+ goto overflow;
+ }
+ len += num;
+ if (num) {
+ ncodes++;
+ }
+ break;
}
itemsize = e->size;