2021-06-04 21:36:17

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ] shared/mgmt: Fix not processing request queue

From: Luiz Augusto von Dentz <[email protected]>

If the kernel return an invalid opcode like bellow the request won't be
processed leading making it unusable:

@ MGMT Command: Read Advertising Features (0x003d) plen 0
{0x0001} [hci0] 14:25:11.096370
@ MGMT Event: Command Status (0x0002) plen 3
{0x0001} [hci0] 14:25:11.096373
Set Advertising (0x0029)
Status: Not Supported (0x0c)

In order to fix this attempts to remove the first request pending on the
given index:

= bluetoothd: src/advertising.c:read_adv_features_callback() Failed to
read advertising features: Not Supported (0x0c)
---
src/shared/mgmt.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/shared/mgmt.c b/src/shared/mgmt.c
index 3e9b9ee26..767a711d6 100644
--- a/src/shared/mgmt.c
+++ b/src/shared/mgmt.c
@@ -235,8 +235,10 @@ static bool match_request_opcode_index(const void *a, const void *b)
const struct mgmt_request *request = a;
const struct opcode_index *match = b;

- return request->opcode == match->opcode &&
- request->index == match->index;
+ if (match->opcode && request->opcode != match->opcode)
+ return false;
+
+ return request->index == match->index;
}

static void request_complete(struct mgmt *mgmt, uint8_t status,
@@ -248,6 +250,18 @@ static void request_complete(struct mgmt *mgmt, uint8_t status,

request = queue_remove_if(mgmt->pending_list,
match_request_opcode_index, &match);
+ if (!request) {
+ util_debug(mgmt->debug_callback, mgmt->debug_data,
+ "Unable to find request for opcode 0x%02x",
+ opcode);
+
+ /* Attempt to remove with no opcode */
+ match.opcode = 0x0000;
+ request = queue_remove_if(mgmt->pending_list,
+ match_request_opcode_index,
+ &match);
+ }
+
if (request) {
if (request->callback)
request->callback(status, length, param,
--
2.31.1


2021-06-04 22:34:09

by bluez.test.bot

[permalink] [raw]
Subject: RE: [BlueZ] shared/mgmt: Fix not processing request queue

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=494413

---Test result---

Test Summary:
CheckPatch PASS 0.37 seconds
GitLint PASS 0.11 seconds
Prep - Setup ELL PASS 41.28 seconds
Build - Prep PASS 0.10 seconds
Build - Configure PASS 7.16 seconds
Build - Make PASS 177.22 seconds
Make Check PASS 9.35 seconds
Make Distcheck PASS 210.08 seconds
Build w/ext ELL - Configure PASS 7.25 seconds
Build w/ext ELL - Make PASS 166.83 seconds

Details
##############################
Test: CheckPatch - PASS
Desc: Run checkpatch.pl script with rule in .checkpatch.conf

##############################
Test: GitLint - PASS
Desc: Run gitlint with rule in .gitlint

##############################
Test: Prep - Setup ELL - PASS
Desc: Clone, build, and install ELL

##############################
Test: Build - Prep - PASS
Desc: Prepare environment for build

##############################
Test: Build - Configure - PASS
Desc: Configure the BlueZ source tree

##############################
Test: Build - Make - PASS
Desc: Build the BlueZ source tree

##############################
Test: Make Check - PASS
Desc: Run 'make check'

##############################
Test: Make Distcheck - PASS
Desc: Run distcheck to check the distribution

##############################
Test: Build w/ext ELL - Configure - PASS
Desc: Configure BlueZ source with '--enable-external-ell' configuration

##############################
Test: Build w/ext ELL - Make - PASS
Desc: Build BlueZ source with '--enable-external-ell' configuration



---
Regards,
Linux Bluetooth