X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fstdio%2Fopen_wmemstream.c;h=a830b143ebe95cbf6dc4b038bc44b7357b824841;hp=3bc0f25412f373c899380c037c80c87a289a1b2d;hb=599f97360389911c293e0ca4c5eb49e007377fba;hpb=1e6937643577e1fb5ea8696c2f583e20bcd29279 diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c index 3bc0f254..a830b143 100644 --- a/src/stdio/open_wmemstream.c +++ b/src/stdio/open_wmemstream.c @@ -14,22 +14,13 @@ static off_t wms_seek(FILE *f, off_t off, int whence) { ssize_t base; struct cookie *c = f->cookie; - switch (whence) { - case SEEK_SET: - base = 0; - break; - case SEEK_CUR: - base = c->pos; - break; - case SEEK_END: - base = c->len; - break; - default: - fail: + if (whence>2U) { +fail: errno = EINVAL; return -1; } - if (-off > base || off > SSIZE_MAX/4-base) goto fail; + base = (size_t [3]){0, c->pos, c->len}[whence]; + if (off < -base || off > SSIZE_MAX/4-base) goto fail; memset(&c->mbs, 0, sizeof c->mbs); return c->pos = base+off; } @@ -39,8 +30,8 @@ static size_t wms_write(FILE *f, const unsigned char *buf, size_t len) struct cookie *c = f->cookie; size_t len2; wchar_t *newbuf; - if (len >= c->space - c->pos) { - len2 = 2*c->space+1 | c->space+len+1; + if (len + c->pos >= c->space) { + len2 = 2*c->space+1 | c->pos+len+1; if (len2 > SSIZE_MAX/4) return 0; newbuf = realloc(c->buf, len2*4); if (!newbuf) return 0;