mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-30249: Improve struct.unpack_from() error messages (GH-6059)
This commit is contained in:
parent
67ee07795b
commit
c10b288f34
5 changed files with 67 additions and 15 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue