From bec2b86cf36b320ebbc6f30b5f803f1681726049 Mon Sep 17 00:00:00 2001 From: Jann Horn Date: Mon, 19 Aug 2013 22:51:24 +0200 Subject: [PATCH] io: allow slurping files with a given size --- io.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/io.c b/io.c index d2b3197..3c0a8eb 100644 --- a/io.c +++ b/io.c @@ -67,6 +67,9 @@ PUBLIC_FN ssize_t write_nointr(int fd, void *buf, size_t count, int *last_res) { PUBLIC_CONST JH_SLURP_NO_STAT 1 PUBLIC_CONST JH_SLURP_REALLOC 2 /* realloc result block if it saves RAM */ PUBLIC_CONST JH_SLURP_8BYTE_PAD 4 /* pad buffer with eight nullbytes, not one */ +PUBLIC_CONST JH_SLURP_FIXSIZE 8 /* len_out is actually input and specifies +HEADER the expected length. if there is more data, +HEADER that might be ignored silently. */ PUBLIC_FN void *slurp_fd(int fd, size_t *len_out, int flags) { int errno_; @@ -75,6 +78,13 @@ PUBLIC_FN void *slurp_fd(int fd, size_t *len_out, int flags) { size_t size_guess = 1023; bool trusted_guess = false; /* can we rely on the guess? */ + if (flags&JH_SLURP_FIXSIZE) { + size_guess = *len_out; + trusted_guess = true; + // if we want a fixed size, of course we don't want to stat + flags |= JH_SLURP_NO_STAT; + } + int padlen = (flags&JH_SLURP_8BYTE_PAD)?8:1; // If we can determine the exact size, we don't have to guess. So try @@ -113,6 +123,12 @@ PUBLIC_FN void *slurp_fd(int fd, size_t *len_out, int flags) { char *buf_ = realloc(buf, done+padlen); if (buf_) buf = buf_; } + if (done != size_guess && (flags&JH_SLURP_FIXSIZE)) { + free(buf); + // not the most correct error message ever, but whatever. + errno = EFBIG; + return NULL; + } if (len_out) *len_out = done; return buf; } -- 2.20.1