summaryrefslogtreecommitdiff
path: root/mesh
diff options
context:
space:
mode:
authorBrian Gix <brian.gix@gmail.com>2023-03-15 13:56:37 -0700
committerBrian Gix <brian.gix@gmail.com>2023-03-15 18:12:38 -0700
commit806230e4fda7a2fafeb7f1da3d2f17a1bafb25f8 (patch)
treea19b169c1c99a77c4b5a56c78652b4421149a08d /mesh
parentc1f7aed635f39578cdb4a1870413278d29a081c5 (diff)
downloadbluez-806230e4fda7a2fafeb7f1da3d2f17a1bafb25f8.tar.gz
mesh: Don't send Prov Failed on non-existant links
If remote device does not respond to a Prov Link Open request, then the callbacks do not get established, and attempting to send Failure messages on the non-existent link rersult in seg fault.
Diffstat (limited to 'mesh')
-rw-r--r--mesh/remprv-server.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/mesh/remprv-server.c b/mesh/remprv-server.c
index 6a9efdd47..927dbab0e 100644
--- a/mesh/remprv-server.c
+++ b/mesh/remprv-server.c
@@ -546,7 +546,7 @@ static bool remprv_srv_pkt(uint16_t src, uint16_t unicast, uint16_t app_idx,
bool segmented = false;
uint32_t opcode;
uint8_t msg[69];
- uint8_t status;
+ uint8_t old_state, status;
uint16_t n;
if (app_idx != APP_IDX_DEV_LOCAL)
@@ -843,10 +843,12 @@ static bool remprv_srv_pkt(uint16_t src, uint16_t unicast, uint16_t app_idx,
if (!prov || prov->node != node || prov->client != src)
return true;
+ old_state = prov->state;
prov->state = PB_REMOTE_STATE_LINK_CLOSING;
mesh_io_send_cancel(NULL, &pkt_filter, sizeof(pkt_filter));
send_prov_status(prov, PB_REM_ERR_SUCCESS);
- if (pkt[0] == 0x02) {
+ if (pkt[0] == 0x02 &&
+ old_state >= PB_REMOTE_STATE_LINK_ACTIVE) {
msg[0] = PROV_FAILED;
msg[1] = PROV_ERR_CANT_ASSIGN_ADDR;
if (prov->nppi_proc == RPR_ADV)