Index: Modules/_struct.c =================================================================== --- Modules/_struct.c (revision 69497) +++ Modules/_struct.c (working copy) @@ -1785,7 +1785,7 @@ assert( buffer_len >= 0 ); /* Extract the offset from the first argument */ - offset = PyLong_AsSsize_t(PyTuple_GET_ITEM(args, 1)); + offset = PyNumber_AsSsize_t(PyTuple_GET_ITEM(args, 1), PyExc_IndexError); if (offset == -1 && PyErr_Occurred()) return NULL; Index: Lib/test/test_struct.py =================================================================== --- Lib/test/test_struct.py (revision 69497) +++ Lib/test/test_struct.py (working copy) @@ -524,6 +524,10 @@ self.assertRaises(struct.error, s.pack_into, small_buf, 0, test_string) self.assertRaises(struct.error, s.pack_into, small_buf, 2, test_string) + # Test bogus offset (issue 3694) + sb = small_buf + self.assertRaises(TypeError, struct.pack_into, b'1', sb, None) + def test_pack_into_fn(self): test_string = b'Reykjavik rocks, eow!' writable_buf = array.array('b', b' '*100)