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(a)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