Skip to content

Commit 1834741

Browse files
gh-143904: Raise OverflowError instead of IndexError for too large offset in struct.pack_into() (GH-143905)
1 parent b625601 commit 1834741

File tree

4 files changed

+42
-25
lines changed

4 files changed

+42
-25
lines changed

Lib/test/test_struct.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,9 @@ def _test_pack_into(self, pack_into):
478478
pack_into(writable_buf, None, test_string)
479479
with self.assertRaises(TypeError):
480480
pack_into(writable_buf, 0.0, test_string)
481-
with self.assertRaises((IndexError, OverflowError)):
481+
with self.assertRaises(OverflowError):
482482
pack_into(writable_buf, 2**1000, test_string)
483-
with self.assertRaises((IndexError, OverflowError)):
483+
with self.assertRaises(OverflowError):
484484
pack_into(writable_buf, -2**1000, test_string)
485485

486486
def test_pack_into(self):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:func:`struct.pack_into` now raises OverflowError instead of IndexError for
2+
too large *offset* argument.

Modules/_struct.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2275,7 +2275,7 @@ Struct_pack_impl(PyStructObject *self, PyObject * const *values,
22752275
Struct.pack_into
22762276
22772277
buffer: Py_buffer(accept={rwbuffer})
2278-
offset as offset_obj: object
2278+
offset: Py_ssize_t
22792279
/
22802280
*values: array
22812281
@@ -2289,11 +2289,10 @@ help(struct) for more on format strings.
22892289

22902290
static PyObject *
22912291
Struct_pack_into_impl(PyStructObject *self, Py_buffer *buffer,
2292-
PyObject *offset_obj, PyObject * const *values,
2292+
Py_ssize_t offset, PyObject * const *values,
22932293
Py_ssize_t values_length)
2294-
/*[clinic end generated code: output=b0c2ef496135dad3 input=d0de9b9f138c782d]*/
2294+
/*[clinic end generated code: output=aa9d9a93f5f8f77b input=9d842a368ee14245]*/
22952295
{
2296-
Py_ssize_t offset;
22972296
_structmodulestate *state = get_struct_state_structinst(self);
22982297

22992298
ENSURE_STRUCT_IS_READY(self);
@@ -2304,12 +2303,6 @@ Struct_pack_into_impl(PyStructObject *self, Py_buffer *buffer,
23042303
return NULL;
23052304
}
23062305

2307-
/* Extract the offset from the first argument */
2308-
offset = PyNumber_AsSsize_t(offset_obj, PyExc_IndexError);
2309-
if (offset == -1 && PyErr_Occurred()) {
2310-
return NULL;
2311-
}
2312-
23132306
/* Support negative offsets. */
23142307
if (offset < 0) {
23152308
/* Check that negative offset is low enough to fit data */
@@ -2546,7 +2539,7 @@ pack_into
25462539
25472540
format as s_object: cache_struct
25482541
buffer: Py_buffer(accept={rwbuffer})
2549-
offset as offset_obj: object
2542+
offset: Py_ssize_t
25502543
/
25512544
*values: array
25522545
@@ -2560,11 +2553,11 @@ strings.
25602553

25612554
static PyObject *
25622555
pack_into_impl(PyObject *module, PyStructObject *s_object, Py_buffer *buffer,
2563-
PyObject *offset_obj, PyObject * const *values,
2556+
Py_ssize_t offset, PyObject * const *values,
25642557
Py_ssize_t values_length)
2565-
/*[clinic end generated code: output=148ef659a490eec3 input=3c5fe5bd3b6fd396]*/
2558+
/*[clinic end generated code: output=e8bf7d422b2088ef input=086867c0f5d8a8e4]*/
25662559
{
2567-
return Struct_pack_into_impl(s_object, buffer, offset_obj,
2560+
return Struct_pack_into_impl(s_object, buffer, offset,
25682561
values, values_length);
25692562
}
25702563

Modules/clinic/_struct.c.h

Lines changed: 31 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)