[libvirt] [PATCH] remote: Forbid default "/session" connections when using ssh transport

Peter Krempa pkrempa at redhat.com
Thu Jun 13 09:46:58 UTC 2013


On 06/12/13 21:34, Laine Stump wrote:
> On 06/10/2013 08:44 AM, Peter Krempa wrote:
>
>
> Can you include in the commit log a link to the BZ describing this
> problem? It helps *immensely* when trying to trace things months/years
> later.
>

There isn't any publicly available BZ describing this problem so I chose 
not to put the private link in the commit. I can do it if you insist but 
having private links in a public repo doesn't seem right to me.

>
>> Without the socket path explicitly specified, the remote driver tried to
>> connect to the "/system" instance socket even if "/session" was
>> specified in the uri. With this patch this configuration now produces an
>> error.
>>
>> It is still possible to initiate a session connection with specifying
>> the path to the socket manually and also manually starting the session
>> daemon. This was also possible prior to this patch,
>>
>> This is a minimal fix. We may decide to support remote session
>> connections using ssh but this will require changes to the remote driver
>> code so this fix shouldn't cause regressions in the case we decide to do
>> that.
>> ---
>>   src/remote/remote_driver.c | 40 ++++++++++++++++++++++++++++++----------
>>   1 file changed, 30 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
>> index fcf45d3..bd5646a 100644
>> --- a/src/remote/remote_driver.c
>> +++ b/src/remote/remote_driver.c
>> @@ -631,11 +631,21 @@ doRemoteOpen(virConnectPtr conn,
>>           break;
>>
>>       case trans_libssh2:
>> -        if (!sockname &&
>> -            VIR_STRDUP(sockname,
>> -                       flags & VIR_DRV_OPEN_REMOTE_RO ?
>> -                       LIBVIRTD_PRIV_UNIX_SOCKET_RO : LIBVIRTD_PRIV_UNIX_SOCKET) < 0)
>> -            goto failed;
>> +        if (!sockname) {
>> +            /* Right now we don't support default session connections */
>> +            if (STREQ(conn->uri->path, "/session")) {
>> +                virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>> +                               _("Connecting to session instance without "
>> +                                 "socket path is not supported by the libssh2 "
>> +                                 "connection driver"));
>> +                goto failed;
>> +            }
>
> A totally naive question: do we want to only allow "/system"? or
> 'anything except "/session"'?

We want to forbid only "/session" with the default socket path which 
won't work right now. A user is able to start a session daemon and 
successfully connect to it even with this patch. The user has to 
manually specify a socket path.

Rejecting everything except "/system" would break drivers that use 
different path. A (stupid) example:

$ virsh -c test+ssh://root@localhost/default
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
        'quit' to quit

virsh # list --all
  Id    Name                           State
----------------------------------------------------
  1     test                           running

>
>
>> +
>> +            if (VIR_STRDUP(sockname,
>> +                           flags & VIR_DRV_OPEN_REMOTE_RO ?
>> +                           LIBVIRTD_PRIV_UNIX_SOCKET_RO : LIBVIRTD_PRIV_UNIX_SOCKET) < 0)
>> +                goto failed;
>> +        }
>>
>>           VIR_DEBUG("Starting LibSSH2 session");
>>
>> @@ -698,11 +708,21 @@ doRemoteOpen(virConnectPtr conn,
>>           if (!command && VIR_STRDUP(command, "ssh") < 0)
>>               goto failed;
>>
>> -        if (!sockname &&
>> -            VIR_STRDUP(sockname,
>> -                       flags & VIR_DRV_OPEN_REMOTE_RO ?
>> -                       LIBVIRTD_PRIV_UNIX_SOCKET_RO : LIBVIRTD_PRIV_UNIX_SOCKET) < 0)
>> -            goto failed;
>> +        if (!sockname) {
>> +            /* Right now we don't support default session connections */
>> +            if (STREQ(conn->uri->path, "/session")) {
>> +                virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>> +                               _("Connecting to session instance without "
>> +                                 "socket path is not supported by the ssh "
>> +                                 "connection driver"));
>> +                goto failed;
>> +            }
>> +
>> +            if (VIR_STRDUP(sockname,
>> +                           flags & VIR_DRV_OPEN_REMOTE_RO ?
>> +                           LIBVIRTD_PRIV_UNIX_SOCKET_RO : LIBVIRTD_PRIV_UNIX_SOCKET) < 0)
>> +                goto failed;
>> +        }
>>
>>           if (!(priv->client = virNetClientNewSSH(priv->hostname,
>>                                                   port,
>
> ACK once the BZ link is included in the commit log (and pending my
> question about whether we want to check for == "/session" or != "/system").
>

Peter




More information about the libvir-list mailing list