diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2003-10-22 05:53:05 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2003-10-22 05:53:05 +0000 |
commit | 1af434e77bc9dcb94baaf1f6d9b26fdd9aa1770c (patch) | |
tree | 81f0e2ccb374274857322f9d9f9a37e18a645498 /lib/getndelim2.c | |
parent | 19e15828f69a5f47061de5e631fbe3fdbc666849 (diff) | |
download | gnulib-1af434e77bc9dcb94baaf1f6d9b26fdd9aa1770c.tar.gz |
(getndelim2): When size calculation overflows,
ceiling the allocation at NMAX bytes.
Diffstat (limited to 'lib/getndelim2.c')
-rw-r--r-- | lib/getndelim2.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/lib/getndelim2.c b/lib/getndelim2.c index 6f08689995..3959462593 100644 --- a/lib/getndelim2.c +++ b/lib/getndelim2.c @@ -81,18 +81,15 @@ getndelim2 (char **lineptr, size_t *linesize, size_t nmax, size_t newlinesize = (*linesize > MIN_CHUNK ? 2 * *linesize : *linesize + MIN_CHUNK); - if (newlinesize > nmax) + if (! (*linesize < newlinesize && newlinesize <= nmax)) newlinesize = nmax; - if (newlinesize > *linesize) - { - *linesize = newlinesize; - nbytes_avail = *linesize + *lineptr - read_pos; - *lineptr = realloc (*lineptr, *linesize); - if (!*lineptr) - return -1; - read_pos = *linesize - nbytes_avail + *lineptr; - } + *linesize = newlinesize; + nbytes_avail = *linesize + *lineptr - read_pos; + *lineptr = realloc (*lineptr, *linesize); + if (!*lineptr) + return -1; + read_pos = *linesize - nbytes_avail + *lineptr; } c = getc (stream); |