[Xcb] [PATCH libxcb 2/2] xcb_open: Improve abstraction for launchd secure sockets

Jeremy Huddleston Sequoia jeremyhu at apple.com
Wed Apr 16 02:44:11 PDT 2014


ping.

As this only really affects darwin, I'll take the lack of response as "whatever" and push this without review if I still hear crickets tomorrow.  FWIW, this patch is shipped in XQuartz-2.7.6_rc1.

--Jeremy

On Apr 5, 2014, at 21:29, Jeremy Huddleston Sequoia <jeremyhu at apple.com> wrote:

> This changes away from hard-coding the /tmp/launch-* path to now
> supporting a generic <path to unix socket>[.<screen>] format for
> $DISPLAY.
> 
> Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
> ---
> src/xcb_util.c | 95 +++++++++++++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 75 insertions(+), 20 deletions(-)
> 
> diff --git a/src/xcb_util.c b/src/xcb_util.c
> index 0c5b07f..7f446a4 100644
> --- a/src/xcb_util.c
> +++ b/src/xcb_util.c
> @@ -60,6 +60,10 @@
> # include <sys/stat.h>
> #endif
> 
> +#ifdef HAVE_LAUNCHD
> +#include <sys/stat.h>
> +#endif
> +
> int xcb_popcount(uint32_t mask)
> {
>     uint32_t y;
> @@ -78,6 +82,59 @@ int xcb_sumof(uint8_t *list, int len)
>   return s;
> }
> 
> +#ifdef HAVE_LAUNCHD
> +/* Return true and parse if name matches <path to socket>[.<screen>]
> + * Upon success:
> + *     host = <path to socket>
> + *     protocol = "unix"
> + *     display = 0
> + *     screen = <screen>
> + */
> +static int _xcb_parse_display_path_to_socket(const char *name, char **host, char **protocol,
> +                                             int *displayp, int *screenp)
> +{
> +    struct stat sbuf;
> +    char path[PATH_MAX];
> +    int _screen = 0;
> +
> +    strlcpy(path, name, sizeof(path));
> +    if (0 != stat(path, &sbuf)) {
> +        char *dot = strrchr(path, '.');
> +        if (!dot)
> +            return 0;
> +        *dot = '\0';
> +
> +        if (0 != stat(path, &sbuf))
> +            return 0;
> +
> +        _screen = atoi(dot + 1);
> +    }
> +
> +    if (host) {
> +        *host = strdup(path);
> +        if (!*host)
> +            return 0;
> +    }
> +
> +    if (protocol) {
> +        *protocol = strdup("unix");
> +        if (!*protocol) {
> +            if (host)
> +                free(*host);
> +            return 0;
> +        }
> +    }
> +
> +    if (displayp)
> +        *displayp = 0;
> +
> +    if (screenp)
> +        *screenp = _screen;
> +
> +    return 1;
> +}
> +#endif
> +
> static int _xcb_parse_display(const char *name, char **host, char **protocol,
>                       int *displayp, int *screenp)
> {
> @@ -90,10 +147,11 @@ static int _xcb_parse_display(const char *name, char **host, char **protocol,
>         return 0;
> 
> #ifdef HAVE_LAUNCHD
> -    if(strncmp(name, "/tmp/launch", 11) == 0)
> -        slash = NULL;
> -    else
> +    /* First check for <path to socket>[.<screen>] */
> +    if (_xcb_parse_display_path_to_socket(name, host, protocol, displayp, screenp))
> +        return 1;
> #endif
> +
>     slash = strrchr(name, '/');
> 
>     if (slash) {
> @@ -178,14 +236,6 @@ static int _xcb_open(const char *host, char *protocol, const int display)
>     char *file = NULL;
>     int actual_filelen;
> 
> -#ifdef HAVE_LAUNCHD
> -    if(strncmp(host, "/tmp/launch", 11) == 0) {
> -        base = host;
> -        host = "";
> -        protocol = "unix";
> -    }
> -#endif
> -
>     /* If protocol or host is "unix", fall through to Unix socket code below */
>     if ((!protocol || (strcmp("unix",protocol) != 0)) &&
>         (*host != '\0') && (strcmp("unix",host) != 0))
> @@ -211,18 +261,23 @@ static int _xcb_open(const char *host, char *protocol, const int display)
>     }
> #endif
> 
> -    filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
> -    file = malloc(filelen);
> -    if(file == NULL)
> -        return -1;
> -
> -    /* display specifies Unix socket */
> #ifdef HAVE_LAUNCHD
> -    if(strncmp(base, "/tmp/launch", 11) == 0)
> -        actual_filelen = snprintf(file, filelen, "%s:%d", base, display);
> -    else
> +    struct stat sbuf;
> +    if (0 == stat(host, &sbuf)) {
> +        file = strdup(host);
> +        filelen = actual_filelen = strlen(file);
> +    } else
> #endif
> +    {
> +        filelen = strlen(base) + 1 + sizeof(display) * 3 + 1;
> +        file = malloc(filelen);
> +        if(file == NULL)
> +            return -1;
> +
> +        /* display specifies Unix socket */
>         actual_filelen = snprintf(file, filelen, "%s%d", base, display);
> +    }
> +
>     if(actual_filelen < 0)
>     {
>         free(file);
> -- 
> 1.9.1
> 
> _______________________________________________
> Xcb mailing list
> Xcb at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xcb
> 



More information about the Xcb mailing list