From fc59a9220394e5f024cf11cd48d1c54ec24bb4d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=B0=8F=E5=87=A4?= Date: Fri, 12 Jun 2020 17:08:59 +0800 Subject: [PATCH] fix NegativeArraySizeException crash in SecureDfuImpl.java more detail: https://github.com/NordicSemiconductor/Android-DFU-Library/issues/229 --- .../java/no/nordicsemi/android/dfu/DfuBaseService.java | 7 +++++++ .../main/java/no/nordicsemi/android/dfu/SecureDfuImpl.java | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/dfu/src/main/java/no/nordicsemi/android/dfu/DfuBaseService.java b/dfu/src/main/java/no/nordicsemi/android/dfu/DfuBaseService.java index 0ab16ab..e6ef294 100644 --- a/dfu/src/main/java/no/nordicsemi/android/dfu/DfuBaseService.java +++ b/dfu/src/main/java/no/nordicsemi/android/dfu/DfuBaseService.java @@ -627,6 +627,13 @@ public abstract class DfuBaseService extends IntentService implements DfuProgres * Thrown when device had to be paired before the DFU process was started. */ public static final int ERROR_DEVICE_NOT_BONDED = ERROR_MASK | 0x0E; + /** + * Thrown when breakpoint resume fw + *

+ * Check https://github.com/NordicSemiconductor/Android-DFU-Library/issues/229 + *

+ */ + public static final int ERROR_BREAKPOINT_RESUME = ERROR_MASK | 0x0F; /** * Flag set when the DFU target returned a DFU error. Look for DFU specification to get error * codes. The error code is binary OR-ed with one of: {@link #ERROR_REMOTE_TYPE_LEGACY}, diff --git a/dfu/src/main/java/no/nordicsemi/android/dfu/SecureDfuImpl.java b/dfu/src/main/java/no/nordicsemi/android/dfu/SecureDfuImpl.java index c7ef467..d1002e4 100644 --- a/dfu/src/main/java/no/nordicsemi/android/dfu/SecureDfuImpl.java +++ b/dfu/src/main/java/no/nordicsemi/android/dfu/SecureDfuImpl.java @@ -653,6 +653,12 @@ class SecureDfuImpl extends BaseCustomDfuImpl { loge("Error while reading firmware stream", e); mService.terminateConnection(gatt, DfuBaseService.ERROR_FILE_IO_EXCEPTION); return; + } catch (final Throwable tr) { + // crash fix + // Check https://github.com/NordicSemiconductor/Android-DFU-Library/issues/229 + loge("Error while reading firmware stream", tr); + mService.terminateConnection(gatt, DfuBaseService.ERROR_BREAKPOINT_RESUME); + return; } // To decrease the chance of loosing data next time let's set PRN to 1. // This will make the update very long, but perhaps it will succeed.