Write the tag immediately even if there are no packets to send. Bug #27.

This commit is contained in:
akwizgran
2014-03-16 18:13:31 +00:00
parent 5755aed362
commit 8c18773141
4 changed files with 17 additions and 7 deletions

View File

@@ -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());

View File

@@ -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();
}

View File

@@ -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());

View File

@@ -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