From cdd234dfe3c351de7d8caa5062b307bac850041c Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Fri, 2 Dec 2016 12:25:28 +0000
Subject: [PATCH] Ensure key agreement tasks finish if they ignore interrupts.

---
 .../plugin/droidtooth/DroidtoothPlugin.java     |  9 ++++++---
 .../keyagreement/KeyAgreementConnector.java     | 17 +++++++++--------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/bramble-android/src/main/java/org/briarproject/bramble/plugin/droidtooth/DroidtoothPlugin.java b/bramble-android/src/main/java/org/briarproject/bramble/plugin/droidtooth/DroidtoothPlugin.java
index ccd0fdf41f..20ca21d11a 100644
--- a/bramble-android/src/main/java/org/briarproject/bramble/plugin/droidtooth/DroidtoothPlugin.java
+++ b/bramble-android/src/main/java/org/briarproject/bramble/plugin/droidtooth/DroidtoothPlugin.java
@@ -341,8 +341,10 @@ class DroidtoothPlugin implements DuplexPlugin {
 				LOG.info("Connected to " + scrubMacAddress(address));
 			return s;
 		} catch (IOException e) {
-			if (LOG.isLoggable(INFO))
-				LOG.info("Failed to connect to " + scrubMacAddress(address));
+			if (LOG.isLoggable(INFO)) {
+				LOG.info("Failed to connect to " + scrubMacAddress(address)
+						+ ": " + e);
+			}
 			tryToClose(s);
 			return null;
 		}
@@ -588,9 +590,10 @@ class DroidtoothPlugin implements DuplexPlugin {
 				finished.countDown();
 			} else if (action.equals(FOUND)) {
 				BluetoothDevice d = intent.getParcelableExtra(EXTRA_DEVICE);
-				if (LOG.isLoggable(INFO))
+				if (LOG.isLoggable(INFO)) {
 					LOG.info("Discovered device: " +
 							scrubMacAddress(d.getAddress()));
+				}
 				addresses.add(d.getAddress());
 			}
 		}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/KeyAgreementConnector.java b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/KeyAgreementConnector.java
index ad3015bb4d..df6d28fa49 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/KeyAgreementConnector.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/KeyAgreementConnector.java
@@ -148,9 +148,9 @@ class KeyAgreementConnector {
 	private void closePending(@Nullable KeyAgreementConnection chosen) {
 		for (Future<KeyAgreementConnection> f : pending) {
 			try {
-				if (f.cancel(true))
+				if (f.cancel(true)) {
 					LOG.info("Cancelled task");
-				else if (!f.isCancelled()) {
+				} else if (!f.isCancelled()) {
 					KeyAgreementConnection c = f.get();
 					if (c != null && c != chosen)
 						tryToClose(c.getConnection(), false);
@@ -193,9 +193,10 @@ class KeyAgreementConnector {
 
 		@Override
 		public KeyAgreementConnection call() throws Exception {
-			// Repeat attempts until we connect or get interrupted
+			// Repeat attempts until we connect, get interrupted, or time out
 			while (true) {
 				long now = clock.currentTimeMillis();
+				if (now > end) throw new IOException();
 				DuplexTransportConnection conn =
 						plugin.createKeyAgreementConnection(commitment,
 								descriptor, end - now);
@@ -221,8 +222,7 @@ class KeyAgreementConnector {
 		}
 
 		@Override
-		public KeyAgreementConnection call()
-				throws Exception {
+		public KeyAgreementConnection call() throws Exception {
 			KeyAgreementConnection c = connectionTask.call();
 			InputStream in = c.getConnection().getReader().getInputStream();
 			boolean waitingSent = false;
@@ -232,13 +232,14 @@ class KeyAgreementConnector {
 					callbacks.connectionWaiting();
 					waitingSent = true;
 				}
-				if (LOG.isLoggable(INFO))
-					LOG.info(c.getTransportId().toString() +
+				if (LOG.isLoggable(INFO)) {
+					LOG.info(c.getTransportId().getString() +
 							": Waiting for connection");
+				}
 				Thread.sleep(1000);
 			}
 			if (!alice && LOG.isLoggable(INFO))
-				LOG.info(c.getTransportId().toString() + ": Data available");
+				LOG.info(c.getTransportId().getString() + ": Data available");
 			return c;
 		}
 	}
-- 
GitLab