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