X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fstdio%2Fgetdelim.c;h=1ccd8029238987f05e183c3bfec186287dff89f0;hb=b6e1fe0d5e78dac647e85d49c2d537bb071ba49e;hp=a88c3933f86d55e007647c2a05a370b4afaaa0a6;hpb=05e0e301e3efbeb399b9f3d96fab63aac18e601a;p=musl diff --git a/src/stdio/getdelim.c b/src/stdio/getdelim.c index a88c3933..1ccd8029 100644 --- a/src/stdio/getdelim.c +++ b/src/stdio/getdelim.c @@ -27,17 +27,18 @@ ssize_t getdelim(char **restrict s, size_t *restrict n, int delim, FILE *restric for (;;) { z = memchr(f->rpos, delim, f->rend - f->rpos); k = z ? z - f->rpos + 1 : f->rend - f->rpos; - if (i+k >= *n) { + if (i+k+1 >= *n) { if (k >= SIZE_MAX/2-i) goto oom; - *n = i+k+2; - if (*n < SIZE_MAX/4) *n *= 2; - tmp = realloc(*s, *n); + size_t m = i+k+2; + if (!z && m < SIZE_MAX/4) m += m/2; + tmp = realloc(*s, m); if (!tmp) { - *n = i+k+2; - tmp = realloc(*s, *n); + m = i+k+2; + tmp = realloc(*s, m); if (!tmp) goto oom; } *s = tmp; + *n = m; } memcpy(*s+i, f->rpos, k); f->rpos += k;