From 3958c5c08979a31c4c77d3bcd8ba3dbd25f94954 Mon Sep 17 00:00:00 2001 From: angelos3lex Date: Thu, 20 Mar 2025 16:28:03 +0200 Subject: [PATCH 1/3] 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); + } } } } From 9503fb7af93f8be5fc4523460605c9c98f84abcd Mon Sep 17 00:00:00 2001 From: angelos3lex Date: Fri, 28 Mar 2025 13:54:36 +0200 Subject: [PATCH 2/3] remove ".remove" from cleanServicesAndCharacteristicsForDevice for loops --- .../java/com/bleplx/adapter/BleModule.java | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/android/src/main/java/com/bleplx/adapter/BleModule.java b/android/src/main/java/com/bleplx/adapter/BleModule.java index 6ea97ab1a..5f1ba947c 100755 --- a/android/src/main/java/com/bleplx/adapter/BleModule.java +++ b/android/src/main/java/com/bleplx/adapter/BleModule.java @@ -1562,34 +1562,45 @@ private Characteristic getCharacteristicOrEmitError(final int characteristicIden } private void cleanServicesAndCharacteristicsForDevice(@NonNull Device device) { - for (int i = discoveredServices.size() - 1; i >= 0; i--) { - 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 == null || service.getDeviceID().equals(device.getId())) { - discoveredServices.remove(key); - } + List discoveredServicesKeysToRemove = new ArrayList<>(); + for (int i = 0; i < discoveredServices.size(); i++) { + int key = discoveredServices.keyAt(i); + Service service = discoveredServices.get(key); + if (service == null || service.getDeviceID().equals(device.getId())) { + discoveredServicesKeysToRemove.add(key); } } - for (int i = discoveredCharacteristics.size() - 1; i >= 0; i--) { - if (i < discoveredCharacteristics.size()) { - int key = discoveredCharacteristics.keyAt(i); - Characteristic characteristic = discoveredCharacteristics.get(key); - - if (characteristic == null || characteristic.getDeviceId().equals(device.getId())) { - discoveredCharacteristics.remove(key); - } + for (int key : discoveredServicesKeysToRemove) { + if (discoveredServices.contains(key)) { + discoveredServices.remove(key); + } + } + + List discoveredCharacteristicsKeysToRemove = new ArrayList<>(); + for (int i = 0; i < discoveredCharacteristics.size(); i++) { + int key = discoveredCharacteristics.keyAt(i); + Characteristic characteristic = discoveredCharacteristics.get(key); + if (characteristic == null || characteristic.getDeviceId().equals(device.getId())) { + discoveredCharacteristicsKeysToRemove.add(key); + } + } + for (int key : discoveredCharacteristicsKeysToRemove) { + if (discoveredCharacteristics.contains(key)) { + discoveredCharacteristics.remove(key); } } - for (int i = discoveredDescriptors.size() - 1; i >= 0; i--) { - 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); - } + List discoveredDescriptorsKeysToRemove = new ArrayList<>(); + for (int i = 0; i < discoveredDescriptors.size(); i++) { + int key = discoveredDescriptors.keyAt(i); + Descriptor descriptor = discoveredDescriptors.get(key); + if (descriptor == null || descriptor.getDeviceId().equals(device.getId())) { + discoveredDescriptorsKeysToRemove.add(key); + } + } + for (int key : discoveredDescriptorsKeysToRemove) { + if (discoveredDescriptors.contains(key)) { + discoveredDescriptors.remove(key); } } } From 2551cfcf6fb0c9cab170ee4b8013673f0485958c Mon Sep 17 00:00:00 2001 From: angelos3lex Date: Thu, 3 Apr 2025 11:01:11 +0300 Subject: [PATCH 3/3] make it compliant for api 30 and below --- android/src/main/java/com/bleplx/adapter/BleModule.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/bleplx/adapter/BleModule.java b/android/src/main/java/com/bleplx/adapter/BleModule.java index 5f1ba947c..44392b65d 100755 --- a/android/src/main/java/com/bleplx/adapter/BleModule.java +++ b/android/src/main/java/com/bleplx/adapter/BleModule.java @@ -1571,7 +1571,7 @@ private void cleanServicesAndCharacteristicsForDevice(@NonNull Device device) { } } for (int key : discoveredServicesKeysToRemove) { - if (discoveredServices.contains(key)) { + if (discoveredServices.indexOfKey(key) >= 0) { discoveredServices.remove(key); } } @@ -1585,7 +1585,7 @@ private void cleanServicesAndCharacteristicsForDevice(@NonNull Device device) { } } for (int key : discoveredCharacteristicsKeysToRemove) { - if (discoveredCharacteristics.contains(key)) { + if (discoveredCharacteristics.indexOfKey(key) >= 0) { discoveredCharacteristics.remove(key); } } @@ -1599,7 +1599,7 @@ private void cleanServicesAndCharacteristicsForDevice(@NonNull Device device) { } } for (int key : discoveredDescriptorsKeysToRemove) { - if (discoveredDescriptors.contains(key)) { + if (discoveredDescriptors.indexOfKey(key) >= 0) { discoveredDescriptors.remove(key); } }