bpo-30249: Improve struct.unpack_from() error messages (GH-6059)

This commit is contained in:
Xiang Zhang 2018-03-11 02:58:52 +08:00 committed by GitHub
parent 67ee07795b
commit c10b288f34
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 67 additions and 15 deletions

View file

@ -1553,7 +1553,8 @@ Return a tuple containing unpacked values.
Values are unpacked according to the format string Struct.format.
The buffer's size in bytes, minus offset, must be at least Struct.size.
The buffer's size in bytes, starting at position offset, must be
at least Struct.size.
See help(struct) for more on format strings.
[clinic start generated code]*/
@ -1561,16 +1562,38 @@ See help(struct) for more on format strings.
static PyObject *
Struct_unpack_from_impl(PyStructObject *self, Py_buffer *buffer,
Py_ssize_t offset)
/*[clinic end generated code: output=57fac875e0977316 input=97ade52422f8962f]*/
/*[clinic end generated code: output=57fac875e0977316 input=cafd4851d473c894]*/
{
assert(self->s_codes != NULL);
if (offset < 0)
if (offset < 0) {
if (offset + self->s_size > 0) {
PyErr_Format(StructError,
"not enough data to unpack %zd bytes at offset %zd",
self->s_size,
offset);
return NULL;
}
if (offset + buffer->len < 0) {
PyErr_Format(StructError,
"offset %zd out of range for %zd-byte buffer",
offset,
buffer->len);
return NULL;
}
offset += buffer->len;
if (offset < 0 || buffer->len - offset < self->s_size) {
}
if ((buffer->len - offset) < self->s_size) {
PyErr_Format(StructError,
"unpack_from requires a buffer of at least %zd bytes",
self->s_size);
"unpack_from requires a buffer of at least %zu bytes for "
"unpacking %zd bytes at offset %zd "
"(actual buffer size is %zd)",
(size_t)self->s_size + (size_t)offset,
self->s_size,
offset,
buffer->len);
return NULL;
}
return s_unpack_internal(self, (char*)buffer->buf + offset);