]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
can: add missing socket check in {raw|bcm|isotp}_release functions
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Wed, 20 Apr 2011 12:02:58 +0000 (12:02 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Wed, 20 Apr 2011 12:02:58 +0000 (12:02 +0000)
We can get here with a NULL socket argument passed from userspace,
so we need to handle it accordingly.

Thanks to Dave Jones pointing at this issue in net/can/bcm.c

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
git-svn-id: svn://svn.berlios.de//socketcan/trunk@1240 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/net/can/bcm.c
kernel/2.6/net/can/isotp.c
kernel/2.6/net/can/raw.c

index 6250c71a82f36e167a27ea08c09cbe72d6f072e3..e552e883258e9fa88c7fcb00af8f9bce73347f0e 100644 (file)
@@ -1557,9 +1557,14 @@ static int bcm_init(struct sock *sk)
 static int bcm_release(struct socket *sock)
 {
        struct sock *sk = sock->sk;
-       struct bcm_sock *bo = bcm_sk(sk);
+       struct bcm_sock *bo;
        struct bcm_op *op, *next;
 
+       if (sk == NULL)
+               return 0;
+
+       bo = bcm_sk(sk);
+
        /* remove bcm_ops, timer, rx_unregister(), etc. */
 
        unregister_netdevice_notifier(&bo->notifier);
index 21477e2a4c72bf3e59b17a02f2b2b353c1704829..d6df4421cdc761818156fe929f01ea9e2d9c265d 100644 (file)
@@ -795,7 +795,12 @@ static int isotp_recvmsg(struct kiocb *iocb, struct socket *sock,
 static int isotp_release(struct socket *sock)
 {
        struct sock *sk = sock->sk;
-       struct isotp_sock *so = isotp_sk(sk);
+       struct isotp_sock *so;
+
+       if (!sk)
+               return 0;
+
+       so = isotp_sk(sk);
 
        /* wait for complete transmission of current pdu */
        wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
index 5ab46cea80890f3c440ba616055fff3330a5526c..c85607bfc4e4cc594a184cfc531a2be80a6dda54 100644 (file)
@@ -333,7 +333,12 @@ static int raw_init(struct sock *sk)
 static int raw_release(struct socket *sock)
 {
        struct sock *sk = sock->sk;
-       struct raw_sock *ro = raw_sk(sk);
+       struct raw_sock *ro;
+
+       if (!sk)
+               return 0;
+
+       ro = raw_sk(sk);
 
        unregister_netdevice_notifier(&ro->notifier);