From ba91d9ad7decb787e83c2826ba66bcaba670d450 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 11 Aug 2009 21:27:57 +0930 Subject: [PATCH] Fix multiply by three error, stat to get initial size. --- ccan/grab_file/grab_file.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/ccan/grab_file/grab_file.c b/ccan/grab_file/grab_file.c index f21e1e5e..b3a2f54d 100644 --- a/ccan/grab_file/grab_file.c +++ b/ccan/grab_file/grab_file.c @@ -9,18 +9,33 @@ void *grab_fd(const void *ctx, int fd, size_t *size) { int ret; - size_t max = 16384, s; + size_t max, s; char *buffer; + struct stat st; if (!size) size = &s; *size = 0; + if (fstat(fd, &st) == 0) + max = st.st_size; + else + max = 16384; + buffer = talloc_array(ctx, char, max+1); while ((ret = read(fd, buffer + *size, max - *size)) > 0) { *size += ret; - if (*size == max) - buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1); + if (*size == max) { + buffer = talloc_realloc(ctx, buffer, char, max*2+1); + if (!buffer) { + buffer = talloc_realloc(ctx, buffer, char, + max + 1024*1024 + 1); + if (!buffer) + return NULL; + max += 1024*1024; + } else + max *= 2; + } } if (ret < 0) { talloc_free(buffer); -- 2.39.2