Skip to content

Commit 3a04ce7

Browse files
congwangdavem330
authored andcommitted
llc: fix NULL pointer deref for SOCK_ZAPPED
For SOCK_ZAPPED socket, we don't need to care about llc->sap, so we should just skip these refcount functions in this case. Fixes: f7e4367 ("llc: hold llc_sap before release_sock()") Reported-by: kernel test robot <[email protected]> Signed-off-by: Cong Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5e391dc commit 3a04ce7

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

net/llc/af_llc.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ static int llc_ui_release(struct socket *sock)
189189
{
190190
struct sock *sk = sock->sk;
191191
struct llc_sock *llc;
192-
struct llc_sap *sap;
193192

194193
if (unlikely(sk == NULL))
195194
goto out;
@@ -200,15 +199,19 @@ static int llc_ui_release(struct socket *sock)
200199
llc->laddr.lsap, llc->daddr.lsap);
201200
if (!llc_send_disc(sk))
202201
llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
203-
sap = llc->sap;
204-
/* Hold this for release_sock(), so that llc_backlog_rcv() could still
205-
* use it.
206-
*/
207-
llc_sap_hold(sap);
208-
if (!sock_flag(sk, SOCK_ZAPPED))
202+
if (!sock_flag(sk, SOCK_ZAPPED)) {
203+
struct llc_sap *sap = llc->sap;
204+
205+
/* Hold this for release_sock(), so that llc_backlog_rcv()
206+
* could still use it.
207+
*/
208+
llc_sap_hold(sap);
209209
llc_sap_remove_socket(llc->sap, sk);
210-
release_sock(sk);
211-
llc_sap_put(sap);
210+
release_sock(sk);
211+
llc_sap_put(sap);
212+
} else {
213+
release_sock(sk);
214+
}
212215
if (llc->dev)
213216
dev_put(llc->dev);
214217
sock_put(sk);

0 commit comments

Comments
 (0)