diff options
Diffstat (limited to 'net/bluetooth/smp.c')
| -rw-r--r-- | net/bluetooth/smp.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 68a9587c969..5abefb12891 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c @@ -859,6 +859,19 @@ int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)  	skb_pull(skb, sizeof(code)); +	/* +	 * The SMP context must be initialized for all other PDUs except +	 * pairing and security requests. If we get any other PDU when +	 * not initialized simply disconnect (done if this function +	 * returns an error). +	 */ +	if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ && +	    !conn->smp_chan) { +		BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code); +		kfree_skb(skb); +		return -ENOTSUPP; +	} +  	switch (code) {  	case SMP_CMD_PAIRING_REQ:  		reason = smp_cmd_pairing_req(conn, skb);  |