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
(cherry picked from commit 3cc2a9e0d4)
This commit is contained in:
Cole Robinson 2016-04-20 20:25:31 -04:00
parent 8ceb0feae3
commit ca9180ad63
4 changed files with 13 additions and 2 deletions

2
cfg.mk
View File

@ -1172,7 +1172,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 = \

View File

@ -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;

View File

@ -0,0 +1 @@
log_level=1

View File

@ -0,0 +1 @@
log_level = 1