• D
    rpc: fix escaping of shell path for netcat binary · 76d31244
    Daniel P. Berrangé 提交于
    Consider having a nc binary in the path with a space in its name,
    for example '/tmp/fo o/nc'
    
    This results in libvirt running SSH with the following arg value
    
      "'if ''/tmp/fo o/nc'' -q 2>&1 | grep \"requires
        an argument\" >/dev/null 2>&1; then ARG=-q0;
        else ARG=;fi;''/tmp/fo o/nc'' $ARG -U
        /var/run/libvirt/libvirt-sock'"
    
    The use of the single quote escaping was introduced by
    
      commit 6ac6238d
      Author: Guido Günther <agx@sigxcpu.org>
      Date:   Thu Oct 13 21:49:01 2011 +0200
    
        Use virBufferEscapeShell in virNetSocketNewConnectSSH
    
        to escape the netcat command since it's passed to the shell. Adjust
        expected test case output accordingly.
    
    While the intention of this change was good, the result is broken as it
    is still underquoted.
    
    On the SSH server side, SSH itself runs the command via the shell.
    Our command is then invoking the shell again. Thus we see
    
    $ virsh -c qemu+ssh://root@domokun/system?netcat=%2Ftmp%2Ffo%20o%2Fnc list
    error: failed to connect to the hypervisor
    error: End of file while reading data: sh: /tmp/fo: No such file or directory: Input/output error
    
    With the second level of escaping added we can now successfully use a nc
    binary with a space in the path.
    
    The original test case added was misleading as it illustrated using a
    binary path of 'nc -4' which is not a path, it is a command with a
    separate argument, which is getting interpreted as a path.
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
    76d31244
virnetclient.c 64.2 KB