On Fri, Mar 27, 2020 at 04:51:19PM +0100, Peter Krempa wrote:
For non-NBD URIs we need to preserve the query part as it may be
important to refer to the image. If the query doesn't start with
'socket=' concatenate it to the name of the image.
I can see that this makes sense for HTTP URIs (and other schemes with
QEMU's curl driver), as the query string can easily be part of the
identifier needed to resolve the image. These query params are not things
which map directly to QEMU driver options for CURL (if there are some
such query params, we should strip them), and thus don't make sense to
map to XML attributes (indeed it is impossible to map them since they
can be completely arbitrary).
For other URIs schemes though, this feels like it opens the door to
passthrough of arbitrary args to QEMU. eg we shouldn't allow this
for gluster/rbd/iscsi/sheepdog/etc drivers - in all of those any
query parameters should be mapped to explicit attributes and not
included in the path name.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/util/virstoragefile.c | 15 +++++++++++----
tests/virstoragetest.c | 4 ++--
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index c43e52d1f6..caf5de2d2c 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -2818,6 +2818,7 @@ virStorageSourceParseBackingURI(virStorageSourcePtr src,
{
g_autoptr(virURI) uri = NULL;
const char *path = NULL;
+ g_autofree char *pathquery = NULL;
VIR_AUTOSTRINGLIST scheme = NULL;
if (!(uri = virURIParse(uristr))) {
@@ -2851,10 +2852,6 @@ virStorageSourceParseBackingURI(virStorageSourcePtr src,
return -1;
}
- /* handle socket stored as a query */
- if (uri->query)
- src->hosts->socket = g_strdup(STRSKIP(uri->query,
"socket="));
-
/* uri->path is NULL if the URI does not contain slash after host:
* transport://host:port */
if (uri->path)
@@ -2862,6 +2859,16 @@ virStorageSourceParseBackingURI(virStorageSourcePtr src,
else
path = "";
+ /* handle socket stored as a query */
+ if (uri->query) {
+ if (STRPREFIX(uri->query, "socket=")) {
+ src->hosts->socket = g_strdup(STRSKIP(uri->query,
"socket="));
+ } else {
+ pathquery = g_strdup_printf("%s?%s", path, uri->query);
+ path = pathquery;
+ }
+ }
+
/* possibly skip the leading slash */
if (path[0] == '/')
path++;
diff --git a/tests/virstoragetest.c b/tests/virstoragetest.c
index 10d5421150..f0bb46a04c 100644
--- a/tests/virstoragetest.c
+++ b/tests/virstoragetest.c
@@ -1632,7 +1632,7 @@ mymain(void)
"\"file.url\":
\"https://host/folder/esx6.5-rhel7.7-x86%5f64/esx6.5-rhel7.7-x86%5f64-flat.vmdk?dcPath=data&dsName=esx6.5-matrix\","
"\"file.timeout\": 2000"
"}",
- "<source protocol='https'
name='folder/esx6.5-rhel7.7-x86_64/esx6.5-rhel7.7-x86_64-flat.vmdk'>\n"
+ "<source protocol='https'
name='folder/esx6.5-rhel7.7-x86_64/esx6.5-rhel7.7-x86_64-flat.vmdk?dcPath=data&dsName=esx6.5-matrix'>\n"
" <host name='host'
port='443'/>\n"
" <ssl verify='no'/>\n"
" <cookies>\n"
@@ -1647,7 +1647,7 @@ mymain(void)
"\"file.url\":
\"https://host/folder/esx6.5-rhel7.7-x86%5f64/esx6.5-rhel7.7-x86%5f64-flat.vmdk?dcPath=data&dsName=esx6.5-matrix\","
"\"file.timeout\": 2000"
"}",
- "<source protocol='https'
name='folder/esx6.5-rhel7.7-x86_64/esx6.5-rhel7.7-x86_64-flat.vmdk'>\n"
+ "<source protocol='https'
name='folder/esx6.5-rhel7.7-x86_64/esx6.5-rhel7.7-x86_64-flat.vmdk?dcPath=data&dsName=esx6.5-matrix'>\n"
" <host name='host'
port='443'/>\n"
" <ssl verify='no'/>\n"
" <cookies>\n"
--
2.24.1
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|