From 896beceba385daacafef5a46a0d7d4c4a8b519e7 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 17 May 2022 04:37:56 -0400 Subject: [PATCH] import vhostmd-1.1-11.el9 --- .gitignore | 1 + .vhostmd.metadata | 1 + ...ax-virtio-requirement-in-config-file.patch | 42 ++ ...bmetrics-Set-pointer-NULL-after-free.patch | 58 +++ ...ialize-local-variable-ret-to-failure.patch | 125 +++++ ...trics-Check-return-value-of-asprintf.patch | 67 +++ ...Remove-unsafe-XML_PARSE_NOENT-option.patch | 41 ++ ...e-libmetrics-mutex-is-unlocked-in-er.patch | 53 +++ ...libmetrics-Fix-potential-memory-leak.patch | 49 ++ ...roper-conversion-specifier-when-call.patch | 40 ++ ...s-Fix-potential-leak-of-FILE-pointer.patch | 75 +++ ...0010-util-Add-missing-call-to-va_end.patch | 55 +++ .../0011-util-Fix-potential-memory-leak.patch | 40 ++ ...12-util-Check-return-value-of-strstr.patch | 38 ++ .../0013-Check-return-value-of-asprintf.patch | 48 ++ ...-Fix-memory-leak-in-parse_transports.patch | 36 ++ ...Remove-unsafe-XML_PARSE_NOENT-option.patch | 36 ++ ...Check-return-value-of-file-functions.patch | 94 ++++ ...r-valide-file-handle-before-calling-.patch | 38 ++ ...ostmd-Fix-memory-leak-in-vhostmd_run.patch | 46 ++ ...-virtio-Fix-strncpy-length-parameter.patch | 36 ++ SOURCES/vhostmd.conf | 431 ++++++++++++++++++ SPECS/vhostmd.spec | 373 +++++++++++++++ 23 files changed, 1823 insertions(+) create mode 100644 .gitignore create mode 100644 .vhostmd.metadata create mode 100644 SOURCES/0001-Relax-virtio-requirement-in-config-file.patch create mode 100644 SOURCES/0002-libmetrics-Set-pointer-NULL-after-free.patch create mode 100644 SOURCES/0003-libmetrics-Initialize-local-variable-ret-to-failure.patch create mode 100644 SOURCES/0004-libmetrics-Check-return-value-of-asprintf.patch create mode 100644 SOURCES/0005-libmetrics-Remove-unsafe-XML_PARSE_NOENT-option.patch create mode 100644 SOURCES/0006-libmetrics-Ensure-libmetrics-mutex-is-unlocked-in-er.patch create mode 100644 SOURCES/0007-libmetrics-Fix-potential-memory-leak.patch create mode 100644 SOURCES/0008-libmetrics-Use-proper-conversion-specifier-when-call.patch create mode 100644 SOURCES/0009-libmetrics-Fix-potential-leak-of-FILE-pointer.patch create mode 100644 SOURCES/0010-util-Add-missing-call-to-va_end.patch create mode 100644 SOURCES/0011-util-Fix-potential-memory-leak.patch create mode 100644 SOURCES/0012-util-Check-return-value-of-strstr.patch create mode 100644 SOURCES/0013-Check-return-value-of-asprintf.patch create mode 100644 SOURCES/0014-vhostmd-Fix-memory-leak-in-parse_transports.patch create mode 100644 SOURCES/0015-vhostmd-Remove-unsafe-XML_PARSE_NOENT-option.patch create mode 100644 SOURCES/0016-vhostmd-Check-return-value-of-file-functions.patch create mode 100644 SOURCES/0017-vhostmd-Check-for-valide-file-handle-before-calling-.patch create mode 100644 SOURCES/0018-vhostmd-Fix-memory-leak-in-vhostmd_run.patch create mode 100644 SOURCES/0019-virtio-Fix-strncpy-length-parameter.patch create mode 100755 SOURCES/vhostmd.conf create mode 100644 SPECS/vhostmd.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cac46c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/vhostmd-1.1.tar.gz diff --git a/.vhostmd.metadata b/.vhostmd.metadata new file mode 100644 index 0000000..97fa25d --- /dev/null +++ b/.vhostmd.metadata @@ -0,0 +1 @@ +93e6bbbf15be248e7da222d377d2b98fb4c2be24 SOURCES/vhostmd-1.1.tar.gz diff --git a/SOURCES/0001-Relax-virtio-requirement-in-config-file.patch b/SOURCES/0001-Relax-virtio-requirement-in-config-file.patch new file mode 100644 index 0000000..f14d062 --- /dev/null +++ b/SOURCES/0001-Relax-virtio-requirement-in-config-file.patch @@ -0,0 +1,42 @@ +From 83cc269f6892852be94467cea771b3ad1da8a369 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 8 Oct 2019 20:56:18 -0600 +Subject: [PATCH 01/19] Relax virtio requirement in config file + +When the virtio transport was introduced the schema was changed to +require a transport in vhostmd.conf. When updating existing +deployments without a virtio transport specified in vhostmd.conf, +vhostmd fails to start + +/usr/sbin/vhostmd -d +/etc/vhostmd/vhostmd.conf:41: element globals: validity error : Element +globals content does not follow the DTD, expecting (disk , virtio , +update_period , path , transport+), got (disk update_period path transport ) +validate_config_file(): Failed to validate :/etc/vhostmd/vhostmd.conf +Config file: /etc/vhostmd/vhostmd.conf, fails DTD validation + +Relax the requirement for virtio transport in the schema. With the +introduction of multiple transports perhaps the others shoud be optional +as well, but requiring virtio is clearly a regression. + +Signed-off-by: Jim Fehlig +--- + vhostmd.dtd | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vhostmd.dtd b/vhostmd.dtd +index db417fd..888270e 100644 +--- a/vhostmd.dtd ++++ b/vhostmd.dtd +@@ -9,7 +9,7 @@ Virtual Host Metrics Daemon (vhostmd). Configuration file DTD + --> + + +- ++ + + + +-- +2.32.0 + diff --git a/SOURCES/0002-libmetrics-Set-pointer-NULL-after-free.patch b/SOURCES/0002-libmetrics-Set-pointer-NULL-after-free.patch new file mode 100644 index 0000000..5a1297a --- /dev/null +++ b/SOURCES/0002-libmetrics-Set-pointer-NULL-after-free.patch @@ -0,0 +1,58 @@ +From 06e73264b2338d20aa6e3f17b9820be3768439bf Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 16:14:18 -0700 +Subject: [PATCH 02/19] libmetrics: Set pointer NULL after free + +From a coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c:185:10: warning: Attempt to free released memory + free(mdisk->buffer); + +Some error conditions will call mdisk_content_free(), which could result +in a double-free when the entire mdisk is freed and mdisk_content_free() +is called again. Protect agains these potential double-frees by setting +the mdisk contents NULL after freeing them. + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 6c80681..a5582e7 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -177,14 +177,22 @@ static metric_disk * mdisk_alloc() + static void mdisk_content_free() + { + if (mdisk) { +- if (mdisk->doc) +- xmlFreeDoc(mdisk->doc); +- if (mdisk->pctxt) +- xmlFreeParserCtxt(mdisk->pctxt); +- if (mdisk->buffer) +- free(mdisk->buffer); +- if (mdisk->disk_name) +- free(mdisk->disk_name); ++ if (mdisk->doc) { ++ xmlFreeDoc(mdisk->doc); ++ mdisk->doc = NULL; ++ } ++ if (mdisk->pctxt) { ++ xmlFreeParserCtxt(mdisk->pctxt); ++ mdisk->pctxt = NULL; ++ } ++ if (mdisk->buffer) { ++ free(mdisk->buffer); ++ mdisk->buffer = NULL; ++ } ++ if (mdisk->disk_name) { ++ free(mdisk->disk_name); ++ mdisk->disk_name = NULL; ++ } + } + } + +-- +2.32.0 + diff --git a/SOURCES/0003-libmetrics-Initialize-local-variable-ret-to-failure.patch b/SOURCES/0003-libmetrics-Initialize-local-variable-ret-to-failure.patch new file mode 100644 index 0000000..290ead0 --- /dev/null +++ b/SOURCES/0003-libmetrics-Initialize-local-variable-ret-to-failure.patch @@ -0,0 +1,125 @@ +From 9db959c9e3f83cb2a4fc07534462e769990d9631 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 16:33:24 -0700 +Subject: [PATCH 03/19] libmetrics: Initialize local variable 'ret' to failure + +The get_mdef() and dump_xenstore_metrics() functions have local variables +named 'ret' that are initialized to zero, meaning success. In failure paths +'ret' is set to -1 before jumping to the 'out' label. Invert this logic by +initializing 'ret' to -1 and only setting it to success after the function +bodies have successfully executed. + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 16 ++++------------ + 1 file changed, 4 insertions(+), 12 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index a5582e7..49b38ea 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -228,7 +228,7 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + xmlNodePtr node; + char *str; + char *xpath; +- int ret = 0; ++ int ret = -1; + + ctxt = xmlXPathNewContext(mdisk->doc); + if (!ctxt) { +@@ -242,19 +242,16 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + if ((obj == NULL) || (obj->type != XPATH_NODESET)) { + libmsg("%s(): No metrics found that matches %s in context:%s or malformed definition\n", + __func__, pmdef->name, pmdef->context); +- ret = -1; + goto out; + } + if (xmlXPathNodeSetGetLength(obj->nodesetval) != 1) { + libmsg("%s(): No metrics found that matches %s in context:%s or malformed definition\n", + __func__, pmdef->name, pmdef->context); +- ret = -1; + goto out; + } + node = obj->nodesetval->nodeTab[0]; + if ((str = (char *)xmlGetProp(node, BAD_CAST "type")) == NULL) { + libmsg("%s(): Metric type not specified\n", __func__); +- ret = -1; + goto out; + } + metric_type_from_str((char *)str, &(pmdef->type)); +@@ -267,7 +264,6 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + free(xpath); + if ((obj == NULL) || (obj->type != XPATH_NODESET)) { + libmsg("%s(): No metrics value found!\n", __func__); +- ret = -1; + goto out; + } + +@@ -276,6 +272,7 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + str = (char *)xmlNodeListGetString(mdisk->doc, node, 1); + pmdef->value = strdup(str); + free(str); ++ ret = 0; + + out: + if (obj) +@@ -707,7 +704,7 @@ int dump_xenstore_metrics(const char *dest_file) + char *buf = NULL, *path = NULL, *metrics = NULL; + struct xs_handle *xsh = NULL; + unsigned int len; +- int ret = 0; ++ int ret = -1; + xmlParserCtxtPtr pctxt = NULL; + xmlDocPtr doc = NULL; + int domid; +@@ -726,35 +723,30 @@ int dump_xenstore_metrics(const char *dest_file) + + if ((domid = get_dom_id()) == -1) { + libmsg("Unable to derive domID.\n" ); +- ret = -1; + goto out; + } + + xsh = xs_domain_open(); + if (xsh == NULL) { + libmsg("xs_domain_open() error. errno: %d.\n", errno); +- ret = -1; + goto out; + } + + path = xs_get_domain_path(xsh, domid); + if (path == NULL) { + libmsg("xs_get_domain_path() error. domid %d.\n", 0); +- ret = -1; + goto out; + } + asprintf(&buf, "%s/metrics", path); + metrics = xs_read(xsh, XBT_NULL, buf, &len); + if (metrics == NULL) { + libmsg("xs_read(): uuid get error. %s.\n", buf); +- ret = -1; + goto out; + } + + pctxt = xmlNewParserCtxt(); + if (!pctxt || !pctxt->sax) { + libmsg("%s(): failed to create parser \n", __func__); +- ret = -1; + goto out; + } + +@@ -764,10 +756,10 @@ int dump_xenstore_metrics(const char *dest_file) + XML_PARSE_NOWARNING); + if (!doc) { + libmsg("%s(): libxml failed to xenstore metrics attribute\n", __func__); +- ret = -1; + goto out; + } + xmlDocFormatDump(fp, doc, 1); ++ ret = 0; + + out: + if (fp && fp != stdout) +-- +2.32.0 + diff --git a/SOURCES/0004-libmetrics-Check-return-value-of-asprintf.patch b/SOURCES/0004-libmetrics-Check-return-value-of-asprintf.patch new file mode 100644 index 0000000..967b012 --- /dev/null +++ b/SOURCES/0004-libmetrics-Check-return-value-of-asprintf.patch @@ -0,0 +1,67 @@ +From f659ec774221532cc5452a07418e2ab1385f162c Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 16:43:21 -0700 +Subject: [PATCH 04/19] libmetrics: Check return value of asprintf + +Exmaple from coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c: scope_hint: In function 'get_mdef' +vhostmd-1.1/libmetrics/libmetrics.c:231:4: warning: ignoring return value of 'asprintf', declared with attribute warn_unused_result [-Wunused-result] + asprintf(&xpath, "//metrics/metric[name='%s'][@context='%s']", pmdef->name, pmdef->context); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 49b38ea..4b2369a 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -236,7 +236,9 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + } + + /* Get the matching metric node type */ +- asprintf(&xpath, "//metrics/metric[name='%s'][@context='%s']", pmdef->name, pmdef->context); ++ if (asprintf(&xpath, "//metrics/metric[name='%s'][@context='%s']", pmdef->name, pmdef->context) < 0) ++ goto out; ++ + obj = xmlXPathEval(BAD_CAST xpath, ctxt); + free(xpath); + if ((obj == NULL) || (obj->type != XPATH_NODESET)) { +@@ -259,7 +261,9 @@ static int get_mdef(metric_disk *mdisk, private_metric *pmdef) + xmlXPathFreeObject(obj); + + /* Get the matching metric node value */ +- asprintf(&xpath, "//metrics/metric[name='%s'][@context='%s']/value/text()", pmdef->name, pmdef->context); ++ if (asprintf(&xpath, "//metrics/metric[name='%s'][@context='%s']/value/text()", pmdef->name, pmdef->context) < 0) ++ goto out; ++ + obj = xmlXPathEval( BAD_CAST xpath, ctxt); /* worked but no nodes */ + free(xpath); + if ((obj == NULL) || (obj->type != XPATH_NODESET)) { +@@ -349,7 +353,8 @@ retry: + strcmp(entry->d_name, "..") == 0) + continue; + +- asprintf(&path, "/dev/%s", entry->d_name); ++ if (asprintf(&path, "/dev/%s", entry->d_name) < 0) ++ goto error; + #else + path = strdup("/dev/shm/vhostmd0"); + #endif +@@ -737,7 +742,9 @@ int dump_xenstore_metrics(const char *dest_file) + libmsg("xs_get_domain_path() error. domid %d.\n", 0); + goto out; + } +- asprintf(&buf, "%s/metrics", path); ++ if (asprintf(&buf, "%s/metrics", path) , 0) ++ goto out; ++ + metrics = xs_read(xsh, XBT_NULL, buf, &len); + if (metrics == NULL) { + libmsg("xs_read(): uuid get error. %s.\n", buf); +-- +2.32.0 + diff --git a/SOURCES/0005-libmetrics-Remove-unsafe-XML_PARSE_NOENT-option.patch b/SOURCES/0005-libmetrics-Remove-unsafe-XML_PARSE_NOENT-option.patch new file mode 100644 index 0000000..8b64921 --- /dev/null +++ b/SOURCES/0005-libmetrics-Remove-unsafe-XML_PARSE_NOENT-option.patch @@ -0,0 +1,41 @@ +From 3d4f3acdfc9f937bea946bb1c7dfad1f3516a6ce Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 17:42:39 -0700 +Subject: [PATCH 05/19] libmetrics: Remove unsafe XML_PARSE_NOENT option + +From coverity scan + +Error: UNSAFE_XML_PARSE_CONFIG: +vhostmd-1.1/libmetrics/libmetrics.c:412: unsafe_xml_parse_config: XML parse option should not have flag "XML_PARSE_NOENT" set, which is vulnerable to XML external entity attack. + 410| mdisk->doc = xmlCtxtReadMemory(mdisk->pctxt, mdisk->buffer, + 411| mdisk->length, "mdisk.xml", NULL, + 412|-> XML_PARSE_NOENT | XML_PARSE_NONET | + 413| XML_PARSE_NOWARNING); + 414| if (!mdisk->doc) { + +It should be safe to remove the option. + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 4b2369a..2819f80 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -418,9 +418,8 @@ retry: + } + + mdisk->doc = xmlCtxtReadMemory(mdisk->pctxt, mdisk->buffer, +- mdisk->length, "mdisk.xml", NULL, +- XML_PARSE_NOENT | XML_PARSE_NONET | +- XML_PARSE_NOWARNING); ++ mdisk->length, "mdisk.xml", NULL, ++ XML_PARSE_NONET | XML_PARSE_NOWARNING); + if (!mdisk->doc) { + libmsg("%s(): libxml failed to parse mdisk.xml buffer\n", __func__); + goto error; +-- +2.32.0 + diff --git a/SOURCES/0006-libmetrics-Ensure-libmetrics-mutex-is-unlocked-in-er.patch b/SOURCES/0006-libmetrics-Ensure-libmetrics-mutex-is-unlocked-in-er.patch new file mode 100644 index 0000000..f23d4af --- /dev/null +++ b/SOURCES/0006-libmetrics-Ensure-libmetrics-mutex-is-unlocked-in-er.patch @@ -0,0 +1,53 @@ +From 855326a8c9ec1a599354f743fb5391a2766a2a9c Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 17:47:10 -0700 +Subject: [PATCH 06/19] libmetrics: Ensure libmetrics mutex is unlocked in + error paths + +From coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c:595: missing_unlock: Returning without unlocking "libmetrics_mutex". + 593| if (mdisk_alloc() == NULL) { + 594| errno = ENOMEM; + 595|-> return -1; + 596| } + 597| read_mdisk(mdisk); + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 2819f80..756645c 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -601,7 +601,7 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + mdisk_free(); + if (mdisk_alloc() == NULL) { + errno = ENOMEM; +- return -1; ++ goto out; + } + read_mdisk(mdisk); + } +@@ -620,7 +620,7 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + + if ((lmdef = metric_alloc_padded(extra_len)) == NULL) { + errno = ENOMEM; +- return -1; ++ goto out; + } + + lmdef->type = pmdef.type; +@@ -635,6 +635,7 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + if (pmdef.context) + free(pmdef.context); + ++out: + /* unlock library data */ + pthread_mutex_unlock(&libmetrics_mutex); + return ret; +-- +2.32.0 + diff --git a/SOURCES/0007-libmetrics-Fix-potential-memory-leak.patch b/SOURCES/0007-libmetrics-Fix-potential-memory-leak.patch new file mode 100644 index 0000000..4f20b0b --- /dev/null +++ b/SOURCES/0007-libmetrics-Fix-potential-memory-leak.patch @@ -0,0 +1,49 @@ +From 2cbce5fcb652226bf159f9cd9649f5869d76f6b7 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 18:40:33 -0700 +Subject: [PATCH 07/19] libmetrics: Fix potential memory leak + +From coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c:613:18: warning: Potential leak of memory pointed to by 'pmdef.context' + errno = ENOMEM; + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 756645c..6817df9 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -586,7 +586,8 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + int ret = -1; + + *mdef = NULL; +- ++ memset(&pmdef, 0, sizeof(private_metric)); ++ + if (mdisk == NULL) { + errno = ENODEV; + return -1; +@@ -628,6 +629,8 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + *mdef = lmdef; + ret = 0; + } ++ ++out: + if (pmdef.name) + free(pmdef.name); + if (pmdef.value) +@@ -635,7 +638,6 @@ int get_metric(const char *metric_name, metric **mdef, metric_context context) + if (pmdef.context) + free(pmdef.context); + +-out: + /* unlock library data */ + pthread_mutex_unlock(&libmetrics_mutex); + return ret; +-- +2.32.0 + diff --git a/SOURCES/0008-libmetrics-Use-proper-conversion-specifier-when-call.patch b/SOURCES/0008-libmetrics-Use-proper-conversion-specifier-when-call.patch new file mode 100644 index 0000000..5200180 --- /dev/null +++ b/SOURCES/0008-libmetrics-Use-proper-conversion-specifier-when-call.patch @@ -0,0 +1,40 @@ +From bc5da0b99699bbeb653b86398a7112bc0885c31e Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 18:51:40 -0700 +Subject: [PATCH 08/19] libmetrics: Use proper conversion specifier when + calling log function + +From coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c:817: invalid_type: Argument "5L" to format specifier "%u" was expected to have type "unsigned int" but has type "long". + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 6817df9..0f4cf70 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -823,7 +823,7 @@ static char *get_virtio_metrics(void) + usleep(10000); + if (time(NULL) > end_time) { + libmsg("%s(): Unable to send metrics request" +- " - timeout after %us\n", __func__, timeout); ++ " - timeout after %lis\n", __func__, timeout); + goto error; + } + } +@@ -856,7 +856,7 @@ static char *get_virtio_metrics(void) + usleep(10000); + if (time(NULL) > end_time) { + libmsg("%s(): Unable to read metrics" +- " - timeout after %us\n", __func__, timeout); ++ " - timeout after %lis\n", __func__, timeout); + goto error; + } + } else +-- +2.32.0 + diff --git a/SOURCES/0009-libmetrics-Fix-potential-leak-of-FILE-pointer.patch b/SOURCES/0009-libmetrics-Fix-potential-leak-of-FILE-pointer.patch new file mode 100644 index 0000000..8206fd2 --- /dev/null +++ b/SOURCES/0009-libmetrics-Fix-potential-leak-of-FILE-pointer.patch @@ -0,0 +1,75 @@ +From cba4dddebc56886034038f907085da3c6b50baab Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Mon, 6 Jan 2020 18:59:18 -0700 +Subject: [PATCH 09/19] libmetrics: Fix potential leak of FILE pointer + +From coverity scan + +vhostmd-1.1/libmetrics/libmetrics.c:892: alloc_fn: Storage is returned from allocation function "fopen". +vhostmd-1.1/libmetrics/libmetrics.c:892: var_assign: Assigning: "fp" = storage returned from "fopen(dest_file, "w")". +vhostmd-1.1/libmetrics/libmetrics.c:900: noescape: Resource "fp" is not freed or pointed-to in "fwrite". +vhostmd-1.1/libmetrics/libmetrics.c:909: leaked_storage: Variable "fp" going out of scope leaks the storage it points to. + 907| free(response); + 908| + 909|-> return 0; + 910| + 911| error: + +Signed-off-by: Jim Fehlig +--- + libmetrics/libmetrics.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c +index 0f4cf70..8819074 100644 +--- a/libmetrics/libmetrics.c ++++ b/libmetrics/libmetrics.c +@@ -890,10 +890,11 @@ int dump_virtio_metrics(const char *dest_file) + FILE *fp = stdout; + char *response = NULL; + size_t len; ++ int ret = -1; + + response = get_virtio_metrics(); + if (response == NULL) +- goto error; ++ return -1; + + len = strlen(response); + +@@ -902,27 +903,24 @@ int dump_virtio_metrics(const char *dest_file) + if (fp == NULL) { + libmsg("%s(), unable to dump metrics: fopen(%s) %s\n", + __func__, dest_file, strerror(errno)); +- goto error; ++ goto out; + } + } + + if (fwrite(response, 1UL, len, fp) != len) { + libmsg("%s(), unable to export metrics to file:%s %s\n", + __func__, dest_file ? dest_file : "stdout", strerror(errno)); +- goto error; ++ goto out; + } + +- if (response) +- free(response); ++ ret = 0; + +- return 0; +- +- error: ++out: + if (dest_file && fp) + fclose(fp); + + if (response) + free(response); + +- return -1; ++ return ret; + } +-- +2.32.0 + diff --git a/SOURCES/0010-util-Add-missing-call-to-va_end.patch b/SOURCES/0010-util-Add-missing-call-to-va_end.patch new file mode 100644 index 0000000..dfe25fd --- /dev/null +++ b/SOURCES/0010-util-Add-missing-call-to-va_end.patch @@ -0,0 +1,55 @@ +From 69fcc2075d7cb1f16eb7d27ae3559fa3c77f5514 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 7 Jan 2020 11:36:56 -0700 +Subject: [PATCH 10/19] util: Add missing call to va_end + +From coverity scan + +Error: VARARGS (CWE-237): +vhostmd-1.1/vhostmd/util.c:209: va_init: Initializing va_list "argptr". +vhostmd-1.1/vhostmd/util.c:218: missing_va_end: va_end was not called for "argptr". + 216| grow_size = (count > 1000) ? count : 1000; + 217| if (buffer_grow(buf, grow_size) < 0) + 218|-> return; + 219| + 220| size = buf->size - buf->use - 1; + +Error: VARARGS (CWE-237): +vhostmd-1.1/vhostmd/util.c:209: va_init: Initializing va_list "argptr". +vhostmd-1.1/vhostmd/util.c:226: missing_va_end: va_end was not called for "argptr". + 224| buf->use += count; + 225| buf->content[buf->use] = '\0'; + 226|-> } + 227| + 228| /* + +Signed-off-by: Jim Fehlig +--- + vhostmd/util.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/vhostmd/util.c b/vhostmd/util.c +index 5747f16..1f9545b 100644 +--- a/vhostmd/util.c ++++ b/vhostmd/util.c +@@ -214,13 +214,16 @@ void vu_buffer_vsprintf(vu_buffer *buf, const char *format, ...) + va_end(locarg); + + grow_size = (count > 1000) ? count : 1000; +- if (buffer_grow(buf, grow_size) < 0) ++ if (buffer_grow(buf, grow_size) < 0) { ++ va_end(argptr); + return; ++ } + + size = buf->size - buf->use - 1; + va_copy(locarg, argptr); + } + va_end(locarg); ++ va_end(argptr); + buf->use += count; + buf->content[buf->use] = '\0'; + } +-- +2.32.0 + diff --git a/SOURCES/0011-util-Fix-potential-memory-leak.patch b/SOURCES/0011-util-Fix-potential-memory-leak.patch new file mode 100644 index 0000000..418b678 --- /dev/null +++ b/SOURCES/0011-util-Fix-potential-memory-leak.patch @@ -0,0 +1,40 @@ +From b39f7cc778903e9cda8aa46d170b9efe80efda89 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 7 Jan 2020 11:41:11 -0700 +Subject: [PATCH 11/19] util: Fix potential memory leak + +From coverity scan + +vhostmd-1.1/vhostmd/util.c:415:14: warning: Potential leak of memory pointed to by 'cp' + return(NULL); + +Signed-off-by: Jim Fehlig +--- + vhostmd/util.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/vhostmd/util.c b/vhostmd/util.c +index 1f9545b..599c5c7 100644 +--- a/vhostmd/util.c ++++ b/vhostmd/util.c +@@ -415,7 +415,7 @@ char *vu_str_replace(const char *haystack, const char *origstr, const char *news + + dest = malloc(strlen(haystack) - (origlen * cnt) + (newlen * cnt) + 1); + if (dest == NULL) { +- return(NULL); ++ goto out; + } + *dest = '\0'; + +@@ -428,6 +428,8 @@ char *vu_str_replace(const char *haystack, const char *origstr, const char *news + cp = p + origlen; + } + strcat(dest, cp); ++ ++out: + free(tempstr); + + return dest; +-- +2.32.0 + diff --git a/SOURCES/0012-util-Check-return-value-of-strstr.patch b/SOURCES/0012-util-Check-return-value-of-strstr.patch new file mode 100644 index 0000000..0f4219a --- /dev/null +++ b/SOURCES/0012-util-Check-return-value-of-strstr.patch @@ -0,0 +1,38 @@ +From 4350fcf7a5c4cb7d803db1a0df2b757230b90e25 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 7 Jan 2020 11:47:33 -0700 +Subject: [PATCH 12/19] util: Check return value of strstr + +From coverity scan + +vhostmd-1.1/vhostmd/util.c:421: returned_null: "strstr" returns "NULL" (checked 6 out of 7 times). + +Signed-off-by: Jim Fehlig +--- + vhostmd/util.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/vhostmd/util.c b/vhostmd/util.c +index 599c5c7..317dbc6 100644 +--- a/vhostmd/util.c ++++ b/vhostmd/util.c +@@ -422,10 +422,12 @@ char *vu_str_replace(const char *haystack, const char *origstr, const char *news + cp = tempstr; + for (i=0; i +Date: Tue, 7 Jan 2020 11:52:23 -0700 +Subject: [PATCH 13/19] Check return value of asprintf + +Example from coverity scan + +vhostmd-1.1/vhostmd/util.c: scope_hint: In function 'vu_append_string' +vhostmd-1.1/vhostmd/util.c:484:7: warning: ignoring return value of 'asprintf', declared with attribute warn_unused_result [-Wunused-result] + asprintf(&cp, "%s,%s", *dest, str); + +Signed-off-by: Jim Fehlig +--- + vhostmd/util.c | 3 ++- + vhostmd/vhostmd.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/vhostmd/util.c b/vhostmd/util.c +index 317dbc6..d7ce3fc 100644 +--- a/vhostmd/util.c ++++ b/vhostmd/util.c +@@ -488,7 +488,8 @@ int vu_append_string(char **dest, xmlChar * str) + char *cp; + + if (*dest) { +- asprintf(&cp, "%s,%s", *dest, str); ++ if (asprintf(&cp, "%s,%s", *dest, str) < 0) ++ return -1; + free(*dest); + *dest = cp; + } +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 7e29e6f..7374ec9 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -259,7 +259,8 @@ static int parse_group_metric(xmlDocPtr xml ATTRIBUTE_UNUSED, + vu_log(VHOSTMD_WARN, "parse_group_metric: node path not found"); + return -1; + } +- asprintf(&cp, "%s/variable", path); ++ if (asprintf(&cp, "%s/variable", path) < 0) ++ goto error; + + obj = xmlXPathEval( BAD_CAST cp, ctxt); + if ((obj == NULL) || (obj->type != XPATH_NODESET)) { +-- +2.32.0 + diff --git a/SOURCES/0014-vhostmd-Fix-memory-leak-in-parse_transports.patch b/SOURCES/0014-vhostmd-Fix-memory-leak-in-parse_transports.patch new file mode 100644 index 0000000..3b838e5 --- /dev/null +++ b/SOURCES/0014-vhostmd-Fix-memory-leak-in-parse_transports.patch @@ -0,0 +1,36 @@ +From 71a94a18c470ebbd870253b8aedbb7b3b24a274b Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 15:08:54 -0700 +Subject: [PATCH 14/19] vhostmd: Fix memory leak in parse_transports + +From coverity scan + +vhostmd-1.1/vhostmd/vhostmd.c:455: alloc_fn: Storage is returned from allocation function "xmlXPathEval". +vhostmd-1.1/vhostmd/vhostmd.c:455: var_assign: Assigning: "obj" = storage returned from "xmlXPathEval((xmlChar *)"//vhostmd/globals/transport", ctxt)". +vhostmd-1.1/vhostmd/vhostmd.c:474: leaked_storage: Variable "obj" going out of scope leaks the storage it points to. + 472| #else + 473| vu_log (VHOSTMD_ERR, "No support for xenstore transport in this vhostmd"); + 474|-> return -1; + 475| #endif + 476| } + +Signed-off-by: Jim Fehlig +--- + vhostmd/vhostmd.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 7374ec9..3d1d53e 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -472,6 +472,7 @@ static int parse_transports(xmlDocPtr xml, + transports |= XENSTORE; + #else + vu_log (VHOSTMD_ERR, "No support for xenstore transport in this vhostmd"); ++ xmlXPathFreeObject(obj); + return -1; + #endif + } +-- +2.32.0 + diff --git a/SOURCES/0015-vhostmd-Remove-unsafe-XML_PARSE_NOENT-option.patch b/SOURCES/0015-vhostmd-Remove-unsafe-XML_PARSE_NOENT-option.patch new file mode 100644 index 0000000..9872d7d --- /dev/null +++ b/SOURCES/0015-vhostmd-Remove-unsafe-XML_PARSE_NOENT-option.patch @@ -0,0 +1,36 @@ +From d9eeede678521776d327784d0307de6c98920bb8 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 15:12:28 -0700 +Subject: [PATCH 15/19] vhostmd: Remove unsafe XML_PARSE_NOENT option + +From coverity scan + +vhostmd-1.1/vhostmd/vhostmd.c:553: unsafe_xml_parse_config: XML parse option should not have flag "XML_PARSE_NOENT" set, which is vulnerable to XML external entty attack. + 551| + 552| xml = xmlCtxtReadFile(pctxt, filename, NULL, + 553|-> XML_PARSE_NOENT | XML_PARSE_NONET | + 554| XML_PARSE_NOWARNING); + 555| if (!xml) { + +Signed-off-by: Jim Fehlig +--- + vhostmd/vhostmd.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 3d1d53e..4d04989 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -552,8 +552,7 @@ static int parse_config_file(const char *filename) + goto out; + + xml = xmlCtxtReadFile(pctxt, filename, NULL, +- XML_PARSE_NOENT | XML_PARSE_NONET | +- XML_PARSE_NOWARNING); ++ XML_PARSE_NONET | XML_PARSE_NOWARNING); + if (!xml) { + vu_log(VHOSTMD_ERR, "libxml failed to parse config file %s", + filename); +-- +2.32.0 + diff --git a/SOURCES/0016-vhostmd-Check-return-value-of-file-functions.patch b/SOURCES/0016-vhostmd-Check-return-value-of-file-functions.patch new file mode 100644 index 0000000..2597209 --- /dev/null +++ b/SOURCES/0016-vhostmd-Check-return-value-of-file-functions.patch @@ -0,0 +1,94 @@ +From 4f7b23e19c88c92d834d5f975c846b47eaa03c79 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 15:33:39 -0700 +Subject: [PATCH 16/19] vhostmd: Check return value of file functions + +Check return value of ftruncate, lseek, and write functions as +reported by coverity. Example from coverity scan + +vhostmd-1.1/vhostmd/vhostmd.c: scope_hint: In function 'metrics_disk_create' +vhostmd-1.1/vhostmd/vhostmd.c:821:4: warning: ignoring return value of 'ftruncate', declared with attribute warn_unused_result [-Wunused-result] + ftruncate(fd, mdisk_size); + ^~~~~~~~~~~~~~~~~~~~~~~~~ + 819| + 820| /* truncate to a possible new size */ + 821|-> ftruncate(fd, mdisk_size); + 822| + 823| /* zero fill metrics data */ + +Signed-off-by: Jim Fehlig +--- + vhostmd/vhostmd.c | 33 +++++++++++++++++++++++++-------- + 1 file changed, 25 insertions(+), 8 deletions(-) + +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 4d04989..1600a87 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -675,8 +675,12 @@ static int metrics_disk_busy(int fd, int busy) + { + md_header.busy = (uint32_t)(htonl(busy)); + +- lseek(fd, offsetof(mdisk_header, busy), SEEK_SET); +- write(fd, &(md_header.busy), sizeof(uint32_t)); ++ if (lseek(fd, offsetof(mdisk_header, busy), SEEK_SET) == -1) ++ return -1; ++ ++ if (write(fd, &(md_header.busy), sizeof(uint32_t)) == -1) ++ return -1; ++ + return 0; + } + +@@ -724,6 +728,8 @@ error: + + static int metrics_disk_update(int fd, vu_buffer *buf) + { ++ int ret = -1; ++ + if (buf->use > MDISK_SIZE) { + vu_log(VHOSTMD_ERR, "Metrics data is larger than metrics disk"); + return -1; +@@ -731,11 +737,17 @@ static int metrics_disk_update(int fd, vu_buffer *buf) + + metrics_disk_busy(fd, 1); + metrics_disk_header_update(fd, buf); +- lseek(fd, MDISK_HEADER_SIZE, SEEK_SET); +- write(fd, buf->content, buf->use); ++ if (lseek(fd, MDISK_HEADER_SIZE, SEEK_SET) == -1) ++ goto out; ++ ++ if (write(fd, buf->content, buf->use) == -1) ++ goto out; ++ ++ ret = 0; ++ ++out: + metrics_disk_busy(fd, 0); +- +- return 0; ++ return ret; + } + + static int metrics_free() +@@ -819,10 +831,15 @@ static int metrics_disk_create(void) + } + + /* truncate to a possible new size */ +- ftruncate(fd, mdisk_size); ++ if (ftruncate(fd, mdisk_size) == -1){ ++ vu_log(VHOSTMD_ERR, "Failed to truncate metrics disk: %s", ++ strerror(errno)); ++ goto error; ++ } + + /* zero fill metrics data */ +- lseek(fd, MDISK_HEADER_SIZE, SEEK_SET); ++ if (lseek(fd, MDISK_HEADER_SIZE, SEEK_SET) == -1) ++ goto error; + for (i = 0; i < size / MDISK_SIZE_MIN; i++) + if (write(fd, buf, MDISK_SIZE_MIN) != MDISK_SIZE_MIN) { + vu_log(VHOSTMD_ERR, "Error creating disk of requested " +-- +2.32.0 + diff --git a/SOURCES/0017-vhostmd-Check-for-valide-file-handle-before-calling-.patch b/SOURCES/0017-vhostmd-Check-for-valide-file-handle-before-calling-.patch new file mode 100644 index 0000000..5222522 --- /dev/null +++ b/SOURCES/0017-vhostmd-Check-for-valide-file-handle-before-calling-.patch @@ -0,0 +1,38 @@ +From d86c51d98ce8b891f3948f8aa54fc9634e6a8c67 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 16:04:09 -0700 +Subject: [PATCH 17/19] vhostmd: Check for valide file handle before calling + close + +From coverity scan + +vhostmd-1.1/vhostmd/vhostmd.c:778: var_tested_neg: Assigning: "fd" = a negative value. +vhostmd-1.1/vhostmd/vhostmd.c:845: negative_returns: "fd" is passed to a parameter that cannot be negative. + 843| free(dir); + 844| free(buf); + 845|-> close(fd); + 846| return -1; + 847| } + +Signed-off-by: Jim Fehlig +--- + vhostmd/vhostmd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 1600a87..1395bc5 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -860,7 +860,8 @@ static int metrics_disk_create(void) + error: + free(dir); + free(buf); +- close(fd); ++ if (fd != -1) ++ close(fd); + return -1; + } + +-- +2.32.0 + diff --git a/SOURCES/0018-vhostmd-Fix-memory-leak-in-vhostmd_run.patch b/SOURCES/0018-vhostmd-Fix-memory-leak-in-vhostmd_run.patch new file mode 100644 index 0000000..1480307 --- /dev/null +++ b/SOURCES/0018-vhostmd-Fix-memory-leak-in-vhostmd_run.patch @@ -0,0 +1,46 @@ +From ff6959fd9203c667f6b4c95fa812621cc91dc42e Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 16:08:42 -0700 +Subject: [PATCH 18/19] vhostmd: Fix memory leak in vhostmd_run + +Example from coverity scan + +vhostmd-1.1/vhostmd/vhostmd.c:940: alloc_arg: "vu_buffer_create" allocates memory that is stored into "buf". +vhostmd-1.1/vhostmd/vhostmd.c:959: leaked_storage: Variable "buf" going out of scope leaks the storage it points to. + 957| vu_log(VHOSTMD_ERR, "Failed to start virtio thread '%s'\n", + 958| strerror(rc)); + 959|-> return -1; + 960| } + 961| } + +Signed-off-by: Jim Fehlig +--- + vhostmd/vhostmd.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/vhostmd/vhostmd.c b/vhostmd/vhostmd.c +index 1395bc5..6f3709b 100644 +--- a/vhostmd/vhostmd.c ++++ b/vhostmd/vhostmd.c +@@ -967,14 +967,17 @@ static int vhostmd_run(int diskfd) + if (virtio_expiration_time < (update_period * 3)) + virtio_expiration_time = update_period * 3; + +- if (virtio_init(virtio_max_channels, virtio_expiration_time)) ++ if (virtio_init(virtio_max_channels, virtio_expiration_time)) { ++ vu_buffer_delete(buf); + return -1; ++ } + + rc = pthread_create(&virtio_tid, NULL, virtio_run, NULL); + + if (rc != 0) { + vu_log(VHOSTMD_ERR, "Failed to start virtio thread '%s'\n", + strerror(rc)); ++ vu_buffer_delete(buf); + return -1; + } + } +-- +2.32.0 + diff --git a/SOURCES/0019-virtio-Fix-strncpy-length-parameter.patch b/SOURCES/0019-virtio-Fix-strncpy-length-parameter.patch new file mode 100644 index 0000000..97c6a57 --- /dev/null +++ b/SOURCES/0019-virtio-Fix-strncpy-length-parameter.patch @@ -0,0 +1,36 @@ +From 99995e4ba138f43b277620bd43a096c72f354548 Mon Sep 17 00:00:00 2001 +From: Jim Fehlig +Date: Tue, 14 Jan 2020 16:22:48 -0700 +Subject: [PATCH 19/19] virtio: Fix strncpy length parameter + +Leave an extra byte for null-terminator in call to strncpy. From +coverity scan + +vhostmd-1.1/vhostmd/virtio.c:194: buffer_size_warning: Calling "strncpy" with a maximum size argument of 108 bytes on destination array "address.sun_path" of size 108 bytes might leave the destination string unterminated. + 192| address.sun_family = AF_LOCAL; + 193| + 194|-> strncpy(address.sun_path, c->uds_name, SUN_PATH_LEN); + 195| + 196| if ((c->fd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) + +Signed-off-by: Jim Fehlig +--- + vhostmd/virtio.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vhostmd/virtio.c b/vhostmd/virtio.c +index f227b45..a6c2515 100644 +--- a/vhostmd/virtio.c ++++ b/vhostmd/virtio.c +@@ -191,7 +191,7 @@ static int vio_channel_open(channel_t * c) + bzero(&address, sizeof(address)); + address.sun_family = AF_LOCAL; + +- strncpy(address.sun_path, c->uds_name, SUN_PATH_LEN); ++ strncpy(address.sun_path, c->uds_name, SUN_PATH_LEN - 1); + + if ((c->fd = socket(AF_LOCAL, SOCK_STREAM, 0)) == -1) + goto error; +-- +2.32.0 + diff --git a/SOURCES/vhostmd.conf b/SOURCES/vhostmd.conf new file mode 100755 index 0000000..955dd2f --- /dev/null +++ b/SOURCES/vhostmd.conf @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + host-metrics-disk + /dev/shm/vhostmd0 + + 256 + + + 1024 + 15 + + 60 + /bin:/sbin:/usr/bin:/usr/sbin:/usr/share/vhostmd/scripts + vbd + + virtio + + + + HostName + hostname + + + Time + date +%s + + + VirtualizationVendor + + rpm -q --queryformat "%{VENDOR}\n" libvirt | sort -u + + + + + VirtProductInfo + + virsh -r CONNECT version \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "USING_API" { print $2; }' + + + + + HostSystemInfo + hostname -s + + + + NumberOfPhysicalCPUs + + + + + + + + virsh -r CONNECT nodeinfo \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "CPU(S)" { print $2; }' + + + + + MemoryAllocatedToVirtualServers + + + + + free|egrep -i '^[[:space:]]*(Mem:)' \ + | awk 'BEGIN { sum = 0; } + { sum += $3; } + END { printf "%d\n", sum/1024; }' + + + + + FreePhysicalMemory + + free|egrep -i '^[[:space:]]*(Mem:)' \ + | awk 'BEGIN { sum = 0; } + { sum += $4; } + END { printf "%d\n", sum/1024; }' + + + + + FreeVirtualMemory + + free|egrep -i '^[[:space:]]*(Mem:|Swap:)' \ + | awk 'BEGIN { sum = 0; } + { sum += $4; } + END { printf "%d\n", sum/1024; }' + + + + + UsedVirtualMemory + + free|egrep -i '^[[:space:]]*(Mem:|Swap:)' \ + | awk 'BEGIN { sum = 0; } + { sum += $3; } + END { printf "%d\n", sum/1024; }' + + + + + PagedInMemory + + vmstat -s | awk 'BEGIN { + cmd = "getconf PAGESIZE"; + cmd | getline pagesize; + close(cmd); + } + /pages swapped in/ { + printf "%d\n", $1 / 1024 * pagesize / 1024; + }' + + + + + PagedOutMemory + + vmstat -s | awk 'BEGIN { + cmd = "getconf PAGESIZE"; + cmd | getline pagesize; + close(cmd); + } + /pages swapped out/ { + printf "%d\n", $1 / 1024 * pagesize / 1024; + }' + + + + + TotalCPUTime + + awk ' + function user_hz( hz) + { + cmd = "getconf CLK_TCK"; + cmd | getline; + hz = $1; + close(cmd); + + return hz; + } + + BEGIN { + USER_HZ = user_hz(); + TotalCPUTime = 0; + + while ( 0 < ( getline < "/proc/stat" ) ) + { + if ( "cpu" == $1 ) + { + TotalCPUTime = $2 + $3 + $4; + + break; + } + } + close("/proc/stat"); + + #printf "USER_HZ = %d\n", USER_HZ | "cat 1>&2"; + TotalCPUTime /= USER_HZ; + printf "%f\n", TotalCPUTime; + + #close("cat 1>&2"); + }' + + + + + TotalCPUTime + + virsh -r CONNECT dominfo NAME \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "CPU_TIME" { print $2; }' + + + + + ResourceProcessorLimit + + virsh -r CONNECT dominfo NAME \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "CPU(S)" { print $2; }' + + + + + ResourceMemoryLimit + + virsh -r CONNECT dominfo NAME \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "MAX_MEMORY" { print int($2/1024); }' + + + + + PhysicalMemoryAllocatedToVirtualSystem + + virsh -r CONNECT dominfo NAME \ + |awk -F ':' ' + function mkvarnam(s) { # UPPER_CASE_UNDERSCORE + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + gsub("[[:space:]]+", "_", s); s = toupper(s); + return s; + } + function filt_phys(s, sep, num, unit) { # 42.0 KM + sub("(^[[:space:]]+|[[:space:]]+$)", "", s); # trim + if ( s ~ /^[0-9]*\.?[0-9]+[[:space:]]*[[:alpha:]]+$/ ) + { + num = s; unit = s; + sub("[[:space:]]*[[:alpha:]]+$", "", num); + sub("^[0-9]*[.]?[0-9]+[[:space:]]*", "", unit); + return num sep toupper(unit); + } + else + { + return s; + } + } + /:/ { + d1 = substr($0, 1, index($0, ":") - 1); + rest = substr($0, index($0, ":") + 1); + printf("%s:%s\n", mkvarnam(d1), filt_phys(rest, ":")); + }' \ + | awk -F: '$1 == "USED_MEMORY" { print int($2/1024); }' + + + + + + diff --git a/SPECS/vhostmd.spec b/SPECS/vhostmd.spec new file mode 100644 index 0000000..9346e4a --- /dev/null +++ b/SPECS/vhostmd.spec @@ -0,0 +1,373 @@ +%global have_xen 0 + +Summary: Virtualization host metrics daemon +Name: vhostmd +Version: 1.1 +Release: 11%{?dist} +License: GPLv2+ + +URL: https://github.com/vhostmd/vhostmd + +Source0: https://github.com/vhostmd/vhostmd/archive/v%{version}/%{name}-%{version}.tar.gz +Source1: vhostmd.conf + +# Prevents updates from previous versions with the old config file +# from breaking (RHBZ#1782897). +# https://github.com/vhostmd/vhostmd/commit/83cc269f6892852be94467cea771b3ad1da8a369 +Patch0001: 0001-Relax-virtio-requirement-in-config-file.patch +Patch0002: 0002-libmetrics-Set-pointer-NULL-after-free.patch +Patch0003: 0003-libmetrics-Initialize-local-variable-ret-to-failure.patch +Patch0004: 0004-libmetrics-Check-return-value-of-asprintf.patch +Patch0005: 0005-libmetrics-Remove-unsafe-XML_PARSE_NOENT-option.patch +Patch0006: 0006-libmetrics-Ensure-libmetrics-mutex-is-unlocked-in-er.patch +Patch0007: 0007-libmetrics-Fix-potential-memory-leak.patch +Patch0008: 0008-libmetrics-Use-proper-conversion-specifier-when-call.patch +Patch0009: 0009-libmetrics-Fix-potential-leak-of-FILE-pointer.patch +Patch0010: 0010-util-Add-missing-call-to-va_end.patch +Patch0011: 0011-util-Fix-potential-memory-leak.patch +Patch0012: 0012-util-Check-return-value-of-strstr.patch +Patch0013: 0013-Check-return-value-of-asprintf.patch +Patch0014: 0014-vhostmd-Fix-memory-leak-in-parse_transports.patch +Patch0015: 0015-vhostmd-Remove-unsafe-XML_PARSE_NOENT-option.patch +Patch0016: 0016-vhostmd-Check-return-value-of-file-functions.patch +Patch0017: 0017-vhostmd-Check-for-valide-file-handle-before-calling-.patch +Patch0018: 0018-vhostmd-Fix-memory-leak-in-vhostmd_run.patch +Patch0019: 0019-virtio-Fix-strncpy-length-parameter.patch + +BuildRequires: make +BuildRequires: gcc +BuildRequires: chrpath +BuildRequires: perl-generators +BuildRequires: pkgconfig +BuildRequires: libxml2-devel +BuildRequires: libvirt-devel +BuildRequires: autoconf, automake, libtool +BuildRequires: git +%{?systemd_requires} +BuildRequires: systemd + +%if %{have_xen} +BuildRequires: xen-devel +%endif + +# This is hopefully temporary, but required to run vhostmd.xml as +# currently written. For more information see: +# https://bugzilla.redhat.com/show_bug.cgi?id=1897130 +Requires: libvirt + + +%description +vhostmd provides a "metrics communication channel" between a host and +its hosted virtual machines, allowing limited introspection of host +resource usage from within virtual machines. + + +%package -n vm-dump-metrics +Summary: Virtualization host metrics dump + + +%description -n vm-dump-metrics +Executable to dump all available virtualization host metrics to stdout +or a file. + + +%package -n vm-dump-metrics-devel +Summary: Virtualization host metrics dump development +Requires: vm-dump-metrics = %{version}-%{release} +Requires: pkgconfig + + +%description -n vm-dump-metrics-devel +Header and libraries necessary for metrics gathering development + + +%prep +%autosetup -S git + + +%build +autoreconf -i +%configure \ +%if %{have_xen} == 0 + --without-xenstore \ +%endif + --with-init-script=systemd \ + --enable-shared --disable-static +make %{_smp_mflags} + + +%install +rm -rf $RPM_BUILD_ROOT + +make DESTDIR=$RPM_BUILD_ROOT install + +rm $RPM_BUILD_ROOT%{_libdir}/libmetrics.la + +chrpath --delete $RPM_BUILD_ROOT%{_sbindir}/vm-dump-metrics + +# Remove docdir - we'll make a proper one ourselves. +rm -r $RPM_BUILD_ROOT%{_docdir}/vhostmd + +# Remove metric.dtd from /etc. +rm $RPM_BUILD_ROOT%{_sysconfdir}/vhostmd/metric.dtd + +# The default configuration file is great for Xen, not so great +# for anyone else. Replace it with one which is better for libvirt +# users. +rm $RPM_BUILD_ROOT%{_sysconfdir}/vhostmd/vhostmd.conf +cp %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/vhostmd/vhostmd.conf + +%if 0%{?rhel} +# Remove Perl script (https://bugzilla.redhat.com/show_bug.cgi?id=749875) +rm $RPM_BUILD_ROOT%{_datadir}/vhostmd/scripts/pagerate.pl +%endif + + +%pre +# UID:GID 112:112 reserved, see RHBZ#534109. +getent group vhostmd >/dev/null || groupadd -g 112 -r vhostmd +getent passwd vhostmd >/dev/null || \ +useradd -u 112 -r -g vhostmd -d %{_datadir}/vhostmd -s /sbin/nologin \ +-c "Virtual Host Metrics Daemon" vhostmd +exit 0 + + +%post +%systemd_post vhostmd.service + + +%preun +%systemd_preun vhostmd.service + + +%postun +%systemd_postun_with_restart vhostmd.service + + +%files +%doc AUTHORS ChangeLog COPYING README +%doc mdisk.xml metric.dtd vhostmd.dtd vhostmd.xml + +%{_sbindir}/vhostmd + +%dir %{_sysconfdir}/vhostmd +%config(noreplace) %{_sysconfdir}/vhostmd/vhostmd.conf +%config %{_sysconfdir}/vhostmd/vhostmd.dtd + +%{_unitdir}/vhostmd.service + +%dir %{_datadir}/vhostmd +%dir %{_datadir}/vhostmd/scripts +%if !0%{?rhel} +%{_datadir}/vhostmd/scripts/pagerate.pl +%endif + +%{_mandir}/man8/vhostmd.8.gz + + +%files -n vm-dump-metrics +%doc COPYING +%{_sbindir}/vm-dump-metrics +%{_libdir}/libmetrics.so.0 +%{_libdir}/libmetrics.so.0.0.0 +%{_mandir}/man1/vm-dump-metrics.1.gz + + +%files -n vm-dump-metrics-devel +%doc README +%{_libdir}/libmetrics.so +%dir %{_includedir}/vhostmd +%{_includedir}/vhostmd/libmetrics.h + + +%changelog +* Tue Aug 10 2021 Mohan Boddu - 1.1-11 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Thu Jul 29 2021 Richard W.M. Jones - 1.1-10 +- Miscellaneous upstream fixes. + +* Fri Jul 23 2021 Fedora Release Engineering - 1.1-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Fri Apr 16 2021 Mohan Boddu - 1.1-8 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Tue Feb 09 2021 Richard W.M. Jones - 1.1-7 +- Unify vhostmd.conf with RHEL 8.4 (RHBZ#1924966). + +* Thu Feb 04 2021 Richard W.M. Jones - 1.1-6 +- Increase release so > RHEL 8 (RHBZ#1924966). +- Unify spec files between RHEL and Fedora. + +* Wed Jan 27 2021 Fedora Release Engineering - 1.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Jul 29 2020 Fedora Release Engineering - 1.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri Jan 31 2020 Fedora Release Engineering - 1.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Aug 29 2019 Richard W.M. Jones - 1.1-1 +- Upstream version 1.1. +- Remove patches, since all included 1.1. + +* Sat Jul 27 2019 Fedora Release Engineering - 1.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Sun Feb 03 2019 Fedora Release Engineering - 1.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jan 18 2019 Richard W.M. Jones - 1.0-2 +- Upstream version 1.0. +- Remove patches, since all included 1.0. +- Add patches since 1.0. +- Fix Source0 URL, hosted on github. +- Remove old Source1 and Source2, not used. + +* Tue Oct 16 2018 Richard W.M. Jones - 0.5-19 +- Include all upstream patches since 0.5. +- Enable systemd init scripts (RHBZ#1592400). + +* Sat Jul 14 2018 Fedora Release Engineering - 0.5-18 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Thu Jul 05 2018 Richard W.M. Jones - 0.5-17 +- Remove ldconfig + https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/SU3LJVDZ7LUSJGZR5MS72BMRAFP3PQQL/ + +* Fri Feb 09 2018 Igor Gnatenko - 0.5-16 +- Escape macros in %%changelog + +* Thu Aug 03 2017 Fedora Release Engineering - 0.5-15 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 0.5-14 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 0.5-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Fri Feb 05 2016 Fedora Release Engineering - 0.5-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Tue Jan 26 2016 Richard Jones - 0.5-11 +- Remove useless defattr in files section. + +* Fri Jun 19 2015 Fedora Release Engineering - 0.5-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Mon Aug 18 2014 Fedora Release Engineering - 0.5-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 0.5-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sat Aug 03 2013 Petr Pisar - 0.5-7 +- Perl 5.18 rebuild + +* Mon Jul 29 2013 Richard W.M. Jones - 0.5-6 +- Completely disable Xen. APIs seem to have changed incompatibly. +- Add commits from upstream since 0.5. +- Remove pagerate.pl when building on RHEL. +- Modernize the spec file. + +* Wed Jul 17 2013 Petr Pisar - 0.5-5 +- Perl 5.18 rebuild + +* Thu May 23 2013 Richard W.M. Jones - 0.5-4 +- Disable Xen support on RHEL >= 6 (RHBZ#927853). + +* Fri Feb 15 2013 Fedora Release Engineering - 0.5-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Sun Jul 22 2012 Fedora Release Engineering - 0.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Mon Jan 16 2012 Richard W.M. Jones - 0.5-1 +- New upstream version 0.5. +- Remove -ldl patch which is now upstream. + +* Sat Jan 14 2012 Fedora Release Engineering - 0.4-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Mon Feb 07 2011 Fedora Release Engineering - 0.4-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Jul 23 2010 Richard W.M. Jones - 0.4-11 +- /etc/sysconfig/vhostmd: Default to KVM. + +* Tue Jul 13 2010 Richard W.M. Jones - 0.4-10 +- Patch Makefile.in directly so we don't need to run autotools. + +* Tue Jul 6 2010 Richard W.M. Jones - 0.4-9 +- Updated vhostmd.conf from Dr. Joachim Schneider at SAP. +- Run aclocal. + +* Tue Apr 27 2010 Richard W.M. Jones - 0.4-6 +- Updated vhostmd.conf file which enables TotalCPUTime metric. + +* Tue Feb 16 2010 Richard W.M. Jones - 0.4-5 +- Add a patch to link tests explicitly with -ldl (RHBZ#565096). + +* Thu Dec 10 2009 Richard W.M. Jones - 0.4-2 +- Fix the PagedOutMemory and PagedInMemory stats to report MB instead + of pages (fixes supplied by Joachim Schneider). + +* Wed Dec 9 2009 Richard W.M. Jones - 0.4-1 +- vhostmd didn't chdir ("/") when daemonizing. Fixed in this 0.4 release. + +* Tue Nov 17 2009 Richard W.M. Jones - 0.4-0.9.gite9db007b +- Add a timestamp to the metrics. +- Fix a typo in MemoryAllocatedToVirtualServers metric + (https://bugzilla.redhat.com/show_bug.cgi?id=532070#c7) +- %%{_sysconfdir}/sysconfig/vhostmd: Use libvirt default URI + (https://bugzilla.redhat.com/show_bug.cgi?id=537828) +- %%{_sysconfdir}/init.d/vhostmd: If using libvirt's default URI, then pass + the root URI to vhostmd (the default URI changes in some circumstances + when vhostmd switches to the non-root user). + +* Wed Nov 11 2009 Richard W.M. Jones - 0.4-0.8.gite9db007b +- Use fixed UID:GID 112:112 (RHBZ#534109). + +* Tue Nov 10 2009 Richard W.M. Jones - 0.4-0.7.gite9db007b +- vm-dump-metrics-devel package should require version and release of + base package. + +* Mon Nov 2 2009 Richard W.M. Jones - 0.4-0.6.gite9db007b +- Some changes to the default configuration file suggested by SAP to + make it more CIM standards compliant. + +* Fri Oct 16 2009 Richard W.M. Jones - 0.4-0.5.gite9db007b +- New upstream based on git e9db007b. +- Fix segfault in vm-dump-metrics (RHBZ#529348). +- On error, vm-dump-metrics now exits with status code 1. + +* Thu Oct 15 2009 Richard W.M. Jones - 0.4-0.2.gitea2f772d +- New upstream based on git ea2f772d. +- Update the configuration file based on upstream changes to how virsh + has to be run. +- vhostmd should run non-root as user 'vhostmd'. +- Allow libvirt URI to be configured. + +* Tue Oct 13 2009 Richard W.M. Jones - 0.4-0.1.git326f0012172 +- Move to pre-release of 0.4, self-built tarball. +- Disable xenstore on non-x86 platforms. +- Add patch to fix --without-xenstore option. +- Use have_xen RPM macro. + +* Mon Oct 12 2009 Richard W.M. Jones - 0.3-3 +- Remove metric.dtd file from /etc (fixes rpmlint warning), but + vhostmd.dtd has to remain because it is needed to validate the + XML configuration file. +- Remove ExclusiveArch, instead conditionally depend on xen-devel. +- Use a better, less noisy, more minimal configuration file which + doesn't depend on Xen. + +* Thu Oct 8 2009 Richard W.M. Jones - 0.3-1 +- New upstream version 0.3. + +* Fri Aug 14 2009 Richard W.M. Jones - 0.2-1 +- Initial packaging for Fedora, based on SuSE package.