diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java index 798fee009..79af792eb 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java @@ -871,7 +871,7 @@ class PacketBuilder2 { blocks.add(block); } // plenty of room - block = getPadding(len, 1280); + block = getPadding(len, 1280, PADDING_MAX_SESSION_REQUEST); len += block.getTotalLength(); blocks.add(block); @@ -930,7 +930,7 @@ class PacketBuilder2 { blocks.add(block); } // plenty of room - block = getPadding(len, 1280); + block = getPadding(len, 1280, PADDING_MAX_SESSION_CREATED); len += block.getTotalLength(); blocks.add(block); @@ -1160,7 +1160,20 @@ class PacketBuilder2 { * @return null if no room */ private Block getPadding(int len, int max) { - int maxpadlen = Math.min(max - len, PADDING_MAX) - SSU2Payload.BLOCK_HEADER_SIZE; + return getPadding(len, max, PADDING_MAX); + } + + /** + * @param len current length of the packet including IP/UDP header + * (unless header subtracted from max) + * If len == 0 ensure 8 byte block minimum + * @param max max length of the packet + * @param maxPadding max length of the padding (not including block header) + * @return null if no room + * @since 0.9.56 + */ + private Block getPadding(int len, int max, int maxPadding) { + int maxpadlen = Math.min(max - len, maxPadding) - SSU2Payload.BLOCK_HEADER_SIZE; if (maxpadlen < 0) return null; int padlen; diff --git a/router/java/src/net/i2p/router/transport/udp/SSU2Util.java b/router/java/src/net/i2p/router/transport/udp/SSU2Util.java index 039cb9ee6..8e3b4d1bd 100644 --- a/router/java/src/net/i2p/router/transport/udp/SSU2Util.java +++ b/router/java/src/net/i2p/router/transport/udp/SSU2Util.java @@ -57,6 +57,8 @@ final class SSU2Util { public static final int HEADER_PROT_2_OFFSET = PKT_NUM_OFFSET; public static final int PADDING_MAX = 32; + public static final int PADDING_MAX_SESSION_REQUEST = 32; + public static final int PADDING_MAX_SESSION_CREATED = 32; // data size minimums, not including IP/UDP headers