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