Mercurial > cpython-lru_cache-weakref
diff Objects/bufferobject.c @ 33559:be8cff4a1eca legacy-trunk
Fix buffer offset calculation (need to compute it before changing
'base'). Fixes SF bug #1033720. Move offset sanity checking to
buffer_from_memory().
| author | Neil Schemenauer <nascheme@enme.ucalgary.ca> |
|---|---|
| date | Fri, 24 Sep 2004 15:41:27 +0000 |
| parents | 7a120400888a |
| children | 97cb9eea212e |
line wrap: on
line diff
--- a/Objects/bufferobject.c Fri Sep 24 15:35:15 2004 +0000 +++ b/Objects/bufferobject.c Fri Sep 24 15:41:27 2004 +0000 @@ -66,6 +66,11 @@ "size must be zero or positive"); return NULL; } + if (offset < 0) { + PyErr_SetString(PyExc_ValueError, + "offset must be zero or positive"); + return NULL; + } b = PyObject_NEW(PyBufferObject, &PyBuffer_Type); if ( b == NULL ) @@ -85,20 +90,11 @@ static PyObject * buffer_from_object(PyObject *base, int size, int offset, int readonly) { - if ( offset < 0 ) { - PyErr_SetString(PyExc_ValueError, - "offset must be zero or positive"); - return NULL; + if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) { + /* another buffer, refer to the base object */ + offset += ((PyBufferObject *)base)->b_offset; + base = ((PyBufferObject *)base)->b_base; } - - /* if the base object is another buffer, then try to refer to the - * base object. - */ - if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) { - base = ((PyBufferObject *)base)->b_base; - offset = ((PyBufferObject *)base)->b_offset + offset; - } - return buffer_from_memory(base, size, offset, NULL, readonly); }
