From 27422ab9f9c09f2475a743dd19a1a5c151efd200 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Mon, 18 Sep 2017 15:47:12 +0100 Subject: [PATCH] Catch NPE when getting socket input/output streams. Works around a bug in Android 7, fixed in 7.1. --- .../plugin/tor/TorTransportConnection.java | 5 +++-- .../briarproject/bramble/util/IoUtils.java | 21 +++++++++++++++++++ .../plugin/tcp/TcpTransportConnection.java | 5 +++-- .../bramble/reporting/DevReportServer.java | 3 ++- .../bramble/reporting/DevReporterImpl.java | 2 +- .../bramble/socks/SocksSocket.java | 4 ++-- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorTransportConnection.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorTransportConnection.java index 1763784104..e6a1c5f262 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorTransportConnection.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/TorTransportConnection.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.plugin.tor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.duplex.AbstractDuplexTransportConnection; +import org.briarproject.bramble.util.IoUtils; import java.io.IOException; import java.io.InputStream; @@ -21,12 +22,12 @@ class TorTransportConnection extends AbstractDuplexTransportConnection { @Override protected InputStream getInputStream() throws IOException { - return socket.getInputStream(); + return IoUtils.getInputStream(socket); } @Override protected OutputStream getOutputStream() throws IOException { - return socket.getOutputStream(); + return IoUtils.getOutputStream(socket); } @Override diff --git a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java index eb682e1679..13b05d84ca 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/util/IoUtils.java @@ -8,6 +8,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.Socket; import javax.annotation.Nullable; @@ -59,4 +60,24 @@ public class IoUtils { offset += read; } } + + // Workaround for a bug in Android 7, see + // https://android-review.googlesource.com/#/c/271775/ + public static InputStream getInputStream(Socket s) throws IOException { + try { + return s.getInputStream(); + } catch (NullPointerException e) { + throw new IOException(e); + } + } + + // Workaround for a bug in Android 7, see + // https://android-review.googlesource.com/#/c/271775/ + public static OutputStream getOutputStream(Socket s) throws IOException { + try { + return s.getOutputStream(); + } catch (NullPointerException e) { + throw new IOException(e); + } + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpTransportConnection.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpTransportConnection.java index 97afa37434..34c7d7a746 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpTransportConnection.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/tcp/TcpTransportConnection.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.plugin.tcp; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.plugin.Plugin; import org.briarproject.bramble.api.plugin.duplex.AbstractDuplexTransportConnection; +import org.briarproject.bramble.util.IoUtils; import java.io.IOException; import java.io.InputStream; @@ -24,12 +25,12 @@ class TcpTransportConnection extends AbstractDuplexTransportConnection { @Override protected InputStream getInputStream() throws IOException { - return socket.getInputStream(); + return IoUtils.getInputStream(socket); } @Override protected OutputStream getOutputStream() throws IOException { - return socket.getOutputStream(); + return IoUtils.getOutputStream(socket); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReportServer.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReportServer.java index 5490c7ee09..127bbcc8f3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReportServer.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReportServer.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.reporting; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.util.IoUtils; import java.io.Closeable; import java.io.File; @@ -130,7 +131,7 @@ public class DevReportServer { OutputStream out = null; try { socket.setSoTimeout(SOCKET_TIMEOUT_MS); - in = socket.getInputStream(); + in = IoUtils.getInputStream(socket); reportDir.mkdirs(); reportFile = File.createTempFile(FILE_PREFIX, FILE_SUFFIX, reportDir); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java index 919b6f240c..c4e2bad64c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/reporting/DevReporterImpl.java @@ -93,7 +93,7 @@ class DevReporterImpl implements DevReporter { InputStream in = null; try { Socket s = connectToDevelopers(); - out = s.getOutputStream(); + out = IoUtils.getOutputStream(s); in = new FileInputStream(f); IoUtils.copyAndClose(in, out); f.delete(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksSocket.java b/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksSocket.java index 7f5cb0090d..a254026eff 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksSocket.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/socks/SocksSocket.java @@ -57,8 +57,8 @@ class SocksSocket extends Socket { // Connect to the proxy super.connect(proxy, connectToProxyTimeout); - OutputStream out = getOutputStream(); - InputStream in = getInputStream(); + OutputStream out = IoUtils.getOutputStream(this); + InputStream in = IoUtils.getInputStream(this); // Request SOCKS 5 with no authentication sendMethodRequest(out); -- GitLab