From 3fcccaad6f214852cb9b9e6243190acb50f8de5d Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Wed, 3 Jan 2018 10:24:53 +0100 Subject: [PATCH 1/5] Fix intermittent crashes with buffer reads It seems there are some cases that the `from` value for Arrays#copyOfRange is `-1` or less. This causes it to throw `IllegalArgumentException`. To naively solve this issue, make sure the `to` argument is `0` or more. --- usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java index 1e7bb2b..4434964 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java @@ -148,7 +148,8 @@ public class SerialBuffer e.printStackTrace(); } } - byte[] dst = Arrays.copyOfRange(buffer, 0, position); + int to = position <= -1 ? 0 : position; + byte[] dst = Arrays.copyOfRange(buffer, 0, to); if(debugging) UsbSerialDebugger.printLogGet(dst, true); position = -1; From 0a4d47f409e7e64bc0b6f57150357da818a275dd Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Thu, 4 Jan 2018 01:58:53 +0100 Subject: [PATCH 2/5] Return empty buffer when there's no read --- .../src/main/java/com/felhr/usbserial/SerialBuffer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java index 4434964..9fcb5a5 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java @@ -148,8 +148,10 @@ public class SerialBuffer e.printStackTrace(); } } - int to = position <= -1 ? 0 : position; - byte[] dst = Arrays.copyOfRange(buffer, 0, to); + if(position <= -1 ) { + return new byte[DEFAULT_READ_BUFFER_SIZE]; + } + byte[] dst = Arrays.copyOfRange(buffer, 0, position); if(debugging) UsbSerialDebugger.printLogGet(dst, true); position = -1; From 42e8e772e06b46bb79bb91b5fa33c44cfccb72f1 Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Thu, 4 Jan 2018 03:14:02 +0100 Subject: [PATCH 3/5] Return when put byte array is empty or null --- usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java index 9fcb5a5..0ebb545 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java @@ -118,6 +118,7 @@ public class SerialBuffer public synchronized void put(byte[] src) { + if(src == null || src.length == 0) return; if(position == -1) position = 0; if(debugging) From 09a3f869ec2e7fd99ef1d2138f4272d495d21a59 Mon Sep 17 00:00:00 2001 From: Henry Addo Date: Thu, 4 Jan 2018 03:14:34 +0100 Subject: [PATCH 4/5] Minor code reformatting --- usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java index 0ebb545..ea030ee 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java @@ -149,9 +149,7 @@ public class SerialBuffer e.printStackTrace(); } } - if(position <= -1 ) { - return new byte[DEFAULT_READ_BUFFER_SIZE]; - } + if(position <= -1 ) return new byte[DEFAULT_READ_BUFFER_SIZE]; byte[] dst = Arrays.copyOfRange(buffer, 0, position); if(debugging) UsbSerialDebugger.printLogGet(dst, true); From e9d27bbba0df01dde4607e2706efd21f495fc1b7 Mon Sep 17 00:00:00 2001 From: Felipe Herranz Date: Thu, 4 Jan 2018 13:10:05 +0100 Subject: [PATCH 5/5] returning a 0 length array when position -1 --- build.gradle | 2 +- usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java | 2 +- .../src/main/java/com/felhr/usbserial/UsbSerialDevice.java | 3 ++- usbserial/src/main/java/com/felhr/usbserial/UsbSpiDevice.java | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 7a8e3ab..3d5ba79 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.3' } } diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java index ea030ee..a59f53e 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialBuffer.java @@ -149,7 +149,7 @@ public class SerialBuffer e.printStackTrace(); } } - if(position <= -1 ) return new byte[DEFAULT_READ_BUFFER_SIZE]; + if(position <= -1 ) return new byte[0]; byte[] dst = Arrays.copyOfRange(buffer, 0, position); if(debugging) UsbSerialDebugger.printLogGet(dst, true); diff --git a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java index 1b37a88..95b7594 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java +++ b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java @@ -304,7 +304,8 @@ public abstract class UsbSerialDevice implements UsbSerialInterface while(working.get()) { byte[] data = serialBuffer.getWriteBuffer(); - connection.bulkTransfer(outEndpoint, data, data.length, USB_TIMEOUT); + if(data.length > 0) + connection.bulkTransfer(outEndpoint, data, data.length, USB_TIMEOUT); } } diff --git a/usbserial/src/main/java/com/felhr/usbserial/UsbSpiDevice.java b/usbserial/src/main/java/com/felhr/usbserial/UsbSpiDevice.java index c9c8425..b831aa8 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/UsbSpiDevice.java +++ b/usbserial/src/main/java/com/felhr/usbserial/UsbSpiDevice.java @@ -99,7 +99,8 @@ public abstract class UsbSpiDevice implements UsbSpiInterface while(working.get()) { byte[] data = serialBuffer.getWriteBuffer(); - connection.bulkTransfer(outEndpoint, data, data.length, USB_TIMEOUT); + if(data.length > 0) + connection.bulkTransfer(outEndpoint, data, data.length, USB_TIMEOUT); } }