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.
This commit is contained in:
Lennart Poettering
2021-05-21 21:54:43 +02:00
parent 259f6de486
commit fd3c6992d9
+19 -17
View File
@@ -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;
}