diff --git a/src/util/virconf.c b/src/util/virconf.c index 39c2bd9175..a82a509ca3 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 a8b18bae0f..3cf0df3ac0 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;