aboutsummaryrefslogtreecommitdiff
path: root/py/objstringio.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-08-20 21:32:17 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-08-20 22:02:41 +0300
commit0cd9ab77550eada4def492a3a25286ead71a3b24 (patch)
treee1beb1f24e8aff42d943cee873a7c324187b56e9 /py/objstringio.c
parent168350cd9849b0ab56867c487cfd78ca68c2b228 (diff)
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.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/py/objstringio.c b/py/objstringio.c
index cb8003bcd..61da0203e 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