Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Lib/test/test_struct.py
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,9 @@ def test_count_overflow(self):
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)

Expand Down
10 changes: 9 additions & 1 deletion Modules/_struct.c
Original file line number Diff line number Diff line change
Expand Up @@ -1678,7 +1678,15 @@ prepare_s(PyStructObject *self)
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;
Expand Down
Loading