From owner-freebsd-net Wed Mar 7 20: 8:36 2001 Delivered-To: freebsd-net@freebsd.org Received: from prism.flugsvamp.com (cb58709-a.mdsn1.wi.home.com [24.17.241.9]) by hub.freebsd.org (Postfix) with ESMTP id 7A32C37B718 for ; Wed, 7 Mar 2001 20:08:33 -0800 (PST) (envelope-from jlemon@flugsvamp.com) Received: (from jlemon@localhost) by prism.flugsvamp.com (8.11.0/8.11.0) id f28465855000; Wed, 7 Mar 2001 22:06:05 -0600 (CST) (envelope-from jlemon) Date: Wed, 7 Mar 2001 22:06:05 -0600 From: Jonathan Lemon To: itojun@iijlab.net Cc: Wietse Venema , Jonathan Lemon , Arjan.deVet@adv.iae.nl, net@freebsd.org, postfix-users@postfix.org Subject: Re: [itojun@iijlab.net: accept(2) behavior with tcp RST right after handshake] Message-ID: <20010307220605.Q41963@prism.flugsvamp.com> References: <20010307212035.8170EBC070@spike.porcupine.org> <6251.984023551@coconut.itojun.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0pre2i In-Reply-To: <6251.984023551@coconut.itojun.org> Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org On Thu, Mar 08, 2001 at 12:52:31PM +0900, itojun@iijlab.net wrote: > > >Several parts of Postfix do: connect() write() close(), where the > >close() may happen before the server has accept()ed the connection. > >Due to an incompatible change in FreeBSD 4.2-STABLE, this causes > >accept() after close() to fail. The already written data is lost. > >This is a bad incompatible change. > > see SUSv2 and XNET 5.2 spec for accept(), and Stevens (unix network > programming vol 1 2nd ed) section 5.11. > http://www.opengroup.org/onlinepubs/007908799/xns/accept.html > > 4.3BSD behavior was very wrong (described in Stevens). > > old freebsd behavior (return 0-length sockaddr) was also wrong, > it kills a set of applications including sendmail and BIND910. > > new freebsd behavior (ECONNABORTED) is at least SUSv2 conformant, > and I expect it to be the behavior of other stacks. The crucial part of Wietse's message (which he didn't mention in the first email) is that he's using this setup on unix-domain sockets. These probably have semantics which are slightly different. I believe the correct thing to do at this point is push the IS_DISCONNECTED test down to each protocol's accept routine, instead of short-circuiting it in soaccept. It looks like the short-circuit test was added in uipc_socket.c:1.41 in the NetBSD sources, which we brought over. I'm not sure why this test is actually needed, though. -- Jonathan To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message