SSU: Fix corruption of ack-only packets containing bitfields

Full acks were included in the bitfield portion, which
ran over and appeared to be fragments.
Also clean up setting bytes with initial data, for clarity.
This commit is contained in:
zzz
2014-11-04 14:51:31 +00:00
parent 634bf5f7e3
commit 0d2892c75d
3 changed files with 13 additions and 7 deletions

View File

@ -1,3 +1,6 @@
2014-11-04 zzz
* SSU: Fix corruption of ack-only packets containing bitfields
* 2014-11-01 0.9.16 released * 2014-11-01 0.9.16 released
2014-10-30 kytv 2014-10-30 kytv

View File

@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 0; public final static long BUILD = 1;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "";

View File

@ -434,7 +434,9 @@ class PacketBuilder {
off += 4; off += 4;
for (int curByte = 0; curByte < size; curByte++) { for (int curByte = 0; curByte < size; curByte++) {
if (curByte + 1 < size) if (curByte + 1 < size)
data[off] |= (byte)(1 << 7); data[off] = (byte)(1 << 7);
else
data[off] = 0;
for (int curBit = 0; curBit < 7; curBit++) { for (int curBit = 0; curBit < 7; curBit++) {
if (bitfield.received(curBit + 7*curByte)) if (bitfield.received(curBit + 7*curByte))
@ -467,7 +469,7 @@ class PacketBuilder {
DataHelper.toLong(data, off, 4, state.getMessageId()); DataHelper.toLong(data, off, 4, state.getMessageId());
off += 4; off += 4;
data[off] |= fragment << 1; data[off] = (byte) (fragment << 1);
if (fragment == state.getFragmentCount() - 1) if (fragment == state.getFragmentCount() - 1)
data[off] |= 1; // isLast data[off] |= 1; // isLast
off++; off++;
@ -621,8 +623,7 @@ class PacketBuilder {
off++; off++;
for (int i = 0; i < ackBitfields.size(); i++) { for (int i = 0; i < ackBitfields.size(); i++) {
ACKBitfield bitfield = ackBitfields.get(i); ACKBitfield bitfield = ackBitfields.get(i);
// no, this will corrupt the packet if (bitfield.receivedComplete()) continue;
//if (bitfield.receivedComplete()) continue;
DataHelper.toLong(data, off, 4, bitfield.getMessageId()); DataHelper.toLong(data, off, 4, bitfield.getMessageId());
off += 4; off += 4;
// only send what we have to // only send what we have to
@ -633,7 +634,9 @@ class PacketBuilder {
size++; size++;
for (int curByte = 0; curByte < size; curByte++) { for (int curByte = 0; curByte < size; curByte++) {
if (curByte + 1 < size) if (curByte + 1 < size)
data[off] |= (byte)(1 << 7); data[off] = (byte)(1 << 7);
else
data[off] = 0;
for (int curBit = 0; curBit < 7; curBit++) { for (int curBit = 0; curBit < 7; curBit++) {
if (bitfield.received(curBit + 7*curByte)) if (bitfield.received(curBit + 7*curByte))
@ -878,7 +881,7 @@ class PacketBuilder {
} }
// now for the body // now for the body
data[off] |= fragmentNum << 4; data[off] = (byte) (fragmentNum << 4);
data[off] |= (numFragments & 0xF); data[off] |= (numFragments & 0xF);
off++; off++;