From fd3c6992d9fd0600483eb98ef3715e36ee371fba Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 21 May 2021 17:33:32 +0200 Subject: [PATCH] fileio: read_virtual_file() don't tweak buffer for returning it when we aren't returning it Let's avoid some redundant work. Moreover, let' not check for NUL bytes in the buffer if we don't return the buffer. --- src/basic/fileio.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 778e74d22c..cd6f2f7a77 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -478,28 +478,30 @@ int read_virtual_file(const char *filename, size_t max_size, char **ret_contents buf = mfree(buf); } - if (n < size) { - char *p; + if (ret_contents) { - /* Return rest of the buffer to libc */ - p = realloc(buf, n + 1); - if (!p) - return -ENOMEM; - buf = p; + /* Safety check: if the caller doesn't want to know the size of what we just read it will + * rely on the trailing NUL byte. But if there's an embedded NUL byte, then we should refuse + * operation as otherwise there'd be ambiguity about what we just read. */ + if (!ret_size && memchr(buf, 0, n)) + return -EBADMSG; + + if (n < size) { + char *p; + + /* Return rest of the buffer to libc */ + p = realloc(buf, n + 1); + if (!p) + return -ENOMEM; + buf = p; + } + + buf[n] = 0; + *ret_contents = TAKE_PTR(buf); } if (ret_size) *ret_size = n; - else if (memchr(buf, 0, n)) - /* Safety check: if the caller doesn't want to know the size of what we just read it will - * rely on the trailing NUL byte. But if there's an embedded NUL byte, then we should refuse - * operation as otherwise there'd be ambiguity about what we just read. */ - return -EBADMSG; - - buf[n] = 0; - - if (ret_contents) - *ret_contents = TAKE_PTR(buf); return !truncated; }