[libvirt] [PATCH V2] virconf: properly set the end of content
Jim Fehlig
jfehlig at suse.com
Wed Nov 8 23:07:55 UTC 2017
Opps, sorry for missing the 'PATCH V2' subject-prefix.
Regards,
Jim
On 11/08/2017 04:01 PM, Jim Fehlig wrote:
> There was a recent report of the xen-xl converter not handling
> config files missing an ending newline
>
> https://www.redhat.com/archives/libvir-list/2017-October/msg01353.html
>
> Commit 3cc2a9e0 fixed a similar problem when parsing content of a
> file but missed parsing in-memory content. But AFAICT, the better
> fix is to properly set the end of the content when initializing the
> virConfParserCtxt in virConfParse().
>
> This commit reverts the part of 3cc2a9e0 that appends a newline to
> files missing it, and fixes setting the end of content when
> initializing virConfParserCtxt. A test is also added to check
> parsing in-memory content missing an ending newline.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
> src/util/virconf.c | 13 ++--------
> tests/virconftest.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 71 insertions(+), 11 deletions(-)
>
> diff --git a/src/util/virconf.c b/src/util/virconf.c
> index 39c2bd917..a82a509ca 100644
> --- a/src/util/virconf.c
> +++ b/src/util/virconf.c
> @@ -705,7 +705,7 @@ virConfParse(const char *filename, const char *content, int len,
>
> ctxt.filename = filename;
> ctxt.base = ctxt.cur = content;
> - ctxt.end = content + len - 1;
> + ctxt.end = content + len;
> ctxt.line = 1;
>
> ctxt.conf = virConfCreate(filename, flags);
> @@ -745,7 +745,7 @@ virConfReadFile(const char *filename, unsigned int flags)
> {
> char *content;
> int len;
> - virConfPtr conf = NULL;
> + virConfPtr conf;
>
> VIR_DEBUG("filename=%s", NULLSTR(filename));
>
> @@ -757,17 +757,8 @@ 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 + 2) < 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/virconftest.c b/tests/virconftest.c
> index a8b18bae0..3cf0df3ac 100644
> --- a/tests/virconftest.c
> +++ b/tests/virconftest.c
> @@ -77,6 +77,72 @@ static int testConfRoundTrip(const void *opaque)
> }
>
>
> +static int testConfMemoryNoNewline(const void *opaque ATTRIBUTE_UNUSED)
> +{
> + const char *srcdata = \
> + "ullong = '123456789'\n" \
> + "string = 'foo'\n" \
> + "uint = 12345";
> +
> + virConfPtr conf = virConfReadString(srcdata, 0);
> + int ret = -1;
> + virConfValuePtr val;
> + unsigned long long llvalue;
> + char *str = NULL;
> + int uintvalue;
> +
> + if (!conf)
> + return -1;
> +
> + if (!(val = virConfGetValue(conf, "ullong")))
> + goto cleanup;
> +
> + if (val->type != VIR_CONF_STRING)
> + goto cleanup;
> +
> + if (virStrToLong_ull(val->str, NULL, 10, &llvalue) < 0)
> + goto cleanup;
> +
> + if (llvalue != 123456789) {
> + fprintf(stderr, "Expected '123' got '%llu'\n", llvalue);
> + goto cleanup;
> + }
> +
> + if (virConfGetValueType(conf, "string") !=
> + VIR_CONF_STRING) {
> + fprintf(stderr, "expected a string for 'string'\n");
> + goto cleanup;
> + }
> +
> + if (virConfGetValueString(conf, "string", &str) < 0)
> + goto cleanup;
> +
> + if (STRNEQ_NULLABLE(str, "foo")) {
> + fprintf(stderr, "Expected 'foo' got '%s'\n", str);
> + goto cleanup;
> + }
> +
> + if (virConfGetValueType(conf, "uint") != VIR_CONF_ULLONG) {
> + fprintf(stderr, "expected an unsigned long for 'uint'\n");
> + goto cleanup;
> + }
> +
> + if (virConfGetValueInt(conf, "uint", &uintvalue) < 0)
> + goto cleanup;
> +
> + if (uintvalue != 12345) {
> + fprintf(stderr, "Expected 12345 got %ud\n", uintvalue);
> + goto cleanup;
> + }
> +
> + ret = 0;
> + cleanup:
> + VIR_FREE(str);
> + virConfFree(conf);
> + return ret;
> +}
> +
> +
> static int testConfParseInt(const void *opaque ATTRIBUTE_UNUSED)
> {
> const char *srcdata = \
> @@ -414,6 +480,9 @@ mymain(void)
> if (virTestRun("no-newline", testConfRoundTrip, "no-newline") < 0)
> ret = -1;
>
> + if (virTestRun("memory-no-newline", testConfMemoryNoNewline, NULL) < 0)
> + ret = -1;
> +
> if (virTestRun("int", testConfParseInt, NULL) < 0)
> ret = -1;
>
>
More information about the libvir-list
mailing list