[libvirt] [RFC PATCH 11/30] qemu: block: Validate node-names for use with qemu

Peter Krempa pkrempa at redhat.com
Thu Apr 19 15:25:08 UTC 2018


qemu declares node-name as a 32 byte buffer and silently truncates
anything longer than that. This is unacceptable for libvirt, so we need
to make sure that we won't ever supply a node-name exceeding 31 chars.

Add a function which will do the validation and use it to validate
storage-protocol node names.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_block.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index 9057fe4f9a..cf6025ac7b 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -27,6 +27,24 @@

 #define VIR_FROM_THIS VIR_FROM_QEMU

+/* qemu declares the buffer for node names as a 32 byte array */
+static const size_t qemuBlockNodeNameBufSize = 32;
+
+static int
+qemuBlockNodeNameValidate(const char *nn)
+{
+    if (!nn)
+        return 0;
+
+    if (strlen(nn) >= qemuBlockNodeNameBufSize) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("node-name '%s' too long for qemu"), nn);
+        return -1;
+    }
+
+    return 0;
+}
+

 static int
 qemuBlockNamedNodesArrayToHash(size_t pos ATTRIBUTE_UNUSED,
@@ -1099,7 +1117,8 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src,
         break;
     }

-    if (virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, NULL) < 0) {
+    if (qemuBlockNodeNameValidate(src->nodestorage) < 0 ||
+        virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, NULL) < 0) {
         virJSONValueFree(fileprops);
         return NULL;
     }
-- 
2.14.3




More information about the libvir-list mailing list