Compare commits

...
Sign in to create a new pull request.

24 commits

Author SHA1 Message Date
Daniel P. Berrangé
9c76ecd62a Disable build on i686 architecture
vhostmd is a leaf package so there is no reason to continue
building it on i686.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2025-10-02 10:18:22 +01:00
Fedora Release Engineering
661e292963 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 20:04:19 +00:00
Nils Koenig
4dab2b5b60 Added rpminspect.yaml which avoids a xmllint check for dtd docu files. 2025-01-20 16:17:11 +00:00
Fedora Release Engineering
7b6141f396 Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild 2025-01-19 14:18:40 +00:00
Fedora Release Engineering
3e64712b1e Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild 2024-07-20 08:44:51 +00:00
Fedora Release Engineering
da4b24f541 Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild 2024-01-27 07:42:42 +00:00
Yaakov Selkowitz
8cbdb24e2b Fix for https://fedoraproject.org/wiki/Changes/PortingToModernC
https://github.com/vhostmd/vhostmd/pull/13
2023-12-24 15:14:28 -05:00
Nils Koenig
f0ff0e1b37 Use systemd-sysusers to create vhostmd user
See also BZ 2095483wq
https://bugzilla.redhat.com/show_bug.cgi?id=2095483
2023-10-19 18:05:36 +02:00
Daniel P. Berrangé
04570aaf13 Correct license from GPLv2+ to LGPL-2.1-or-later (SPDX format)
The existing license was incorrectly declaring the project as
being GPLv2+, when the code is clearly LGPL licensed. Upon
correcting the license, we use the SPDX terminology.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2023-07-24 13:15:01 +01:00
Fedora Release Engineering
2485551a73 Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-07-22 17:36:07 +00:00
Fedora Release Engineering
e3ded7567e Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2023-01-21 06:15:48 +00:00
Fedora Release Engineering
d3bdd041a0 Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-07-23 11:50:37 +00:00
Fedora Release Engineering
2d75effb58 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2022-01-22 03:56:19 +00:00
Richard W.M. Jones
308a9d2918 Miscellaneous upstream fixes. 2021-07-29 11:21:33 +01:00
Fedora Release Engineering
eb279043d1 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-07-23 20:26:12 +00:00
Richard W.M. Jones
325e0045bc Add gating tests (for RHEL) 2021-06-23 10:56:24 +01:00
Zbigniew Jędrzejewski-Szmek
7ff1135178 Rebuilt for updated systemd-rpm-macros
See https://pagure.io/fesco/issue/2583.
2021-03-02 16:12:03 +01:00
Richard W.M. Jones
24499ef94d Unify vhostmd.conf with RHEL 8.4 (RHBZ#1924966). 2021-02-09 10:16:49 +00:00
Richard W.M. Jones
6f8231b1f9 Increase release so > RHEL 8 (RHBZ#1924966).
Unify spec files between RHEL and Fedora.
2021-02-04 08:59:31 +00:00
Fedora Release Engineering
5d6e8f685c - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2021-01-27 23:02:15 +00:00
Tom Stellard
4dd9235786 Add BuildRequires: make
https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot
2021-01-09 00:41:31 +00:00
Fedora Release Engineering
e422a2a3a0 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-07-29 13:40:50 +00:00
Fedora Release Engineering
fea444b84f - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
Signed-off-by: Fedora Release Engineering <releng@fedoraproject.org>
2020-01-31 03:06:40 +00:00
Richard W.M. Jones
8e296f6839 Upstream version 1.1.
Remove patches, since all included 1.1.
2019-08-29 09:07:01 +01:00
30 changed files with 1222 additions and 465 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
vhostmd-0.4.tar.bz2
/vhostmd-0.5.tar.bz2
/vhostmd-1.0.tar.gz
/vhostmd-1.1.tar.gz

View file

@ -0,0 +1,42 @@
From 83cc269f6892852be94467cea771b3ad1da8a369 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <virtio> 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 <jfehlig@suse.com>
---
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
-->
<!ELEMENT vhostmd (globals,metrics)>
-<!ELEMENT globals (disk,virtio,update_period,path,transport+)>
+<!ELEMENT globals (disk,virtio*,update_period,path,transport+)>
<!ELEMENT disk (name,path,size)>
<!ELEMENT name (#PCDATA)>
--
2.32.0

View file

@ -1,422 +0,0 @@
From 89ba5ba4bad7267615d2ae77a40abb5de249fb94 Mon Sep 17 00:00:00 2001
From: Michael Trapp <Michael.Trapp@sap.com>
Date: Fri, 7 Dec 2018 19:12:22 +0100
Subject: [PATCH 1/2] Remove libserialclient
There is no need to keep the dump_virtio code in a separate library.
Revert libserialclient changes and move the code to libmetrics.
---
libmetrics/Makefile.am | 18 +---
libmetrics/libmetrics.c | 131 ++++++++++++++++++++++++++
libmetrics/libmetrics.h | 4 -
libmetrics/libserialclient.c | 172 -----------------------------------
libmetrics/libserialclient.h | 30 ------
5 files changed, 133 insertions(+), 222 deletions(-)
delete mode 100644 libmetrics/libserialclient.c
delete mode 100644 libmetrics/libserialclient.h
diff --git a/libmetrics/Makefile.am b/libmetrics/Makefile.am
index 468f08f..254b2c8 100644
--- a/libmetrics/Makefile.am
+++ b/libmetrics/Makefile.am
@@ -6,7 +6,7 @@ if WITH_XENSTORE
AM_CFLAGS += -DWITH_XENSTORE
endif
-lib_LTLIBRARIES=libmetrics.la libserialclient.la
+lib_LTLIBRARIES=libmetrics.la
libmetricsincdir=$(includedir)/vhostmd
libmetricsinc_HEADERS = libmetrics.h
@@ -15,21 +15,7 @@ libmetrics_la_SOURCES = \
libmetrics.c \
vm_metrics.c \
host_metrics.c \
- libserialclient.c \
libmetrics.h
libmetrics_la_DEPENDENCIES = \
- libmetrics.h \
- libserialclient.h
-
-
-libserialclientincdir=
-libserialclientinc_HEADERS = libserialclient.h
-
-libserialclient_la_SOURCES = \
- libserialclient.c \
- libserialclient.h
-
-libserialclient_la_DEPENDENCIES = \
- libserialclient.h
-
+ libmetrics.h
diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c
index bc3ba1d..0a5e3ee 100644
--- a/libmetrics/libmetrics.c
+++ b/libmetrics/libmetrics.c
@@ -775,3 +775,134 @@ out:
}
#endif
+/*
+ * dump metrics from virtio serial port to buffer
+ */
+static char *get_virtio_metrics(void)
+{
+ const char request[] = "GET /metrics/XML\n\n", end_token[] = "\n\n";
+ const char dev[] = "/dev/virtio-ports/org.github.vhostmd.1";
+
+ char *response = NULL;
+ int fd = -1;
+ size_t pos;
+ size_t buf_size = (1 << 16);
+ const size_t req_len = (size_t) strlen(request);
+ const time_t start_time = time(NULL);
+
+ response = calloc(1UL, buf_size);
+ if (response == NULL)
+ goto error;
+
+ fd = open(dev, O_RDWR | O_NONBLOCK);
+
+ if (fd < 0) {
+ libmsg("Error, unable to export metrics: open(%s) %s\n",
+ dev, strerror(errno));
+ goto error;
+ }
+
+ pos = 0;
+ while (pos < req_len) {
+ ssize_t len = write(fd, &request[pos], req_len - pos);
+ if (len > 0)
+ pos += (size_t) len;
+ else {
+ if (errno == EAGAIN)
+ usleep(10000);
+ else
+ goto error;
+ }
+ }
+
+ pos = 0;
+ do {
+ ssize_t len = read(fd, &response[pos], buf_size - pos - 1);
+ if (len > 0) {
+ pos += (size_t) len;
+ response[pos] = 0;
+
+ if ((pos + 1) >= buf_size) {
+ buf_size = buf_size << 1; /* increase response buffer */
+ if (buf_size > (1 << 24)) /* max 16MB */
+ goto error;
+
+ response = realloc(response, buf_size);
+ if (response == NULL)
+ goto error;
+
+ memset(&response[pos], 0, buf_size - pos);
+ }
+ } else {
+ if (errno == EAGAIN) {
+ usleep(10000);
+ if (time(NULL) > (start_time + 30)) {
+ libmsg("Error, unable to read metrics"
+ " - timeout after 30s\n");
+ goto error;
+ }
+ } else
+ goto error;
+ }
+ } while ((pos < (size_t) strlen(end_token) ||
+ strcmp(end_token, &response[pos - (size_t) strlen(end_token)]) != 0) &&
+ pos < buf_size);
+
+ if (fd >= 0)
+ close(fd);
+
+ return response;
+
+ error:
+ if (fd >= 0)
+ close(fd);
+ if (response)
+ free(response);
+
+ return NULL;
+}
+
+/*
+ * dump metrics from virtio serial port to xml formatted file
+ */
+int dump_virtio_metrics(const char *dest_file)
+{
+ FILE *fp = stdout;
+ char *response = NULL;
+ size_t len;
+
+ response = get_virtio_metrics();
+ if (response == NULL)
+ goto error;
+
+ len = strlen(response);
+
+ if (dest_file) {
+ fp = fopen(dest_file, "w");
+ if (fp == NULL) {
+ libmsg("Error, unable to dump metrics: fopen(%s) %s\n",
+ dest_file, strerror(errno));
+ goto error;
+ }
+ }
+
+ if (fwrite(response, 1UL, len, fp) != len) {
+ libmsg("Error, unable to export metrics to file:%s %s\n",
+ dest_file ? dest_file : "stdout", strerror(errno));
+ goto error;
+ }
+
+ if (response)
+ free(response);
+
+ return 0;
+
+ error:
+ if (dest_file && fp)
+ fclose(fp);
+
+ if (response)
+ free(response);
+
+ return -1;
+}
diff --git a/libmetrics/libmetrics.h b/libmetrics/libmetrics.h
index 1908de8..c4873ff 100644
--- a/libmetrics/libmetrics.h
+++ b/libmetrics/libmetrics.h
@@ -102,8 +102,4 @@ int dump_xenstore_metrics(const char *dest_file);
/* dump metrics from virtio serial port to xml formatted file */
int dump_virtio_metrics(const char *dest_file);
-
-/* dump metrics from virtio serial port to buffer */
-const char *get_virtio_metrics(const char *dev_name);
-
#endif
diff --git a/libmetrics/libserialclient.c b/libmetrics/libserialclient.c
deleted file mode 100644
index d3a4af5..0000000
--- a/libmetrics/libserialclient.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2018 SAP SE
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Author: Michael Trapp <michael.trapp@sap.com>
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "libserialclient.h"
-
-
-/*
- * dump metrics from virtio serial port to xml formatted file
- */
-int dump_virtio_metrics(const char *dest_file)
-{
- FILE *fp = stdout;
- char *response;
- size_t len;
-
- response = get_virtio_metrics(NULL);
- if (response == NULL)
- goto error;
-
- len = strlen(response);
-
- if (dest_file) {
- fp = fopen(dest_file, "w");
- if (fp == NULL) {
- fprintf(stderr,
- "LIB_SERIALCLIENT: Error, unable to dump metrics: fopen(%s) %s\n",
- dest_file, strerror(errno));
- goto error;
- }
- }
-
- if (fwrite(response, 1UL, len, fp) != len) {
- fprintf(stderr,
- "LIB_SERIALCLIENT: Error, unable to export metrics to file:%s - error:%s\n",
- dest_file ? dest_file : "STDOUT", strerror(errno));
- goto error;
- }
-
- if (response)
- free(response);
-
- return 0;
-
- error:
- if (dest_file && fp)
- fclose(fp);
-
- if (response)
- free(response);
-
- return -1;
-}
-
-/*
- * dump metrics from virtio serial port to buffer
- */
-char *get_virtio_metrics(const char *dev_name)
-{
- const char request[] = "GET /metrics/XML\n\n", end_token[] = "\n\n";
- const char *dev;
- char *response = NULL;
- int fd = -1;
- size_t pos;
- size_t buf_size = (1 << 16);
- const size_t req_len = (size_t) strlen(request);
- const time_t start_time = time(NULL);
-
- if (dev_name)
- dev = dev_name;
- else
- dev = "/dev/virtio-ports/org.github.vhostmd.1";
-
- response = calloc(1UL, buf_size);
- if (response == NULL)
- goto error;
-
- fd = open(dev, O_RDWR | O_NONBLOCK);
-
- if (fd < 0) {
- fprintf(stderr,
- "LIB_SERIALCLIENT: Error, unable to dump metrics: open(%s) %s\n",
- dev, strerror(errno));
- goto error;
- }
-
- pos = 0;
- while (pos < req_len) {
- ssize_t len = write(fd, &request[pos], req_len - pos);
- if (len > 0)
- pos += (size_t) len;
- else {
- if (errno == EAGAIN)
- usleep(10000);
- else
- goto error;
- }
- }
-
- pos = 0;
- do {
- ssize_t len = read(fd, &response[pos], buf_size - pos - 1);
- if (len > 0) {
- pos += (size_t) len;
- response[pos] = 0;
-
- if ((pos + 1) >= buf_size) {
- buf_size = buf_size << 1; /* increase response buffer */
- if (buf_size > (1 << 24)) /* max 16MB */
- goto error;
-
- response = realloc(response, buf_size);
- if (response == NULL)
- goto error;
-
- memset(&response[pos], 0, buf_size - pos);
- }
- } else {
- if (errno == EAGAIN) {
- usleep(10000);
- if (time(NULL) > (start_time + 30)) {
- fprintf(stderr,
- "LIB_SERIALCLIENT: Error, unable to read metrics"
- " - timeout after 30s\n");
- goto error;
- }
- } else
- goto error;
- }
- } while ((pos < (size_t) strlen(end_token) ||
- strcmp(end_token, &response[pos - (size_t) strlen(end_token)]) != 0) &&
- pos < buf_size);
-
- if (fd >= 0)
- close(fd);
-
- return response;
-
- error:
- if (fd >= 0)
- close(fd);
- if (response)
- free(response);
-
- return NULL;
-}
diff --git a/libmetrics/libserialclient.h b/libmetrics/libserialclient.h
deleted file mode 100644
index 887c6a5..0000000
--- a/libmetrics/libserialclient.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2018 SAP SE
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * Author: Michael Trapp <michael.trapp@sap.com>
- */
-
-#ifndef __LIBSERIALCLIENT_H__
-#define __LIBSERIALCLIENT_H__
-
-/* dump metrics from virtio serial port to xml formatted file */
-int dump_virtio_metrics(const char *dest_file);
-
-/* dump metrics from virtio serial port to buffer */
-char *get_virtio_metrics(const char *dev_name);
-
-#endif
--
2.20.1

View file

@ -1,27 +0,0 @@
From 57698b6b2c05e2288b72ae36afa93a2e555c72fd Mon Sep 17 00:00:00 2001
From: Michael Trapp <Michael.Trapp@sap.com>
Date: Fri, 7 Dec 2018 19:12:40 +0100
Subject: [PATCH 2/2] Don't pass NULL string to library log function
---
libmetrics/libmetrics.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c
index 0a5e3ee..36c7f5f 100644
--- a/libmetrics/libmetrics.c
+++ b/libmetrics/libmetrics.c
@@ -681,8 +681,8 @@ int dump_metrics(const char *dest_file)
}
if (fwrite(mdisk->buffer, 1, mdisk->length, fp) != mdisk->length) {
- libmsg("Error, unable to export metrics to file:%s - error:%s\n",
- dest_file, strerror(errno));
+ libmsg("Error, unable to export metrics to file:%s - error:%s\n",
+ dest_file ? dest_file : "stdout", strerror(errno));
}
if (dest_file)
fclose(fp);
--
2.20.1

View file

@ -0,0 +1,58 @@
From 06e73264b2338d20aa6e3f17b9820be3768439bf Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,125 @@
From 9db959c9e3f83cb2a4fc07534462e769990d9631 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,67 @@
From f659ec774221532cc5452a07418e2ab1385f162c Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,41 @@
From 3d4f3acdfc9f937bea946bb1c7dfad1f3516a6ce Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,53 @@
From 855326a8c9ec1a599354f743fb5391a2766a2a9c Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,49 @@
From 2cbce5fcb652226bf159f9cd9649f5869d76f6b7 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,40 @@
From bc5da0b99699bbeb653b86398a7112bc0885c31e Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,75 @@
From cba4dddebc56886034038f907085da3c6b50baab Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,55 @@
From 69fcc2075d7cb1f16eb7d27ae3559fa3c77f5514 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,40 @@
From b39f7cc778903e9cda8aa46d170b9efe80efda89 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,38 @@
From 4350fcf7a5c4cb7d803db1a0df2b757230b90e25 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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 <cnt; i++) {
p = strstr(cp, origstr);
- *p = '\0';
- strcat(dest, cp);
- strcat(dest, newstr);
- cp = p + origlen;
+ if (p) {
+ *p = '\0';
+ strcat(dest, cp);
+ strcat(dest, newstr);
+ cp = p + origlen;
+ }
}
strcat(dest, cp);
--
2.32.0

