X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fgrab_file%2Fgrab_file.c;h=b3a2f54d512ea07f5c10b9e95c5cafbb59bd0771;hb=450a9a4c70af36f3be1eb572d513ffebf25c3797;hp=f21e1e5e3ac5356172d7406ff0f3b6c9faff8f18;hpb=a8b248ea9de55316cac4423a99a727ca7b54e0fc;p=ccan 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);