提交 0d54a6fe 编写于 作者: M Max Reitz

block: Fix backing paths for filenames with colons

path_combine() naturally tries to preserve a protocol prefix. However,
it recognizes such a prefix by scanning for the first colon; which is
different from what path_has_protocol() does: There only is a protocol
prefix if there is a colon before the first slash.

A protocol prefix that is not recognized by path_has_protocol() is none,
and should thus not be taken as one.

Case in point, before this patch:
$ ./qemu-img create -f qcow2 -b backing.qcow2 ./top:image.qcow2
qemu-img: ./top:image.qcow2: Could not open './top:backing.qcow2':
    No such file or directory

Afterwards:
$ ./qemu-img create -f qcow2 -b backing.qcow2 ./top:image.qcow2
qemu-img: ./top:image.qcow2: Could not open './backing.qcow2':
    No such file or directory
Reported-by: Nyangyang <yangyang@redhat.com>
Signed-off-by: NMax Reitz <mreitz@redhat.com>
Reviewed-by: NEric Blake <eblake@redhat.com>
Message-id: 20170522195217.12991-2-mreitz@redhat.com
Signed-off-by: NMax Reitz <mreitz@redhat.com>
上级 bcb07dba
...@@ -163,11 +163,16 @@ void path_combine(char *dest, int dest_size, ...@@ -163,11 +163,16 @@ void path_combine(char *dest, int dest_size,
if (path_is_absolute(filename)) { if (path_is_absolute(filename)) {
pstrcpy(dest, dest_size, filename); pstrcpy(dest, dest_size, filename);
} else { } else {
p = strchr(base_path, ':'); const char *protocol_stripped = NULL;
if (p)
p++; if (path_has_protocol(base_path)) {
else protocol_stripped = strchr(base_path, ':');
p = base_path; if (protocol_stripped) {
protocol_stripped++;
}
}
p = protocol_stripped ?: base_path;
p1 = strrchr(base_path, '/'); p1 = strrchr(base_path, '/');
#ifdef _WIN32 #ifdef _WIN32
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册