View file

@ -0,0 +1,48 @@
From 1771ddb83fe8a8cb38e7bee212bdfa3d1927cfc5 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,36 @@
From 71a94a18c470ebbd870253b8aedbb7b3b24a274b Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,36 @@
From d9eeede678521776d327784d0307de6c98920bb8 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,94 @@
From 4f7b23e19c88c92d834d5f975c846b47eaa03c79 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,38 @@
From d86c51d98ce8b891f3948f8aa54fc9634e6a8c67 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,46 @@
From ff6959fd9203c667f6b4c95fa812621cc91dc42e Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,36 @@
From 99995e4ba138f43b277620bd43a096c72f354548 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
---
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

View file

@ -0,0 +1,74 @@
From cf555d3bf079ff60b363dba4dc48a349dce5d3b4 Mon Sep 17 00:00:00 2001
From: Yaakov Selkowitz <yselkowi@redhat.com>
Date: Sun, 24 Dec 2023 14:54:09 -0500
Subject: [PATCH] Fix implicit declarations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Errors raised in Fedora rawhide and ELN which have added the
-Werror=implicit-function-declaration flag for C:
virt-util.c:96:9: error: implicit declaration of function calloc
virt-util.c:129:10: error: implicit declaration of function free
virtio.c:160:9: error: implicit declaration of function free
virtio.c:254:31: error: implicit declaration of function bsearch
virtio.c:259:13: error: implicit declaration of function qsort
virtio.c:586:33: error: implicit declaration of function calloc
libmetrics.c:136:28: error: implicit declaration of function 'atoi'
libmetrics.c:142:29: error: implicit declaration of function 'atoll'
libmetrics.c:148:28: error: implicit declaration of function 'atof'
libmetrics.c:170:12: error: implicit declaration of function 'calloc'
libmetrics.c:189:12: error: implicit declaration of function 'free'
libmetrics.c:311:7: error: implicit declaration of function 'posix_memalign'
libmetrics.c:385:26: error: implicit declaration of function 'malloc'
libmetrics.c:848:28: error: implicit declaration of function 'realloc'
Signed-off-by: Yaakov Selkowitz <yselkowi@redhat.com>
---
libmetrics/libmetrics.c | 1 +
vhostmd/virt-util.c | 1 +
vhostmd/virtio.c | 1 +
3 files changed, 3 insertions(+)
diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c
index 8819074..c83fd03 100644
--- a/libmetrics/libmetrics.c
+++ b/libmetrics/libmetrics.c
@@ -21,6 +21,7 @@
#include <config.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
diff --git a/vhostmd/virt-util.c b/vhostmd/virt-util.c
index a94cccd..40765c3 100644
--- a/vhostmd/virt-util.c
+++ b/vhostmd/virt-util.c
@@ -21,6 +21,7 @@
#include <config.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <libvirt/libvirt.h>
diff --git a/vhostmd/virtio.c b/vhostmd/virtio.c
index a6c2515..98340ce 100644
--- a/vhostmd/virtio.c
+++ b/vhostmd/virtio.c
@@ -30,6 +30,7 @@
#include <search.h>
#include <dirent.h>
#include <pthread.h>
+#include <stdlib.h>
#include <libvirt/libvirt.h>
#include "util.h"
--
2.43.0

