| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 514cfe7 commit c360884
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -327,6 +327,10 @@ def test__tuple_resize(self): | |||
| 327 | 327 | self.assertRaises(MemoryError, resize, a, PY_SSIZE_T_MAX) | |
| 328 | 328 | self.assertRaises(SystemError, resize, a, -1) | |
| 329 | 329 | self.assertRaises(SystemError, resize, a, PY_SSIZE_T_MIN) | |
| 330 | + a = ([1], [2], [3]) | ||
| 331 | + self.assertRaises(MemoryError, resize, a, PY_SSIZE_T_MAX) | ||
| 332 | + self.assertRaises(SystemError, resize, a, -1) | ||
| 333 | + self.assertRaises(SystemError, resize, a, PY_SSIZE_T_MIN) | ||
| 330 | 334 | # refcount > 1 | |
| 331 | 335 | a = (1, 2, 3) | |
| 332 | 336 | self.assertRaises(SystemError, resize, a, 3, False) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,3 @@ | |||
| 1 | + Fix a crash in :c:func:`_PyTuple_Resize` when resizing a non-empty tuple to a | ||
| 2 | + negative or too large size. It now raises :exc:`SystemError` or | ||
| 3 | + :exc:`MemoryError` respectively. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1021,7 +1021,7 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) | |||
| 1021 | 1021 | Py_ssize_t oldsize; | |
| 1022 | 1022 | ||
| 1023 | 1023 | v = (PyTupleObject *) *pv; | |
| 1024 | - if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || | ||
| 1024 | + if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) || newsize < 0 || | ||
| 1025 | 1025 | (Py_SIZE(v) != 0 && !_PyObject_IsUniquelyReferenced(*pv))) { | |
| 1026 | 1026 | *pv = 0; | |
| 1027 | 1027 | Py_XDECREF(v); | |
@@ -1048,6 +1048,14 @@ _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize) | |||
| 1048 | 1048 | *pv = PyTuple_New(newsize); | |
| 1049 | 1049 | return *pv == NULL ? -1 : 0; | |
| 1050 | 1050 | } | |
| 1051 | + /* Check for overflow */ | ||
| 1052 | + if ((size_t)newsize > ((size_t)PY_SSIZE_T_MAX - (sizeof(PyTupleObject) - | ||
| 1053 | + sizeof(PyObject *))) / sizeof(PyObject *)) { | ||
| 1054 | + *pv = NULL; | ||
| 1055 | + Py_DECREF(v); | ||
| 1056 | + PyErr_NoMemory(); | ||
| 1057 | + return -1; | ||
| 1058 | + } | ||
| 1051 | 1059 | ||
| 1052 | 1060 | if (_PyObject_GC_IS_TRACKED(v)) { | |
| 1053 | 1061 | _PyObject_GC_UNTRACK(v); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments