[SCTP][patch] socket does not wake up
Randall Stewart
rrs at cisco.com
Wed Oct 3 16:20:00 PDT 2007
Martin:
Thanks for the patch.. note that I will submit it to
re for approval after a minor fix.
socantrcvmore(so);
assumes you do NOT hold a lock. This code holds
the socket lock.. which is the recv sockbuf lock..
So if you turn witness on your kernel and run with this
you will have a double lock.. panic.
Note to fix this right you should have it be:
SOCK_UNLOCK(so);
+ socantrcvmore(so);
Which is what I will submit to release ops.. you may want
to change this in what you are working with so you don;t
have some other side-effect issue from the double lock.. like
leaking sockets.
R
Martin Kulas wrote:
> Hello!
>
> I patched netcat to support 1to1-SCTP sockets.
> Netcat uses the poll() system call to wait for new data
> in the socket buffer. The problem is that poll() does not
> return when the kernel has closed the SCTP association.
> Select() has the same problem.
>
> I digged around in the SCTP sources and created a patched to remove
> that bug. The patch is a one-liner:
>
> <patch>
> --- sctp_pcb.c.orig 2007-10-03 13:27:12.000000000 +0200
> +++ sctp_pcb.c 2007-10-03 15:51:55.286987000 +0200
> @@ -4234,6 +4234,7 @@
> SS_ISCONFIRMING |
> SS_ISCONNECTED);
> }
> + socantrcvmore(so);
> SOCK_UNLOCK(so);
> sctp_sowwakeup(inp, so);
> sctp_sorwakeup(inp, so);
> </patch>
>
> Now I have no problems with the system calls select()/poll() anymore.
> Is this patch OK or have I missed anything?
>
>
> Regards,
> Martin
>
--
Randall Stewart
NSSTG - Cisco Systems Inc.
803-345-0369 <or> 803-317-4952 (cell)
More information about the freebsd-current
mailing list