7
gating.yaml Normal file
View file

@ -0,0 +1,7 @@
--- !Policy
product_versions:
- rhel-*
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional}
- !PassingTestCaseRule {test_case_name: manual.sst_virtualization.vhostmd.manual-test}

5
rpminspect.yaml Normal file
View file

@ -0,0 +1,5 @@
xml:
# Regular expression (man 7 regex) matching directories to ignore
# during the xml inspection. Skip DTD files, which
# contain a mix of XML and code.
exclude_path: .*(\.dtd)$

View file

@ -1 +1 @@
SHA512 (vhostmd-1.0.tar.gz) = 0479f2b4cebd2d3aa603516b4c6db03ba4f998ab5c25965cc26b1b64ff9a33ac5d6e5a973361931a11b641500fc21b187881756726e92d96a924f47efac2e7cf
SHA512 (vhostmd-1.1.tar.gz) = 9fad55c96c504b59345fb670d9ae9b83c892d82f05784253c8826436a1a75419bb73d6be48a8f8d956f89c77ab4f54a85200e92078c22c8f156954ca8f434d49

6
tests/basic-test.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash -
set -e
set -x
# Setting up vhostmd is basically impossible, so:
LANG=C vm-dump-metrics |& grep "Unable to read metrics disk"

11
tests/tests.yml Normal file
View file

