fix buggy limiter handling in shgetc
authorRich Felker <dalias@aerifal.cx>
Mon, 16 Apr 2012 19:36:18 +0000 (15:36 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 16 Apr 2012 19:36:18 +0000 (15:36 -0400)
this is needed for upcoming new scanf

src/internal/shgetc.c

index e85d38acd1b834f24fa6d5d9d7df4d8f8b13a696..96f72b6ab476fb65b14ca54db460241ece857ecb 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,14 @@ 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;
        return c;
 }