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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

----- Original Message -----
> > 
> > Hi
> > 
> > On Fri, Jan 15, 2016 at 11:44 AM, Frediano Ziglio <fziglio@xxxxxxxxxx>
> > wrote:
> > >>
> > >> From: Marc-André Lureau <mlureau@xxxxxxxxxx>
> > >>
> > >> 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@xxxxxxxxx>
> > >> ---
> > >>  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?
> > 
> > It should not fail, but if the caller has set an invalid fd (or it
> > became invalid), I think it is better to deal with it and not
> > disconnect the client. (trying to send an invalid fd over sendmsg
> > closes the connection)
> > 
> 
> The file descriptor is saved with a dup. If the handle became invalid
> it means some internal corruption happened. In this case I would even
> abort the program.
> 

Ok, I don't think I have good enough reasons to keep this either. Let's remove the check.

> > >
> > >> +            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.
> > >
> > 
> > agreed
> > 
> > >> +        }
> > >> +        close(fd);
> > >> +    }
> > >> +
> > >>      red_channel_client_release_sent_item(rcc);
> > >>      if (rcc->send_data.blocked) {
> > >>          rcc->send_data.blocked = FALSE;
> 
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel@xxxxxxxxxxxxxxxxxxxxx
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]