From 3958c5c08979a31c4c77d3bcd8ba3dbd25f94954 Mon Sep 17 00:00:00 2001 From: angelos3lex Date: Thu, 20 Mar 2025 16:28:03 +0200 Subject: [PATCH] guard to avoid Service.getDeviceID()' on a null object reference (#1142) and cleanServicesAndCharacteristicsForDevice outOfBounds (#1144) crashes --- .../java/com/bleplx/adapter/BleModule.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/android/src/main/java/com/bleplx/adapter/BleModule.java b/android/src/main/java/com/bleplx/adapter/BleModule.java index 837075fd8..6ea97ab1a 100755 --- a/android/src/main/java/com/bleplx/adapter/BleModule.java +++ b/android/src/main/java/com/bleplx/adapter/BleModule.java @@ -1563,27 +1563,33 @@ private Characteristic getCharacteristicOrEmitError(final int characteristicIden private void cleanServicesAndCharacteristicsForDevice(@NonNull Device device) { for (int i = discoveredServices.size() - 1; i >= 0; i--) { - int key = discoveredServices.keyAt(i); - Service service = discoveredServices.get(key); + if (i < discoveredServices.size()) { // guards concurrent changes in discoveredServices while iterating to avoid #1144 + int key = discoveredServices.keyAt(i); + Service service = discoveredServices.get(key); - if (service.getDeviceID().equals(device.getId())) { - discoveredServices.remove(key); + if (service == null || service.getDeviceID().equals(device.getId())) { + discoveredServices.remove(key); + } } } for (int i = discoveredCharacteristics.size() - 1; i >= 0; i--) { - int key = discoveredCharacteristics.keyAt(i); - Characteristic characteristic = discoveredCharacteristics.get(key); + if (i < discoveredCharacteristics.size()) { + int key = discoveredCharacteristics.keyAt(i); + Characteristic characteristic = discoveredCharacteristics.get(key); - if (characteristic.getDeviceId().equals(device.getId())) { - discoveredCharacteristics.remove(key); + if (characteristic == null || characteristic.getDeviceId().equals(device.getId())) { + discoveredCharacteristics.remove(key); + } } } for (int i = discoveredDescriptors.size() - 1; i >= 0; i--) { - int key = discoveredDescriptors.keyAt(i); - Descriptor descriptor = discoveredDescriptors.get(key); - if (descriptor.getDeviceId().equals(device.getId())) { - discoveredDescriptors.remove(key); + if (i < discoveredDescriptors.size()) { + int key = discoveredDescriptors.keyAt(i); + Descriptor descriptor = discoveredDescriptors.get(key); + if (descriptor == null || descriptor.getDeviceId().equals(device.getId())) { + discoveredDescriptors.remove(key); + } } } }