This is the mail archive of the
mailing list for the Cygwin project.
Re: 1.5.19-3 parent socket binding remains after closing when spawning child process
- From: Corinna Vinschen <corinna-cygwin at cygwin dot com>
- To: cygwin at cygwin dot com
- Date: Mon, 23 Jan 2006 16:18:10 +0100
- Subject: Re: 1.5.19-3 parent socket binding remains after closing when spawning child process
- References: <email@example.com>
- Reply-to: cygwin at cygwin dot com
On Jan 20 11:53, Martin wrote:
> Well, this is a strange one.
> I open a socket in a parent process, bind it and
> I set the socket to close-on-exec with the FD_CLOEXEC
> A child process is spawned, which doesn't inherit the
> I then close the server socket in the parent process.
> For a laugh, I attempt to connect to the port
> associated with the server socket. I would expect
> this connection request to fail, since I just closed
> the socket. It doesn't.
> The attached test case illustrates this.
> Please let me know if I'm doing something wrong.
Thanks very much for the testcase. I found that when duplicating
sockets between processes using the WSADuplicateSocket/WSASocket method,
the duplicated socket is inheritable by child processes again, even when
the original socket has the inheritance flag removed. So, what
basically happend behind the scenes was this:
sock = socket()
WSADuplicateSocket(sock) in parent
sock = WSASocket in child, BUT sock is inheritable again.
close_on_exec is set? Yes, don't duplicate socket.
... but sock was inheritable, so the exec'ed process got a
valid handle to a valid, listening socket. Bummer.
I've checked in a patch to CVS which resets the inheritance for the
duplicated socket in the child process, so there's no valid, open handle
to the listening socket anymore, after the parent called close() and the
forked child exec'ed. Consequentially the 2nd connect call fails now.
Thanks again for the testcase, it was highly appreciated,
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Project Co-Leader cygwin AT cygwin DOT com
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html