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

Michel Dänzer michel at daenzer.net
Mon Jan 11 22:57:25 PST 2016


On 17.12.2015 16:41, 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.
> v3: (Michel Dänzer)
>     * Use GetClientCmdName (Mark Kettenis)
>     * Perform check on Windows as well, but only ignore path on Cygwin
>       (Martin Peres, Emil Velikov, Jon Turney)
> 
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Martin, Mark, Jon, any other objections? If not, can we get a Reviewed-by?


> ---
>  os/access.c | 38 +++++++++++++++++++++++++++++++++++---
>  1 file changed, 35 insertions(+), 3 deletions(-)
> 
> diff --git a/os/access.c b/os/access.c
> index 10a48c3..3ea2e21 100644
> --- a/os/access.c
> +++ b/os/access.c
> @@ -173,6 +173,10 @@ SOFTWARE.
>  
>  #endif                          /* WIN32 */
>  
> +#if !defined(WIN32) || defined(__CYGWIN__)
> +#include <libgen.h>
> +#endif
> +
>  #define X_INCLUDE_NETDB_H
>  #include <X11/Xos_r.h>
>  
> @@ -1081,9 +1085,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 +1119,35 @@ ComputeLocalClient(ClientPtr client)
>      return FALSE;
>  }
>  
> +/* Is client on the local host */
> +Bool
> +ComputeLocalClient(ClientPtr client)
> +{
> +    const char *cmdname = GetClientCmdName(client);
> +
> +    if (!xtransLocalClient(client))
> +        return FALSE;
> +
> +    /* If the executable name is "ssh", assume that this client connection
> +     * is forwarded from another host via SSH
> +     */
> +    if (cmdname) {
> +        Bool ret;
> +
> +#if !defined(WIN32) || defined(__CYGWIN__)
> +        char *cmd = strdup(cmdname);
> +        ret = strcmp(basename(cmd), "ssh") != 0;
> +        free(cmd);
> +#else
> +        ret = strcmp(cmdname, "ssh") != 0;
> +#endif
> +
> +        return ret;
> +    }
> +
> +    return TRUE;
> +}
> +
>  /*
>   * Return the uid and all gids of a connected local client
>   * Allocates a LocalClientCredRec - caller must call FreeLocalClientCreds
> 


-- 
Earthling Michel Dänzer               |               http://www.amd.com
Libre software enthusiast             |             Mesa and X developer


More information about the xorg-devel mailing list