Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Nov 1998 17:10:10 -0800 (PST)
From:      Marc Slemko <marcs@znep.com>
To:        Brian Somers <brian@Awfulhak.org>
Cc:        freebsd-hackers@FreeBSD.ORG
Subject:   Re: bind()/listen() race 
Message-ID:  <Pine.BSF.4.05.9811081702180.8174-100000@alive.znep.com>
In-Reply-To: <199811082334.XAA06518@woof.lan.awfulhak.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 8 Nov 1998, Brian Somers wrote:

> The code says something like:
> 
>   if (bind(blah) < 0) {
>     /* we're happy to be the client */
>     if (connect(blah) < 0) {
>       socket is bound without a listen !
>     }
>   } else if (listen(blah) < 0) {
>     oops !
>   }
> 
> The sockaddrs are local domain sockets used by ppp in multilink mode. 
> Whoever gets to be the server will survive.  The other ppp will 
> become the client, pass a file descriptor to the server and hang 
> around holding the session 'till the other ppp kills it.
> 
> However, if the two ppps get unlucky, one bind()s and the second 
> fails then tries to connect() and fails 'cos the server hasn't 
> listen()ed yet.  This is bad news.
> 
> The only way I can see around it - given that I can't sleep() in ppp 
> without screwing up with other timing issues - is to detect the error 
> and do a 1 second timeout, and try again then.  This is a nasty thing 
> to have to do....  I'd prefer an atomic bind()/listen() facility....

No, an atomic bind/listen isn't the solution, you simply need some form of
synchronization between the processes.

For example, you could use a lockfile and require a write lock arouncd the
bind and listen.

Unfortunately, inter process synchronization is more of a pain than intra
process synchronization.

If you used a lock file on disk with the server pid, you could also avoid
mistakenly thinking that something else listening on the port is the
server.

You suggestion is possible as a workaround, and is probably the easiest
fix.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9811081702180.8174-100000>