On Thu, Feb 08, 2001 at 10:12:43AM -0800, Archie Cobbs wrote:
> Jonathan Lemon writes:
> > >> Jayanth did make one point that an application could assume that 
> > >> the error return from accept was in regards to the listening socket
> > >> instead of the new socket, so that may be a concern.
> > >
> > >Yes I have always assumed this to be true. If the connection is
> > >already broken before I get it, why bother giving it to me??
> > 
> > Because the connection may be broken between the point where we've
> > notified the user that there is a valid connection, and when accept
> > returns.  E.g.:
> 
> It was a rhetorical question. I like Robert's suggestion to return
> the socket but have the first operation on the socket fail.
> 
> If you want to positively verify the new socket you can do a
> getpeername(), etc.
> 
> > I would guess that code is more likely to check for an error
> > return from accept() than it is to check the return size from
> > the sockaddr, so this change will proabably not result in breaking
> > a large amount of code.
> 
> IMHO the app is more likely to close the listen socket and stop
> accepting new connections if it gets an error from accept().
> 
> For example, from an initial scan of sendmail (daemon.c:403) if
> it gets an error from accept(2) it will close the (listen) socket
> and reopen it.  Sendmail is robust enough not to "break" but this
> shows that if it gets an accept(2) error it assumes the problem is
> with the *listening* socket, not the new socket.

Yes, I looked at sendmail, ftpd, sshd, telnetd, inetd, and apache.
Only apache does the right thing in this case.  All the other
applications either:

        1. handle the error from accept() in some form (which may
           include terminating the application), or 
        2. blindly use the returned sockname.

So in sendmail's case, it currently does:

        t = accept(.., (struct sockaddr *)&RealHostAddr, &lotherend);
        ....
        p = hostnamebyanyaddr(&RealHostAddr);

which will proabably coredump since it dereferences a NULL pointer.
I'd think that at least having sendmail close/reopen the listen socket
will result in slightly more robust behavior.
--
Jonathan


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message

Reply via email to