On 31.03.2017 17:27, Eric Blake wrote: > Commit c7cacb3 accidentally broke legacy key-value parsing through > pseudo-filename parsing of -drive file=rbd://..., for any key that > contains an escaped ':'. Such a key is surprisingly common, thanks > to mon_host specifying a 'host:port' string. The break happens > because passing things from QDict through QemuOpts back to another > QDict requires that we pack our parsed key/value pairs into a string, > and then reparse that string, but the intermediate string that we > created ("key1=value1:key2=value2") lost the \: escaping that was > present in the original, so that we could no longer see which : were > used as separators vs. those used as part of the original input. > > Fix it by collecting the key/value pairs through a QList, and > sending that list on a round trip through a JSON QString (as in > '["key1","value1","key2","value2"]') on its way through QemuOpts, > rather than hand-rolling our own string. Since the string is only > handled internally, this was faster than creating a full-blown > struct of '[{"key1":"value1"},{"key2":"value2"}]', and safer at > guaranteeing order compared to '{"key1":"value1","key2":"value2"}'. > > It would be nicer if we didn't have to round-trip through QemuOpts > in the first place, but that's a much bigger task for later. > > Reproducer: > ./x86_64-softmmu/qemu-system-x86_64 -nodefaults -nographic -qmp stdio \ > -drive 'file=rbd:volumes/volume-ea141b5c-cdb3-4765-910d-e7008b209a70'\ > ':id=compute:key=AQAVkvxXAAAAABAA9ZxWFYdRmV+DSwKr7BKKXg=='\ > ':auth_supported=cephx\;none:mon_host=192.168.1.2\:6789'\ > ',format=raw,if=none,id=drive-virtio-disk0,'\ > 'serial=ea141b5c-cdb3-4765-910d-e7008b209a70,cache=writeback' > > Even without an RBD setup, this serves a test of whether we get > the incorrect parser error of: > qemu-system-x86_64: -drive file=rbd:...cache=writeback: conf option 6789 has > no value > or the correct behavior of hanging while trying to connect to > the requested mon_host of 192.168.1.2:6789. > > Reported-by: Alexandru Avadanii <alexandru.avada...@enea.com> > Signed-off-by: Eric Blake <ebl...@redhat.com> > --- > block/rbd.c | 83 > +++++++++++++++++++++++++++++++------------------------------ > 1 file changed, 42 insertions(+), 41 deletions(-)
Reviewed-by: Max Reitz <mre...@redhat.com>
signature.asc
Description: OpenPGP digital signature