$ 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
---
v2:
Properly NULL deliminate string (thanks pkrempa)
Hey, there's a virconf test suite. Add a new test case
src/util/virconf.c | 11 ++++++++++-
tests/confdata/no-newline.conf | 1 +
tests/confdata/no-newline.out | 1 +
3 files changed, 12 insertions(+), 1 deletion(-)
create mode 100644 tests/confdata/no-newline.conf
create mode 100644 tests/confdata/no-newline.out
diff --git a/src/util/virconf.c b/src/util/virconf.c
index 5915bc2..7c98588 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 0000000..77e082e
--- /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 0000000..c001761
--- /dev/null
+++ b/tests/confdata/no-newline.out
@@ -0,0 +1 @@
+log_level = 1
--
2.7.3