From 8c187731417b520eeffcac918da97f5cf0ba9647 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Sun, 16 Mar 2014 18:13:31 +0000
Subject: [PATCH] Write the tag immediately even if there are no packets to
 send. Bug #27.

---
 .../messaging/duplex/DuplexConnection.java         |  2 ++
 .../transport/OutgoingEncryptionLayer.java         | 14 +++++++++++---
 .../simplex/OutgoingSimplexConnectionTest.java     |  4 ++--
 .../transport/OutgoingEncryptionLayerTest.java     |  4 ++--
 4 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
index 06d4758045..56ec0aa93d 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
@@ -223,6 +223,8 @@ abstract class DuplexConnection implements EventListener {
 			OutputStream out = createConnectionWriter().getOutputStream();
 			writer = packetWriterFactory.createPacketWriter(out, true);
 			LOG.info("Starting to write");
+			// Ensure the tag is sent
+			out.flush();
 			// Send the initial packets
 			dbExecutor.execute(new GenerateTransportAcks());
 			dbExecutor.execute(new GenerateTransportUpdates());
diff --git a/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java b/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
index 0a4552f38a..a2c0036772 100644
--- a/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
+++ b/briar-core/src/org/briarproject/transport/OutgoingEncryptionLayer.java
@@ -63,9 +63,6 @@ class OutgoingEncryptionLayer implements FrameWriter {
 	public void writeFrame(byte[] frame, int payloadLength, boolean finalFrame)
 			throws IOException {
 		if(frameNumber > MAX_32_BIT_UNSIGNED) throw new IllegalStateException();
-		// If the initiator's side of the connection is closed without writing
-		// any data, don't write anything to the underlying transport
-		if(writeTag && finalFrame && payloadLength == 0) return;
 		// Write the tag if required
 		if(writeTag) {
 			try {
@@ -115,6 +112,17 @@ class OutgoingEncryptionLayer implements FrameWriter {
 	}
 
 	public void flush() throws IOException {
+		// Write the tag if required
+		if(writeTag) {
+			try {
+				out.write(tag, 0, tag.length);
+			} catch(IOException e) {
+				frameKey.erase();
+				throw e;
+			}
+			capacity -= tag.length;
+			writeTag = false;
+		}
 		out.flush();
 	}
 
diff --git a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
index df8087ab74..34184b59db 100644
--- a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
+++ b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
@@ -140,8 +140,8 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 			will(returnValue(null));
 		}});
 		connection.write();
-		// Nothing should have been written
-		assertEquals(0, out.size());
+		// Only the tag and an empty final frame should have been written
+		assertEquals(TAG_LENGTH + HEADER_LENGTH + MAC_LENGTH, out.size());
 		// The transport should have been disposed with exception == false
 		assertTrue(transport.getDisposed());
 		assertFalse(transport.getException());
diff --git a/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java b/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
index 3a3598f3fa..d3a7746a1f 100644
--- a/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
+++ b/briar-tests/src/org/briarproject/transport/OutgoingEncryptionLayerTest.java
@@ -75,8 +75,8 @@ public class OutgoingEncryptionLayerTest extends BriarTestCase {
 				FRAME_LENGTH, tag);
 		// Write an empty final frame without having written any other frames
 		o.writeFrame(new byte[FRAME_LENGTH - MAC_LENGTH], 0, true);
-		// Nothing should be written to the output stream
-		assertEquals(0, out.size());
+		// The tag and the empty frame should be written to the output stream
+		assertEquals(TAG_LENGTH + HEADER_LENGTH + MAC_LENGTH, out.size());
 	}
 
 	@Test
-- 
GitLab