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