Commit ee1dc142 authored by Stephen Hemminger's avatar Stephen Hemminger

[NET] Fix X.25 use after free.

The conversion from cli/sti to locking in X.25 must not have been tested
on a real SMP with memory debugging enabled.  It OOPS right away if
I do:
        modprobe x25; ifconfig -a

The problem is that it dereferences the socket after it has already been
freed.  The fix for this is to make the call to sock_put, later in
x25_destroy_socket do the free.  Also, need a go to avoid references
in x25_release.
parent ca8c5e0e
...@@ -350,8 +350,11 @@ void x25_destroy_socket(struct sock *sk) ...@@ -350,8 +350,11 @@ void x25_destroy_socket(struct sock *sk)
sk->sk_timer.function = x25_destroy_timer; sk->sk_timer.function = x25_destroy_timer;
sk->sk_timer.data = (unsigned long)sk; sk->sk_timer.data = (unsigned long)sk;
add_timer(&sk->sk_timer); add_timer(&sk->sk_timer);
} else } else {
sk_free(sk); /* drop last reference so sock_put will free */
__sock_put(sk);
}
release_sock(sk); release_sock(sk);
sock_put(sk); sock_put(sk);
} }
...@@ -553,7 +556,7 @@ static int x25_release(struct socket *sock) ...@@ -553,7 +556,7 @@ static int x25_release(struct socket *sock)
case X25_STATE_2: case X25_STATE_2:
x25_disconnect(sk, 0, 0, 0); x25_disconnect(sk, 0, 0, 0);
x25_destroy_socket(sk); x25_destroy_socket(sk);
break; goto out;
case X25_STATE_1: case X25_STATE_1:
case X25_STATE_3: case X25_STATE_3:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment