[Spice-devel] [PATCH server v2 05/13] red-channel: send marshaller message fd

Frediano Ziglio fziglio at redhat.com
Fri Jan 15 02:44:44 PST 2016


> 
> From: Marc-André Lureau <mlureau at redhat.com>
> 
> Send the fd associated to the last message sent.
> 
> Even if the fd is invalid, the sendfd msg is appended to the protocol,
> for 2 reasons:
> - trying to send an invalid fd does not have to close the connection (it
>   would with an invalid fd)
> - even if the fd is invalid, the protocol expects an extra byte for the
>   ancillary data
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
> ---
>  server/red-channel.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/server/red-channel.c b/server/red-channel.c
> index 306c87d..b33c91d 100644
> --- a/server/red-channel.c
> +++ b/server/red-channel.c
> @@ -608,8 +608,24 @@ static inline void
> red_channel_client_release_sent_item(RedChannelClient *rcc)
>  static void red_channel_peer_on_out_msg_done(void *opaque)
>  {
>      RedChannelClient *rcc = (RedChannelClient *)opaque;
> +    int fd = spice_marshaller_get_fd(rcc->send_data.marshaller);
>  
>      rcc->send_data.size = 0;
> +
> +    if (fd != -1) {
> +        if (fcntl(fd, F_GETFD) == -1) {

Is not clear what's the reason for this test.
Why should fail?

> +            close(fd);
> +            fd = -1;
> +        }
> +
> +        if (reds_stream_send_msgfd(rcc->stream, fd) < 0) {
> +            perror("sendfd");
> +            red_channel_client_disconnect(rcc);
> +            return;

I think here you should close the file descriptor too to avoid leak.

> +        }
> +        close(fd);
> +    }
> +
>      red_channel_client_release_sent_item(rcc);
>      if (rcc->send_data.blocked) {
>          rcc->send_data.blocked = FALSE;
> --
> 2.5.0
> 
> 

Frediano


More information about the Spice-devel mailing list