[Spice-devel] [PATCH spice 08/18] red-channel: send marshaller message fd
Marc-André Lureau
marcandre.lureau at gmail.com
Tue Dec 15 15:49:22 PST 2015
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 1cc6534..9385d67 100644
--- a/server/red-channel.c
+++ b/server/red-channel.c
@@ -615,8 +615,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) {
+ close(fd);
+ fd = -1;
+ }
+
+ if (reds_stream_send_msgfd(rcc->stream, fd) < 0) {
+ perror("sendfd");
+ red_channel_client_disconnect(rcc);
+ return;
+ }
+ close(fd);
+ }
+
red_channel_client_release_sent_item(rcc);
if (rcc->send_data.blocked) {
rcc->send_data.blocked = FALSE;
--
2.5.0
More information about the Spice-devel
mailing list