diff options
Diffstat (limited to 'net/bluetooth/l2cap_sock.c')
-rw-r--r-- | net/bluetooth/l2cap_sock.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index f45d361e84d..a8d28937379 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -103,7 +103,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
103 | len = min_t(unsigned int, sizeof(la), alen); | 103 | len = min_t(unsigned int, sizeof(la), alen); |
104 | memcpy(&la, addr, len); | 104 | memcpy(&la, addr, len); |
105 | 105 | ||
106 | if (la.l2_cid) | 106 | if (la.l2_cid && la.l2_psm) |
107 | return -EINVAL; | 107 | return -EINVAL; |
108 | 108 | ||
109 | lock_sock(sk); | 109 | lock_sock(sk); |
@@ -145,6 +145,9 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
145 | l2cap_pi(sk)->sec_level = BT_SECURITY_SDP; | 145 | l2cap_pi(sk)->sec_level = BT_SECURITY_SDP; |
146 | } | 146 | } |
147 | 147 | ||
148 | if (la.l2_cid) | ||
149 | l2cap_pi(sk)->scid = la.l2_cid; | ||
150 | |||
148 | write_unlock_bh(&l2cap_sk_list.lock); | 151 | write_unlock_bh(&l2cap_sk_list.lock); |
149 | 152 | ||
150 | done: | 153 | done: |
@@ -266,7 +269,7 @@ static int l2cap_sock_listen(struct socket *sock, int backlog) | |||
266 | goto done; | 269 | goto done; |
267 | } | 270 | } |
268 | 271 | ||
269 | if (!l2cap_pi(sk)->psm) { | 272 | if (!l2cap_pi(sk)->psm && !l2cap_pi(sk)->dcid) { |
270 | bdaddr_t *src = &bt_sk(sk)->src; | 273 | bdaddr_t *src = &bt_sk(sk)->src; |
271 | u16 psm; | 274 | u16 psm; |
272 | 275 | ||