[libvirt] [PATCH v2] virconf: Handle conf file without ending newline

Laine Stump laine at laine.org
Thu Apr 21 20:30:35 UTC 2016


On 04/21/2016 11:15 AM, Cole Robinson wrote:
> $ 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

ACK (with the syntax-check fix squashed in, of course :-)




More information about the libvir-list mailing list