
On 07/23/2012 06:50 PM, Eric Blake wrote:
On 07/23/2012 07:08 AM, Corey Bryant wrote:
Set the close-on-exec flag for the file descriptor received via SCM_RIGHTS.
+++ b/qemu-char.c @@ -2263,9 +2263,17 @@ static ssize_t tcp_chr_recv(CharDriverState *chr, char *buf, size_t len) msg.msg_control = &msg_control; msg.msg_controllen = sizeof(msg_control);
+#ifdef MSG_CMSG_CLOEXEC + ret = recvmsg(s->fd, &msg, MSG_CMSG_CLOEXEC); +#else ret = recvmsg(s->fd, &msg, 0); - if (ret > 0 && s->is_unix) + if (ret > 0) { + qemu_set_cloexec(s->fd);
Wrong fd. You aren't changing cloexec on the socket (s->fd), but on the fd that was received via msg (which you don't know at this point in time).
Ugh, that's bad.
+ } +#endif + if (ret > 0 && s->is_unix) { unix_process_msgfd(chr, &msg);
Only here do you know what fd you received.
I would write it more like:
int flags = 0; #ifdef MSG_CMSG_CLOEXEC flags |= MSG_CMSG_CLOEXEC #endif ret = recvmsg(s->fd, &msg, flags); if (ret > 0 && s->is_unix) { unix_process_msgfd(chr, &msg); #ifndef MSG_CMSG_CLOEXEC qemu_set_cloexec(/* fd determined from msg */) #endif }
which almost implies that unix_process_msgfd() should be the function that sets cloexec, but without wasting the time doing so if recvmsg already did the job.
Thanks for the suggestion and catching this. I'll take this into account in the next version. -- Regards, Corey