Oliver Neukum 322fe2
From b86b0b150fed840c376145383ef5105116c81b0c Mon Sep 17 00:00:00 2001
Oliver Neukum 322fe2
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Oliver Neukum 322fe2
Date: Fri, 27 Mar 2020 11:32:14 -0700
Oliver Neukum 322fe2
Subject: [PATCH] Bluetooth: L2CAP: Fix handling LE modes by L2CAP_OPTIONS
Oliver Neukum 322fe2
Git-commit: b86b0b150fed840c376145383ef5105116c81b0c
Oliver Neukum 322fe2
References: git-fixes
Oliver Neukum 322fe2
Patch-mainline: v5.8-rc1
Oliver Neukum 322fe2
Oliver Neukum 322fe2
L2CAP_OPTIONS shall only be used with BR/EDR modes.
Oliver Neukum 322fe2
Oliver Neukum 322fe2
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Oliver Neukum 322fe2
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Oliver Neukum 322fe2
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Oliver Neukum 322fe2
---
Oliver Neukum 322fe2
 net/bluetooth/l2cap_sock.c |   25 +++++++++++++++++++++----
Oliver Neukum 322fe2
 1 file changed, 21 insertions(+), 4 deletions(-)
Oliver Neukum 322fe2
Oliver Neukum 322fe2
--- a/net/bluetooth/l2cap_sock.c
Oliver Neukum 322fe2
+++ b/net/bluetooth/l2cap_sock.c
Oliver Neukum 322fe2
@@ -418,6 +418,20 @@ static int l2cap_sock_getsockopt_old(str
Oliver Neukum 322fe2
 			break;
Oliver Neukum 322fe2
 		}
Oliver Neukum 322fe2
 
Oliver Neukum 322fe2
+		/* Only BR/EDR modes are supported here */
Oliver Neukum 322fe2
+		switch (chan->mode) {
Oliver Neukum 322fe2
+		case L2CAP_MODE_BASIC:
Oliver Neukum 322fe2
+		case L2CAP_MODE_ERTM:
Oliver Neukum 322fe2
+		case L2CAP_MODE_STREAMING:
Oliver Neukum 322fe2
+			break;
Oliver Neukum 322fe2
+		default:
Oliver Neukum 322fe2
+			err = -EINVAL;
Oliver Neukum 322fe2
+			break;
Oliver Neukum 322fe2
+		}
Oliver Neukum 322fe2
+
Oliver Neukum 322fe2
+		if (err < 0)
Oliver Neukum 322fe2
+			break;
Oliver Neukum 322fe2
+
Oliver Neukum 322fe2
 		memset(&opts, 0, sizeof(opts));
Oliver Neukum 322fe2
 		opts.imtu     = chan->imtu;
Oliver Neukum 322fe2
 		opts.omtu     = chan->omtu;
Oliver Neukum 322fe2
@@ -677,10 +691,8 @@ static int l2cap_sock_setsockopt_old(str
Oliver Neukum 322fe2
 			break;
Oliver Neukum 322fe2
 		}
Oliver Neukum 322fe2
 
Oliver Neukum 322fe2
-		chan->mode = opts.mode;
Oliver Neukum 322fe2
-		switch (chan->mode) {
Oliver Neukum 322fe2
-		case L2CAP_MODE_LE_FLOWCTL:
Oliver Neukum 322fe2
-			break;
Oliver Neukum 322fe2
+		/* Only BR/EDR modes are supported here */
Oliver Neukum 322fe2
+		switch (opts.mode) {
Oliver Neukum 322fe2
 		case L2CAP_MODE_BASIC:
Oliver Neukum 322fe2
 			clear_bit(CONF_STATE2_DEVICE, &chan->conf_state);
Oliver Neukum 322fe2
 			break;
Oliver Neukum 322fe2
@@ -694,6 +706,11 @@ static int l2cap_sock_setsockopt_old(str
Oliver Neukum 322fe2
 			break;
Oliver Neukum 322fe2
 		}
Oliver Neukum 322fe2
 
Oliver Neukum 322fe2
+		if (err < 0)
Oliver Neukum 322fe2
+			break;
Oliver Neukum 322fe2
+
Oliver Neukum 322fe2
+		chan->mode = opts.mode;
Oliver Neukum 322fe2
+
Oliver Neukum 322fe2
 		chan->imtu = opts.imtu;
Oliver Neukum 322fe2
 		chan->omtu = opts.omtu;
Oliver Neukum 322fe2
 		chan->fcs  = opts.fcs;