From be3b17b7f768eea3604deee08888917ef4b80be8 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Sun, 11 Oct 2026 21:18:31 -0400 Subject: [PATCH] _bleio: make Connection.disconnect() safe after the peer disconnects When the peer disconnects, the Connection object's connection pointer is set to NULL. disconnect() still passed it to common_hal_bleio_connection_disconnect(), relying on each port to do nothing when already disconnected. espressif reads conn_handle from it without checking, so the next disconnect() hard-faulted. nordic, silabs and ble_hci don't check either. Call common-hal only when the connection is still connected. Co-Authored-By: Claude Opus 5.5 --- shared-bindings/_bleio/Connection.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/shared-bindings/_bleio/Connection.c b/shared-bindings/_bleio/Connection.c index 275fa0d435d..743b3d6dacc 100644 --- a/shared-bindings/_bleio/Connection.c +++ b/shared-bindings/_bleio/Connection.c @@ -59,8 +59,10 @@ void bleio_connection_ensure_connected(bleio_connection_obj_t *self) { //| static mp_obj_t bleio_connection_disconnect(mp_obj_t self_in) { bleio_connection_obj_t *self = MP_OBJ_TO_PTR(self_in); - // common_hal_bleio_connection_disconnect() does nothing if already disconnected. - common_hal_bleio_connection_disconnect(self->connection); + // Do nothing if already disconnected. self->connection is NULL after the peer disconnects. + if (common_hal_bleio_connection_get_connected(self)) { + common_hal_bleio_connection_disconnect(self->connection); + } return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_1(bleio_connection_disconnect_obj, bleio_connection_disconnect);