From patchwork Thu Jan 24 16:29:27 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [BUG,RFC] block/vmdk.c: File name with space fails to open Date: Thu, 24 Jan 2013 06:29:27 -0000 From: Philipp Hahn X-Patchwork-Id: 215434 Message-Id: <201301241729.31903.hahn@univention.de> To: qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi Hello, I tried to open a "twoGbMaxExtentSparse" VMDK file, which uses spaces in its own and for the referenced file names. This breaks in line 646 of block/vmdk.c because "%511s" stops at the first space and thus fname is incomplete: ret = sscanf(p, "%10s %" SCNd64 " %10s %511s %" SCNd64, access, §ors, type, fname, &flat_offset); I've only checked with our very old VMware workstation version, which refuses to create new images with unsupported characters with the following message: > The characters !#%^&*><:;'"<>/? cannot be used. So it looks like spaces are valid, at least we have several VMs with spaces in their name. If the quotes around the file name are required, the simpliest solution would be to change %511s to "%511[^"]": goto next_line; I don't know how portable %[ together with a maximum width is, because the manual page for sscanf() doesn't mention "max width" for "%[", but it works with Debian/GNU Linux Squeeze. Sincerely Philipp diff --git a/block/vmdk.c b/block/vmdk.c index 19298c2..045f6a1 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -641,7 +641,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs, * RW [size in sectors] SPARSE "file-name.vmdk" */ flat_offset = -1; - ret = sscanf(p, "%10s %" SCNd64 " %10s %511s %" SCNd64, + ret = sscanf(p, "%10s %" SCNd64 " %10s \"%511[^\"]\" %" SCNd64, access, §ors, type, fname, &flat_offset); if (ret < 4 || strcmp(access, "RW")) {