Bluetooth: Disallow usage of L2CAP CID setting for now
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 16 Feb 2009 02:20:31 +0000 (03:20 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 27 Feb 2009 05:14:47 +0000 (06:14 +0100)
In the future the L2CAP layer will have full support for fixed channels
and right now it already can export the channel assignment, but for the
functions bind() and connect() the usage of only CID 0 is allowed. This
allows an easy detection if the kernel supports fixed channels or not,
because otherwise it would impossible for application to tell.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/l2cap.c

index 79a4325a1388f2de329a3b6c7e6d3f9fc93a6dd0..7c6768c2a530e997aaeffb3eb7281417f2f88c6a 100644 (file)
@@ -799,6 +799,9 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
        len = min_t(unsigned int, sizeof(la), alen);
        memcpy(&la, addr, len);
 
+       if (la.l2_cid)
+               return -EINVAL;
+
        lock_sock(sk);
 
        if (sk->sk_state != BT_OPEN) {
@@ -929,19 +932,20 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
        struct sockaddr_l2 la;
        int len, err = 0;
 
-       lock_sock(sk);
-
        BT_DBG("sk %p", sk);
 
-       if (!addr || addr->sa_family != AF_BLUETOOTH) {
-               err = -EINVAL;
-               goto done;
-       }
+       if (!addr || addr->sa_family != AF_BLUETOOTH)
+               return -EINVAL;
 
        memset(&la, 0, sizeof(la));
        len = min_t(unsigned int, sizeof(la), alen);
        memcpy(&la, addr, len);
 
+       if (la.l2_cid)
+               return -EINVAL;
+
+       lock_sock(sk);
+
        if (sk->sk_type == SOCK_SEQPACKET && !la.l2_psm) {
                err = -EINVAL;
                goto done;