]> rtime.felk.cvut.cz Git - socketcan-devel.git/blobdiff - kernel/2.6/net/can/bcm.c
Added socket locking in broadcast manager sendmsg().
[socketcan-devel.git] / kernel / 2.6 / net / can / bcm.c
index 424b2b9e2da45ca5fe02c1c8192502e109388b38..ae508b108b2187aab5ee99d947a70c1909e4de43 100644 (file)
@@ -1390,6 +1390,8 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        DBG("opcode %d for can_id %03X\n", msg_head.opcode, msg_head.can_id);
 
+       lock_sock(sk);
+
        switch (msg_head.opcode) {
 
        case TX_SETUP:
@@ -1429,9 +1431,9 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
        case TX_SEND:
                /* we need at least one can_frame */
                if (msg_head.nframes < 1)
-                       return -EINVAL;
-
-               ret = bcm_tx_send(msg, ifindex, sk);
+                       ret = -EINVAL;
+               else
+                       ret = bcm_tx_send(msg, ifindex, sk);
                break;
 
        default:
@@ -1440,6 +1442,8 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
                break;
        }
 
+       release_sock(sk);
+
        return ret;
 }