[Xcb] [PATCH libxcb v3 1/5] xcb_send_fd(): Always close fds

Uli Schlachter psychon at znc.in
Fri Jun 12 00:47:16 PDT 2015


Since no one complained, I just pushed this whole series.

Uli

Am 26.05.2015 um 21:58 schrieb Uli Schlachter:
> The API docs for xcb_send_fd() says "After this function returns, the file
> descriptor given is owned by xcb and will be closed eventually".
> 
> Let the implementation live up to its documentation. We now also close fds if fd
> passing is unavailable (!HAVE_SENDMSG) and when the connection is in an error
> state.
> 
> (This also does sneak in some preparatory functions for follow-up commits and
> thus does things in a more complicated way than really necessary.)
> 
> Signed-off-by: Uli Schlachter <psychon at znc.in>
> ---
>  src/xcb_out.c | 44 ++++++++++++++++++++++++++++++++++----------
>  1 file changed, 34 insertions(+), 10 deletions(-)
> 
> diff --git a/src/xcb_out.c b/src/xcb_out.c
> index 8cc5be8..722463e 100644
> --- a/src/xcb_out.c
> +++ b/src/xcb_out.c
> @@ -177,6 +177,34 @@ uint32_t xcb_get_maximum_request_length(xcb_connection_t *c)
>      return c->out.maximum_request_length.value;
>  }
>  
> +static void close_fds(int *fds, unsigned int num_fds)
> +{
> +    for (unsigned int index = 0; index < num_fds; index++)
> +        close(fds[index]);
> +}
> +
> +static void send_fds(xcb_connection_t *c, int *fds, unsigned int num_fds)
> +{
> +#if HAVE_SENDMSG
> +    while (num_fds > 0) {
> +        /* FIXME: This will busy-loop when XCB_MAX_PASS_FD fds are sent at once */
> +        while (c->out.out_fd.nfd == XCB_MAX_PASS_FD && !c->has_error) {
> +            /* XXX: if c->out.writing > 0, this releases the iolock and
> +             * potentially allows other threads to interfere with their own fds.
> +             */
> +            _xcb_out_flush_to(c, c->out.request);
> +        }
> +        if (c->has_error)
> +            break;
> +
> +        c->out.out_fd.fd[c->out.out_fd.nfd++] = fds[0];
> +        fds++;
> +        num_fds--;
> +    }
> +#endif
> +    close_fds(fds, num_fds);
> +}
> +
>  uint64_t xcb_send_request64(xcb_connection_t *c, int flags, struct iovec *vector, const xcb_protocol_request_t *req)
>  {
>      uint64_t request;
> @@ -295,19 +323,15 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect
>  void
>  xcb_send_fd(xcb_connection_t *c, int fd)
>  {
> -#if HAVE_SENDMSG
> -    if (c->has_error)
> +    int fds[1] = { fd };
> +
> +    if (c->has_error) {
> +        close(fd);
>          return;
> -    pthread_mutex_lock(&c->iolock);
> -    while (c->out.out_fd.nfd == XCB_MAX_PASS_FD) {
> -        _xcb_out_flush_to(c, c->out.request);
> -        if (c->has_error)
> -            break;
>      }
> -    if (!c->has_error)
> -        c->out.out_fd.fd[c->out.out_fd.nfd++] = fd;
> +    pthread_mutex_lock(&c->iolock);
> +    send_fds(c, &fds[0], 1);
>      pthread_mutex_unlock(&c->iolock);
> -#endif
>  }
>  
>  int xcb_take_socket(xcb_connection_t *c, void (*return_socket)(void *closure), void *closure, int flags, uint64_t *sent)
> 


-- 
Homophobia - The fear that another man will treat you the way you treat women.


More information about the Xcb mailing list