more fmemopen null termination fixes
authorRich Felker <dalias@aerifal.cx>
Mon, 5 Sep 2011 01:53:20 +0000 (21:53 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 5 Sep 2011 01:53:20 +0000 (21:53 -0400)
null termination is only added when current size grows.
in update modes, null termination is not added if it does not fit
(i.e. it is not allowed to clobber data).

these rules make very little sense, but that's how it goes..

src/stdio/fmemopen.c

index 260d2889ebf549989d59e497b396653972ae15aa..1b054a970445e71ba5e86d363833c05fceb6faf3 100644 (file)
@@ -54,9 +54,10 @@ static size_t mwrite(FILE *f, const unsigned char *buf, size_t len)
        if (len > rem) len = rem;
        memcpy(c->buf+c->pos, buf, len);
        c->pos += len;
-       if (c->pos >= c->len) {
+       if (c->pos > c->len) {
                c->len = c->pos;
-               c->buf[c->len==c->size ? c->len-1 : c->len] = 0;
+               if (c->len < c->size) c->buf[c->len] = 0;
+               else if ((f->flags&F_NORD) && c->size) c->buf[c->size-1] = 0;
        }
        return len;
 }