Thread (12 messages) flat view 12 messages, 5 authors, 2012-08-21

Re: IPv4 BUG: held lock freed!

From: Julian Anastasov <ja@ssi.bg>
Date: 2012-08-19 16:55:52
Also in: lkml

	Hello,

On Sun, 19 Aug 2012, Eric Dumazet wrote:
Hmm, this looks like sk_reset_timer() is called on a socket, and timer
triggers _before_ the sock_hold()

So the timer handler decrements sk_refcnt to 0 and calls sk_free()

Its probably a bug introduced (or uncovered) by commit 6f458dfb40 (tcp:
improve latencies of timer triggered events)

I always found sk_reset_timer() a bit racy...

void sk_reset_timer(struct sock *sk, struct timer_list* timer,
                    unsigned long expires)
{
	if (!mod_timer(timer, expires))
		sock_hold(sk); // MIGHT BE TOO LATE
}

Following should be safer...
	Above code is fine as long as caller holds reference.

	Your change for tcp_release_cb looks correct.

	Also, may be tcp_v4_mtu_reduced is missing a check
for TCP_CLOSE state? tcp_v6_mtu_reduced already has such
check.
void sk_reset_timer(struct sock *sk, struct timer_list* timer,
                    unsigned long expires)
{
	This should not be needed:
	sock_hold(sk);
	if (mod_timer(timer, expires))
		sock_put(sk);
}
Regards

--
Julian Anastasov [off-list ref]
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help