From 3cc2a9e0d412776a07780b090cf286cc603cea84 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 20 Apr 2016 20:25:31 -0400 Subject: [PATCH] virconf: Handle conf file without ending newline $ echo -n 'log_level=1' > ~/.config/libvirt/libvirtd.conf $ libvirtd --timeout=10 2014-10-10 10:30:56.394+0000: 6626: info : libvirt version: 1.1.3.6, package: 1.fc20 (Fedora Project, 2014-09-08-17:50:42, buildvm-05.phx2.fedoraproject.org) 2014-10-10 10:30:56.394+0000: 6626: error : main:1261 : Can't load config file: configuration file syntax error: /home/rjones/.config/libvirt/libvirtd.conf:1: expecting a value: /home/rjones/.config/libvirt/libvirtd.conf Rather than try to fix this in the depths of the parser, just catch the case when a config file doesn't end in a newline, and manually append a newline to the content before parsing https://bugzilla.redhat.com/show_bug.cgi?id=1151409 --- cfg.mk | 2 +- src/util/virconf.c | 11 ++++++++++- tests/confdata/no-newline.conf | 1 + tests/confdata/no-newline.out | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 tests/confdata/no-newline.conf create mode 100644 tests/confdata/no-newline.out diff --git a/cfg.mk b/cfg.mk index 16da2b3fb9..09ff9fa9ca 100644 --- a/cfg.mk +++ b/cfg.mk @@ -1179,7 +1179,7 @@ exclude_file_name_regexp--sc_prohibit_close = \ (\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir.+mock\.c)$$) exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \ - (^tests/(qemuhelp|nodeinfo|virpcitest)data/|\.diff$$) + (^tests/(qemuhelp|nodeinfo|virpcitest)data/|\.diff|tests/confdata/no-newline\.conf$$) _src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon) exclude_file_name_regexp--sc_prohibit_fork_wrappers = \ diff --git a/src/util/virconf.c b/src/util/virconf.c index 5915bc2f6d..7c98588dba 100644 --- a/src/util/virconf.c +++ b/src/util/virconf.c @@ -765,7 +765,7 @@ virConfReadFile(const char *filename, unsigned int flags) { char *content; int len; - virConfPtr conf; + virConfPtr conf = NULL; VIR_DEBUG("filename=%s", NULLSTR(filename)); @@ -777,8 +777,17 @@ virConfReadFile(const char *filename, unsigned int flags) if ((len = virFileReadAll(filename, MAX_CONFIG_FILE_SIZE, &content)) < 0) return NULL; + if (len && len < MAX_CONFIG_FILE_SIZE && content[len - 1] != '\n') { + VIR_DEBUG("appending newline to busted config file %s", filename); + if (VIR_REALLOC_N(content, len + 1) < 0) + goto cleanup; + content[len++] = '\n'; + content[len] = '\0'; + } + conf = virConfParse(filename, content, len, flags); + cleanup: VIR_FREE(content); return conf; diff --git a/tests/confdata/no-newline.conf b/tests/confdata/no-newline.conf new file mode 100644 index 0000000000..77e082e153 --- /dev/null +++ b/tests/confdata/no-newline.conf @@ -0,0 +1 @@ +log_level=1 \ No newline at end of file diff --git a/tests/confdata/no-newline.out b/tests/confdata/no-newline.out new file mode 100644 index 0000000000..c00176146c --- /dev/null +++ b/tests/confdata/no-newline.out @@ -0,0 +1 @@ +log_level = 1