fileio: fileno() can realistically return -1
An stdio FILE* stream usually refers to something with a file descriptor, but that's just "usually". It doesn't have to, when taking fmemopen() and similar into account. Most of our calls to fileno() assumed the call couldn't fail. In most cases this was correct, but in some cases where we didn't know whether we work on files or memory we'd use the returned fd as if it was unconditionally valid while it wasn't, and passed it to a multitude of kernel syscalls. Let's fix that, and do something reasonably smart when encountering this case. (Running test-fileio with this patch applied will remove tons of ioctl() calls on -1).
This commit is contained in:
@@ -294,7 +294,7 @@ int config_parse(const char *unit,
|
||||
_cleanup_fclose_ FILE *ours = NULL;
|
||||
unsigned line = 0, section_line = 0;
|
||||
bool section_ignored = false, bom_seen = false;
|
||||
int r;
|
||||
int r, fd;
|
||||
|
||||
assert(filename);
|
||||
assert(lookup);
|
||||
@@ -311,7 +311,9 @@ int config_parse(const char *unit,
|
||||
}
|
||||
}
|
||||
|
||||
fd_warn_permissions(filename, fileno(f));
|
||||
fd = fileno(f);
|
||||
if (fd >= 0) /* stream might not have an fd, let's be careful hence */
|
||||
fd_warn_permissions(filename, fd);
|
||||
|
||||
for (;;) {
|
||||
_cleanup_free_ char *buf = NULL;
|
||||
|
||||
Reference in New Issue
Block a user