diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-08-20 21:32:17 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2017-08-20 22:02:41 +0300 |
commit | 0cd9ab77550eada4def492a3a25286ead71a3b24 (patch) | |
tree | e1beb1f24e8aff42d943cee873a7c324187b56e9 /py/objstringio.c | |
parent | 168350cd9849b0ab56867c487cfd78ca68c2b228 (diff) | |
download | micropython-0cd9ab77550eada4def492a3a25286ead71a3b24.tar.gz micropython-0cd9ab77550eada4def492a3a25286ead71a3b24.zip |
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.
Diffstat (limited to 'py/objstringio.c')
-rw-r--r-- | py/objstringio.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/py/objstringio.c b/py/objstringio.c index cb8003bcdd..61da0203e1 100644 --- a/py/objstringio.c +++ b/py/objstringio.c @@ -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; mp_uint_t ref = 0; switch (s->whence) { - case 1: // SEEK_CUR + case MP_SEEK_CUR: ref = o->pos; break; - case 2: // SEEK_END + case MP_SEEK_END: ref = o->vstr->len; break; } 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) { // Negative offset from SEEK_CUR or SEEK_END went past 0. // CPython sets position to 0, POSIX returns an EINVAL error |