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: yangyang <yangyang@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 20170522195217.12991-2-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									bcb07dba92
								
							
						
					
					
						commit
						0d54a6fed3
					
				
							
								
								
									
										15
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								block.c
									
									
									
									
									
								
							@ -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
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user