X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/b061a43bf32824cb214e9e3a29a974341de443d4..refs/heads/master:/stdio/FreeBSD/open_memstream.c?ds=sidebyside diff --git a/stdio/FreeBSD/open_memstream.c b/stdio/FreeBSD/open_memstream.c index a2d9bda..e36f3e6 100644 --- a/stdio/FreeBSD/open_memstream.c +++ b/stdio/FreeBSD/open_memstream.c @@ -31,12 +31,14 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #ifdef DEBUG #include #endif #include #include #include +#include #include /* XXX: There is no FPOS_MAX. This assumes fpos_t is an off_t. */ @@ -60,6 +62,18 @@ memstream_grow(struct memstream *ms, fpos_t newoff) else newsize = newoff; if (newsize > ms->len) { + /* + * Grow by 1.5x (15 / 10). + */ + ssize_t growsize; + bool ovf = os_mul_overflow(ms->len, 15, &growsize); + if (ovf) { + growsize = SSIZE_MAX - 1; + } else { + growsize /= 10; + } + newsize = MAX(growsize, newsize); + buf = realloc(*ms->bufp, newsize + 1); if (buf != NULL) { #ifdef DEBUG @@ -79,7 +93,6 @@ memstream_grow(struct memstream *ms, fpos_t newoff) static void memstream_update(struct memstream *ms) { - assert(ms->len >= 0 && ms->offset >= 0); *ms->sizep = ms->len < ms->offset ? ms->len : ms->offset; }