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 1763784104b5c8b3f72679e00d23c63ec65d6b1b..e6a1c5f262dedbc7ad9f0290552b5bf3d594f11e 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 eb682e16798d00ca02e21b4a2ec6fac106025311..13b05d84ca7774d3a1173c34fba7d72bb2215ab1 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 97afa37434acf4db2c3f00592d76ef163851325c..34c7d7a74670a463fb1201c9bf26d1a61f0fcd39 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 5490c7ee099b192e413950d7d30092e21a0efa9d..127bbcc8f3f0186c3533a4737de309071fc70ac2 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 919b6f240c54c8e1da69b2cc7dfaf6c1d9d730ad..c4e2bad64c76adcd5eacedfd7e42324c2f144f51 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 7f5cb0090db1fa56102c24a9ce7c5328fe27e896..a254026eff3c1b7e0a762de62d500a56c19b6d2c 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);