From a668bfe88a48d433a81dad8219bd98fc73838eda Mon Sep 17 00:00:00 2001 From: Tiago Salem Herrmann Date: Tue, 12 Dec 2017 13:43:17 -0200 Subject: [PATCH 1/2] Use read_line() and LONG_LINE_MAX to read values configuration files. --- src/sysctl/sysctl.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c index 4c468d011ad..a1dc95b2bb2 100644 --- a/src/sysctl/sysctl.c +++ b/src/sysctl/sysctl.c @@ -106,16 +106,16 @@ static int parse_file(OrderedHashmap *sysctl_options, const char *path, bool ign log_debug("Parsing %s", path); for (;;) { - char l[LINE_MAX], *p, *value, *new_value, *property, *existing; + char *p, *value, *new_value, *property, *existing; + _cleanup_free_ char *l = NULL; void *v; int k; + k = read_line(f, LONG_LINE_MAX, &l); + if (k == 0) + break; - if (!fgets(l, sizeof(l), f)) { - if (feof(f)) - break; - - return log_error_errno(errno, "Failed to read file '%s', ignoring: %m", path); - } + if (k < 0) + return log_error_errno(k, "Failed to read file '%s', ignoring: %m", path); c++; From 12ec9c309967d663e93254e3fca835f9a240e26f Mon Sep 17 00:00:00 2001 From: Tiago Salem Herrmann Date: Tue, 12 Dec 2017 13:52:45 -0200 Subject: [PATCH 2/2] sysctl: disable buffer while writing to /proc fputs() writes only first 2048 bytes and fails to write to /proc when values are larger than that. This patch adds a new flag to WriteStringFileFlags that make it possible to disable the buffer under specific cases. --- src/basic/fileio.c | 3 +++ src/basic/fileio.h | 1 + src/shared/sysctl-util.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/basic/fileio.c b/src/basic/fileio.c index 12d6d06fa29..76c9333d261 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -167,6 +167,9 @@ int write_string_file_ts( } } + if (flags & WRITE_STRING_FILE_DISABLE_BUFFER) + setvbuf(f, NULL, _IONBF, 0); + r = write_string_stream_ts(f, line, flags, ts); if (r < 0) goto fail; diff --git a/src/basic/fileio.h b/src/basic/fileio.h index c283f41f09b..da5d5c66b51 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -35,6 +35,7 @@ typedef enum { WRITE_STRING_FILE_AVOID_NEWLINE = 1<<2, WRITE_STRING_FILE_VERIFY_ON_FAILURE = 1<<3, WRITE_STRING_FILE_SYNC = 1<<4, + WRITE_STRING_FILE_DISABLE_BUFFER = 1<<5, /* And before you wonder, why write_string_file_atomic_label_ts() is a separate function instead of just one more flag here: it's about linking: we don't want to pull -lselinux into all users of write_string_file() diff --git a/src/shared/sysctl-util.c b/src/shared/sysctl-util.c index 391065d804a..189580e3ed2 100644 --- a/src/shared/sysctl-util.c +++ b/src/shared/sysctl-util.c @@ -60,7 +60,7 @@ int sysctl_write(const char *property, const char *value) { log_debug("Setting '%s' to '%s'", property, value); p = strjoina("/proc/sys/", property); - return write_string_file(p, value, 0); + return write_string_file(p, value, WRITE_STRING_FILE_DISABLE_BUFFER); } int sysctl_read(const char *property, char **content) {