py/objstringio: Fix regression with handling SEEK_SET.
For SEEK_SET, offset should be treated as unsigned, to allow full-width stream sizes (e.g. 32-bit instead of 31-bit). This is now fully documented in stream.h. Also, seek symbolic constants are added.
This commit is contained in:
parent
168350cd98
commit
0cd9ab7755
@ -118,15 +118,17 @@ STATIC mp_uint_t stringio_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg,
|
|||||||
struct mp_stream_seek_t *s = (struct mp_stream_seek_t*)arg;
|
struct mp_stream_seek_t *s = (struct mp_stream_seek_t*)arg;
|
||||||
mp_uint_t ref = 0;
|
mp_uint_t ref = 0;
|
||||||
switch (s->whence) {
|
switch (s->whence) {
|
||||||
case 1: // SEEK_CUR
|
case MP_SEEK_CUR:
|
||||||
ref = o->pos;
|
ref = o->pos;
|
||||||
break;
|
break;
|
||||||
case 2: // SEEK_END
|
case MP_SEEK_END:
|
||||||
ref = o->vstr->len;
|
ref = o->vstr->len;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mp_uint_t new_pos = ref + s->offset;
|
mp_uint_t new_pos = ref + s->offset;
|
||||||
if (s->offset < 0) {
|
|
||||||
|
// For MP_SEEK_SET, offset is unsigned
|
||||||
|
if (s->whence != MP_SEEK_SET && s->offset < 0) {
|
||||||
if (new_pos > ref) {
|
if (new_pos > ref) {
|
||||||
// Negative offset from SEEK_CUR or SEEK_END went past 0.
|
// Negative offset from SEEK_CUR or SEEK_END went past 0.
|
||||||
// CPython sets position to 0, POSIX returns an EINVAL error
|
// CPython sets position to 0, POSIX returns an EINVAL error
|
||||||
|
@ -50,10 +50,18 @@
|
|||||||
|
|
||||||
// Argument structure for MP_STREAM_SEEK
|
// Argument structure for MP_STREAM_SEEK
|
||||||
struct mp_stream_seek_t {
|
struct mp_stream_seek_t {
|
||||||
|
// If whence == MP_SEEK_SET, offset should be treated as unsigned.
|
||||||
|
// This allows dealing with full-width stream sizes (16, 32, 64,
|
||||||
|
// etc. bits). For other seek types, should be treated as signed.
|
||||||
mp_off_t offset;
|
mp_off_t offset;
|
||||||
int whence;
|
int whence;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// seek ioctl "whence" values
|
||||||
|
#define MP_SEEK_SET (0)
|
||||||
|
#define MP_SEEK_CUR (1)
|
||||||
|
#define MP_SEEK_END (2)
|
||||||
|
|
||||||
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj);
|
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read_obj);
|
||||||
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read1_obj);
|
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_read1_obj);
|
||||||
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_readinto_obj);
|
MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_readinto_obj);
|
||||||
|
Loading…
Reference in New Issue
Block a user