[PATCH xserver v2.1] os: Treat ssh as a non-local client (v2)

Martin Peres martin.peres at free.fr
Fri Dec 11 02:20:55 PST 2015


On 11/12/15 11:30, Michel Dänzer wrote:
> On 11.12.2015 18:17, Martin Peres wrote:
>> On 11/12/15 04:34, Michel Dänzer wrote:
>>> From: Adam Jackson <ajax at redhat.com>
>>>
>>> By the time we get to ComputeLocalClient, we've already done
>>> NextAvailableClient → ReserveClientIds → DetermineClientCmd (assuming
>>> we're built with #define CLIENTIDS), so we can look up the name of the
>>> client process and refuse to treat ssh's X forwarding as if it were
>>> local.
>>>
>>> v2: (Michel Dänzer)
>>>       * Only match "ssh" itself, not other executable names starting with
>>>         that prefix.
>>>       * Ignore executable path for the match.
>>>
>>> Signed-off-by: Adam Jackson <ajax at redhat.com>
>>> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
>>> ---
>>>
>>> v2.1: Slightly extended code comment
>>>
>>>    os/access.c | 29 ++++++++++++++++++++++++++---
>>>    1 file changed, 26 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/os/access.c b/os/access.c
>>> index 10a48c3..3e32128 100644
>>> --- a/os/access.c
>>> +++ b/os/access.c
>>> @@ -101,6 +101,7 @@ SOFTWARE.
>>>    #include <sys/socket.h>
>>>    #include <sys/ioctl.h>
>>>    #include <ctype.h>
>>> +#include <libgen.h>
>>>      #ifndef NO_LOCAL_CLIENT_CRED
>>>    #include <pwd.h>
>>> @@ -1081,9 +1082,8 @@ ResetHosts(const char *display)
>>>        }
>>>    }
>>>    -/* Is client on the local host */
>>> -Bool
>>> -ComputeLocalClient(ClientPtr client)
>>> +static Bool
>>> +xtransLocalClient(ClientPtr client)
>>>    {
>>>        int alen, family, notused;
>>>        Xtransaddr *from = NULL;
>>> @@ -1116,6 +1116,29 @@ ComputeLocalClient(ClientPtr client)
>>>        return FALSE;
>>>    }
>>>    +/* Is client on the local host */
>>> +Bool
>>> +ComputeLocalClient(ClientPtr client)
>>> +{
>>> +    if (!xtransLocalClient(client))
>>> +        return FALSE;
>>> +
>>> +#ifndef WIN32
>> Why add this ifndef?
> Because libgen.h and basename() aren't available on Windows AFAICT. I
> figured this use case probably isn't common enough on Windows anyway to
> bother making it work there as well.

You are right, basename is a POSIX function and mingw does expose it, 
but it turns out msvc does not. As you said, it is probably not worth 
the effort to add msvc support that no-one will be able to test anyway.

>
>> And why all clients of an xserver running on windows should be
>> considered local?
> You misread the patch. There's no change in behaviour on Windows,
> because xtransLocalClient and by extension ComputeLocalClient returns
> FALSE in all the same cases ComputeLocalClient did before the patch.

Yes, indeed. The added code is just filtering one more case.

Reviewed-by: Martin Peres <martin.peres at linux.intel.com>

>
>
>>> +    /* If the executable name is "ssh", assume that this client
>>> connection
>>> +     * is forwarded from another host via SSH
>>> +     */
>>> +    if (client->clientIds->cmdname) {
>>> +        char *cmdname = strdup(client->clientIds->cmdname);
>>> +        Bool ret = strcmp(basename(cmdname), "ssh") != 0;
>>> +
>>> +        free(cmdname);
>>> +        return ret;
>>> +    }
>>> +#endif
>>> +
>>> +    return TRUE;
>>> +}
>>> +
>>>    /*
>>>     * Return the uid and all gids of a connected local client
>>>     * Allocates a LocalClientCredRec - caller must call
>>> FreeLocalClientCreds
>



More information about the xorg-devel mailing list