@ -0,0 +1,11 @@
- hosts: localhost
roles:
- role: standard-test-basic
tags:
- classic
required_packages:
- vm-dump-metrics-devel
tests:
- simple:
dir: .
run: ./basic-test.sh

8
vhostmd.conf Normal file → Executable file
View file

@ -80,10 +80,15 @@ way.
<!-- must be between [128 KB, 256 MB] in size -->
<size unit="k">256</size>
</disk>
<virtio>
<max_channels>1024</max_channels>
<expiration_time>15</expiration_time>
</virtio>
<update_period>60</update_period>
<path>/bin:/sbin:/usr/bin:/usr/sbin:/usr/share/vhostmd/scripts</path>
<transport>vbd</transport>
<!-- <transport>xenstore</transport> -->
<transport>virtio</transport>
</globals>
<metrics>
<metric type="string" context="host">
@ -97,8 +102,7 @@ way.
<metric type="string" context="host">
<name>VirtualizationVendor</name>
<action>
rpm -qi libvirt| grep Vendor: \
| awk '{ print substr($0, index($0, $5)); }' | sort -u
rpm -q --queryformat "%{VENDOR}\n" libvirt | sort -u
</action>
</metric>
<!-- SAP "CIM" -->

View file

@ -2,20 +2,43 @@
Summary: Virtualization host metrics daemon
Name: vhostmd
Version: 1.0
Release: 4%{?dist}
License: GPLv2+
Version: 1.1
Release: 19%{?dist}
License: LGPL-2.1-or-later
URL: http://gitorious.org/vhostmd
URL: https://github.com/vhostmd/vhostmd
Source0: https://github.com/vhostmd/vhostmd/archive/v%{version}/%{name}-%{version}.tar.gz
Source1: vhostmd.conf
# Upstream patches since 1.0 was released. Note the first patch
# removes the libserialclient API (present, temporarily, in 1.0).
Patch0001: 0001-Remove-libserialclient.patch
Patch0002: 0002-Don-t-pass-NULL-string-to-library-log-function.patch
# 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
# https://github.com/vhostmd/vhostmd/pull/13
Patch0020: 0020-implicit-function-declarations.patch
ExcludeArch: %{ix86}
BuildRequires: make
BuildRequires: gcc
BuildRequires: chrpath
BuildRequires: perl-generators
@ -31,6 +54,11 @@ BuildRequires: systemd
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
@ -101,11 +129,7 @@ rm $RPM_BUILD_ROOT%{_datadir}/vhostmd/scripts/pagerate.pl
%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
%sysusers_create_inline u vhostmd 112 "Virtual Host Metrics Daemon" %{_datadir}/vhostmd /sbin/nologin
%post
@ -157,6 +181,63 @@ exit 0
%changelog
* Thu Oct 2 2025 Daniel P. Berrangé <berrange@redhat.com> - 1.1-19
- Disable build on i686 architecture
* Fri Jul 25 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-18
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
* Sun Jan 19 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-17
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
* Sat Jul 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-16
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Sat Jan 27 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-15
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sat Jul 22 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Sat Jan 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-13
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Sat Jul 23 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-12
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Sat Jan 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-11
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Thu Jul 29 2021 Richard W.M. Jones <rjones@redhat.com> - 1.1-10
- Miscellaneous upstream fixes.
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-9
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 1.1-8
- Rebuilt for updated systemd-rpm-macros
See https://pagure.io/fesco/issue/2583.
* Tue Feb 09 2021 Richard W.M. Jones <rjones@redhat.com> - 1.1-7
- Unify vhostmd.conf with RHEL 8.4 (RHBZ#1924966).
* Thu Feb 04 2021 Richard W.M. Jones <rjones@redhat.com> - 1.1-6
- Increase release so > RHEL 8 (RHBZ#1924966).
- Unify spec files between RHEL and Fedora.
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Fri Jan 31 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Thu Aug 29 2019 Richard W.M. Jones <rjones@redhat.com> - 1.1-1
- Upstream version 1.1.
- Remove patches, since all included 1.1.
* Sat Jul 27 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild