fix major scanf breakage with unbuffered streams, fmemopen, etc.
[musl] / src / internal / shgetc.c
index e85d38a..e878b00 100644 (file)
@@ -4,7 +4,7 @@ void __shlim(FILE *f, off_t lim)
 {
        f->shlim = lim;
        f->shcnt = f->rend - f->rpos;
-       if (lim && f->rend - f->rpos > lim)
+       if (lim && f->shcnt > lim)
                f->shend = f->rpos + lim;
        else
                f->shend = f->rend;
@@ -13,15 +13,15 @@ void __shlim(FILE *f, off_t lim)
 int __shgetc(FILE *f)
 {
        int c;
-       if (f->shlim && f->shcnt >= f->shlim) {
+       if (f->shlim && f->shcnt >= f->shlim || (c=__uflow(f)) < 0) {
                f->shend = 0;
                return EOF;
        }
-       c = __uflow(f);
        if (f->shlim && f->rend - f->rpos > f->shlim - f->shcnt - 1)
                f->shend = f->rpos + (f->shlim - f->shcnt - 1);
        else
                f->shend = f->rend;
-       if (f->rend) f->shcnt += f->rend - f->buf;
+       if (f->rend) f->shcnt += f->rend - f->rpos + 1;
+       if (f->rpos[-1] != c) f->rpos[-1] = c;
        return c;
 }