From d6062e3b4fa041b070e0571f90f6c57faddcd56d Mon Sep 17 00:00:00 2001 From: Topi Miettinen Date: Fri, 1 Feb 2019 23:25:53 +0200 Subject: [PATCH 1/3] basic: change read_one_line_file() to return number of bytes read Change detect_vm_xen_dom0() to match new usage. --- src/basic/fileio.c | 4 +--- src/basic/virt.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/basic/fileio.c b/src/basic/fileio.c index e18b842999..91e0c9ec8b 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -212,7 +212,6 @@ int write_string_filef( int read_one_line_file(const char *fn, char **line) { _cleanup_fclose_ FILE *f = NULL; - int r; assert(fn); assert(line); @@ -223,8 +222,7 @@ int read_one_line_file(const char *fn, char **line) { (void) __fsetlocking(f, FSETLOCKING_BYCALLER); - r = read_line(f, LONG_LINE_MAX, line); - return r < 0 ? r : 0; + return read_line(f, LONG_LINE_MAX, line); } int verify_file(const char *fn, const char *blob, bool accept_extra_nl) { diff --git a/src/basic/virt.c b/src/basic/virt.c index f63f15f6c1..7766d9ca40 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -202,7 +202,7 @@ static int detect_vm_xen_dom0(void) { r = read_one_line_file(PATH_FEATURES, &domcap); if (r < 0 && r != -ENOENT) return r; - if (r == 0) { + if (r >= 0) { unsigned long features; /* Here, we need to use sscanf() instead of safe_atoul() From cbed254f9673256836554b0b6e16941747f925f8 Mon Sep 17 00:00:00 2001 From: Topi Miettinen Date: Thu, 31 Jan 2019 19:07:06 +0200 Subject: [PATCH 2/3] backlight: handle loading truncated file I had accidentally filled my /var partition. This caused backlight to fail to start even with disk space, because the brightness files were truncated to zero size: systemd-backlight[624]: acpi_video0: Failed to parse brightness "": Invalid argument systemd-backlight[624]: acpi_video0: Failed to write system 'brightness' attribute: No such device or address systemd[1]: systemd-backlight@backlight:acpi_video0.service: Main process exited, code=exited, status=1/FAILURE systemd[1]: systemd-backlight@backlight:acpi_video0.service: Failed with result 'exit-code'. systemd[1]: Failed to start Load/Save Screen Backlight Brightness of backlight:acpi_video0. Handle a truncated file like non-existent file. --- src/backlight/backlight.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c index 780ad56eb1..2fcc693c48 100644 --- a/src/backlight/backlight.c +++ b/src/backlight/backlight.c @@ -379,7 +379,7 @@ static int run(int argc, char *argv[]) { clamp = shall_clamp(device); r = read_one_line_file(saved, &value); - if (r == -ENOENT) { + if (IN_SET(r, -ENOENT, 0)) { const char *curval; /* Fallback to clamping current brightness or exit early if From a21760454db4b19e7299ead712fb895d8704b37d Mon Sep 17 00:00:00 2001 From: Topi Miettinen Date: Fri, 1 Feb 2019 23:52:00 +0200 Subject: [PATCH 3/3] Detect file truncation earlier in a few places Users of read_one_line_file() for APIVFS entries are ignored as they are assumed to never get truncated. --- src/basic/virt.c | 4 ++-- src/core/dynamic-user.c | 2 +- src/rfkill/rfkill.c | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/basic/virt.c b/src/basic/virt.c index 7766d9ca40..c7376bf5e4 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -469,11 +469,11 @@ int detect_container(void) { /* Otherwise, PID 1 might have dropped this information into a file in /run. This is better than accessing * /proc/1/environ, since we don't need CAP_SYS_PTRACE for that. */ r = read_one_line_file("/run/systemd/container", &m); - if (r >= 0) { + if (r > 0) { e = m; goto translate_name; } - if (r != -ENOENT) + if (!IN_SET(r, -ENOENT, 0)) return log_debug_errno(r, "Failed to read /run/systemd/container: %m"); /* Fallback for cases where PID 1 was not systemd (for example, cases where init=/bin/sh is used. */ diff --git a/src/core/dynamic-user.c b/src/core/dynamic-user.c index 530df70b80..7b00ee4bda 100644 --- a/src/core/dynamic-user.c +++ b/src/core/dynamic-user.c @@ -707,7 +707,7 @@ int dynamic_user_lookup_uid(Manager *m, uid_t uid, char **ret) { xsprintf(lock_path, "/run/systemd/dynamic-uid/" UID_FMT, uid); r = read_one_line_file(lock_path, &user); - if (r == -ENOENT) + if (IN_SET(r, -ENOENT, 0)) return -ESRCH; if (r < 0) return r; diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index ac21dc064c..8a92a4de6e 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -147,8 +147,8 @@ static int load_state(Context *c, const struct rfkill_event *event) { return r; r = read_one_line_file(state_file, &value); - if (r == -ENOENT) { - /* No state file? Then save the current state */ + if (IN_SET(r, -ENOENT, 0)) { + /* No state file or it's truncated? Then save the current state */ r = write_string_file(state_file, one_zero(event->soft), WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_ATOMIC); if (r < 0)