diff mbox series

[v1] Bluetooth: L2CAP: Fix missing options not using most recent value

Message ID 20250317174143.530997-1-luiz.dentz@gmail.com
State New
Headers show
Series [v1] Bluetooth: L2CAP: Fix missing options not using most recent value | expand

Commit Message

Luiz Augusto von Dentz March 17, 2025, 5:41 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

According to the core specification the most recent value, not its
default, must be used in case it is missing on L2CAP_CONFIGURATION_REQ:

 'Any missing configuration parameters are assumed to have their most
 recently explicitly or implicitly accepted values.'

Fixes: c1360a1cf351 ("Bluetooth: use bit operation on conf_state")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
 net/bluetooth/l2cap_core.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
diff mbox series

Patch

diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 7b4adab353cf..7719f263f5c4 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -3385,6 +3385,20 @@  static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data, size_t data
 
 	BT_DBG("chan %p", chan);
 
+	/* 4.4. L2CAP_CONFIGURATION_REQ (code 0x04):
+	 * ...
+	 * Any missing configuration parameters are assumed to have their most
+	 * recently explicitly or implicitly accepted values.
+	 */
+
+	/* If MTU has been previously set, use it instead of default. */
+	if (test_bit(CONF_MTU_DONE, &chan->conf_state))
+		mtu = chan->omtu;
+
+	/* If Mode has been previously set, use it instead of default. */
+	if (test_bit(CONF_MODE_DONE, &chan->conf_state))
+		rfc.mode = chan->mode;
+
 	while (len >= L2CAP_CONF_OPT_SIZE) {
 		len -= l2cap_get_conf_opt(&req, &type, &olen, &val);
 		if (len < 0)