On Mon, 26 Sep 2011 16:12:55 +0200 K. Macy wrote:

 KM> Sorry, didn't look at the images (limited bw), I've seen something
 KM> like this before in timewait. This "can't happen" with UDP so will be
 KM> interested in learning more about the bug.

The panic can be easily triggered by this:

Attachment: test_udp.c
Description: Binary data

The other thread at that moment is in soclose->sofree->upd_detach->in_pcbfree.

It looks for me that we should call in_pcbdrop() in udp_close() to remove
inpcb from hashed lists, like it is done for tcp_close().

With this patch I don't observe the panic.

Index: sys/netinet/udp_usrreq.c
===================================================================
--- sys/netinet/udp_usrreq.c	(revision 225816)
+++ sys/netinet/udp_usrreq.c	(working copy)
@@ -1486,6 +1486,7 @@ udp_close(struct socket *so)
 	inp = sotoinpcb(so);
 	KASSERT(inp != NULL, ("udp_close: inp == NULL"));
 	INP_WLOCK(inp);
+	in_pcbdrop(inp);
 	if (inp->inp_faddr.s_addr != INADDR_ANY) {
 		INP_HASH_WLOCK(&V_udbinfo);
 		in_pcbdisconnect(inp);
 KM> On Mon, Sep 26, 2011 at 4:02 PM, Arnaud Lacombe <lacom...@gmail.com> wrote:
 >> Hi,
 >>
 >> On Mon, Sep 26, 2011 at 5:12 AM, K. Macy <km...@freebsd.org> wrote:
 >>>
 >>>
 >>> On Monday, September 26, 2011, Adrian Chadd <adr...@freebsd.org> wrote:
 >>>> On 26 September 2011 13:41, Arnaud Lacombe <lacom...@gmail.com> wrote:
 >>>>>  /*
 >>>>>   * XXX
 >>>>>   * This entire block sorely needs a rewrite.
 >>>>>   */
 >>>>>        if (t &&
 >>>>>            ((t->inp_flags & INP_TIMEWAIT) == 0) &&
 >>>>>            (so->so_type != SOCK_STREAM ||
 >>>>>             ntohl(t->inp_faddr.s_addr) == INADDR_ANY) &&
 >>>>>            (ntohl(sin->sin_addr.s_addr) != INADDR_ANY ||
 >>>>>             ntohl(t->inp_laddr.s_addr) != INADDR_ANY ||
 >>>>>             (t->inp_socket->so_options &
 >>>>>           SO_REUSEPORT) == 0) &&
 >>>>>            (inp->inp_cred->cr_uid !=
 >>>>>             t->inp_cred->cr_uid))
 >>>>>          return (EADDRINUSE);
 >>>>>      }
 >>>>>
 >>>>> more specifically, `t->inp_socket' is NULL. The top comment may not be
 >>>>> relevant, as it's been here for the past 8 years.
 >>>>
 >>>> Why would t->inp_socket be NULL at this point?
 >>>
 >>> TIME_WAIT ...
 >>>
 >> on UDP socket ?
 >>
 >>  - Arnaud
 >>
 KM> _______________________________________________
 KM> freebsd-net@freebsd.org mailing list
 KM> http://lists.freebsd.org/mailman/listinfo/freebsd-net
 KM> To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

-- 
Mikolaj Golub
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to