mirror of
https://github.com/Minestom/Minestom.git
synced 2024-07-01 00:44:55 +02:00
Fix broken buffer resize
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
93718276c5
commit
42195c536b
|
@ -256,7 +256,8 @@ public final class NetworkBuffer {
|
||||||
void ensureSize(int length) {
|
void ensureSize(int length) {
|
||||||
if (!resizable) return;
|
if (!resizable) return;
|
||||||
if (nioBuffer.capacity() < writeIndex + length) {
|
if (nioBuffer.capacity() < writeIndex + length) {
|
||||||
ByteBuffer newBuffer = ByteBuffer.allocateDirect(nioBuffer.capacity() * 2);
|
final int newCapacity = Math.max(nioBuffer.capacity() * 2, writeIndex + length);
|
||||||
|
ByteBuffer newBuffer = ByteBuffer.allocateDirect(newCapacity);
|
||||||
nioBuffer.position(0);
|
nioBuffer.position(0);
|
||||||
newBuffer.put(nioBuffer);
|
newBuffer.put(nioBuffer);
|
||||||
nioBuffer = newBuffer.clear();
|
nioBuffer = newBuffer.clear();
|
||||||
|
|
|
@ -114,28 +114,30 @@ final class NetworkBufferTypes {
|
||||||
(buffer, boxed) -> {
|
(buffer, boxed) -> {
|
||||||
final int value = boxed;
|
final int value = boxed;
|
||||||
final int index = buffer.writeIndex();
|
final int index = buffer.writeIndex();
|
||||||
var nio = buffer.nioBuffer;
|
|
||||||
if ((value & (0xFFFFFFFF << 7)) == 0) {
|
if ((value & (0xFFFFFFFF << 7)) == 0) {
|
||||||
buffer.ensureSize(1);
|
buffer.ensureSize(1);
|
||||||
nio.put(index, (byte) value);
|
buffer.nioBuffer.put(index, (byte) value);
|
||||||
return 1;
|
return 1;
|
||||||
} else if ((value & (0xFFFFFFFF << 14)) == 0) {
|
} else if ((value & (0xFFFFFFFF << 14)) == 0) {
|
||||||
buffer.ensureSize(2);
|
buffer.ensureSize(2);
|
||||||
nio.putShort(index, (short) ((value & 0x7F | 0x80) << 8 | (value >>> 7)));
|
buffer.nioBuffer.putShort(index, (short) ((value & 0x7F | 0x80) << 8 | (value >>> 7)));
|
||||||
return 2;
|
return 2;
|
||||||
} else if ((value & (0xFFFFFFFF << 21)) == 0) {
|
} else if ((value & (0xFFFFFFFF << 21)) == 0) {
|
||||||
buffer.ensureSize(3);
|
buffer.ensureSize(3);
|
||||||
|
var nio = buffer.nioBuffer;
|
||||||
nio.put(index, (byte) (value & 0x7F | 0x80));
|
nio.put(index, (byte) (value & 0x7F | 0x80));
|
||||||
nio.put(index + 1, (byte) ((value >>> 7) & 0x7F | 0x80));
|
nio.put(index + 1, (byte) ((value >>> 7) & 0x7F | 0x80));
|
||||||
nio.put(index + 2, (byte) (value >>> 14));
|
nio.put(index + 2, (byte) (value >>> 14));
|
||||||
return 3;
|
return 3;
|
||||||
} else if ((value & (0xFFFFFFFF << 28)) == 0) {
|
} else if ((value & (0xFFFFFFFF << 28)) == 0) {
|
||||||
buffer.ensureSize(4);
|
buffer.ensureSize(4);
|
||||||
|
var nio = buffer.nioBuffer;
|
||||||
nio.putInt(index, (value & 0x7F | 0x80) << 24 | (((value >>> 7) & 0x7F | 0x80) << 16)
|
nio.putInt(index, (value & 0x7F | 0x80) << 24 | (((value >>> 7) & 0x7F | 0x80) << 16)
|
||||||
| ((value >>> 14) & 0x7F | 0x80) << 8 | (value >>> 21));
|
| ((value >>> 14) & 0x7F | 0x80) << 8 | (value >>> 21));
|
||||||
return 4;
|
return 4;
|
||||||
} else {
|
} else {
|
||||||
buffer.ensureSize(5);
|
buffer.ensureSize(5);
|
||||||
|
var nio = buffer.nioBuffer;
|
||||||
nio.putInt(index, (value & 0x7F | 0x80) << 24 | ((value >>> 7) & 0x7F | 0x80) << 16
|
nio.putInt(index, (value & 0x7F | 0x80) << 24 | ((value >>> 7) & 0x7F | 0x80) << 16
|
||||||
| ((value >>> 14) & 0x7F | 0x80) << 8 | ((value >>> 21) & 0x7F | 0x80));
|
| ((value >>> 14) & 0x7F | 0x80) << 8 | ((value >>> 21) & 0x7F | 0x80));
|
||||||
nio.put(index + 4, (byte) (value >>> 28));
|
nio.put(index + 4, (byte) (value >>> 28));
|
||||||
|
|
|
@ -17,6 +17,30 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
public class NetworkBufferTest {
|
public class NetworkBufferTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void resize() {
|
||||||
|
var buffer = new NetworkBuffer(6);
|
||||||
|
buffer.write(INT, 6);
|
||||||
|
assertEquals(4, buffer.writeIndex());
|
||||||
|
|
||||||
|
buffer.write(INT, 7);
|
||||||
|
assertEquals(8, buffer.writeIndex());
|
||||||
|
|
||||||
|
assertEquals(6, buffer.read(INT));
|
||||||
|
assertEquals(7, buffer.read(INT));
|
||||||
|
|
||||||
|
// Test one-off length
|
||||||
|
buffer = new NetworkBuffer(1);
|
||||||
|
buffer.write(BYTE, (byte) 3);
|
||||||
|
assertEquals(1, buffer.writeIndex());
|
||||||
|
|
||||||
|
buffer.write(BYTE, (byte) 4);
|
||||||
|
assertEquals(2, buffer.writeIndex());
|
||||||
|
|
||||||
|
assertEquals((byte) 3, buffer.read(BYTE));
|
||||||
|
assertEquals((byte) 4, buffer.read(BYTE));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void readableBytes() {
|
public void readableBytes() {
|
||||||
var buffer = new NetworkBuffer();
|
var buffer = new NetworkBuffer();
|
||||||
|
@ -264,6 +288,20 @@ public class NetworkBufferTest {
|
||||||
buffer.copyTo(0, bytes, 0, bytes.length);
|
buffer.copyTo(0, bytes, 0, bytes.length);
|
||||||
assertArrayEquals(expected, bytes, "Invalid bytes: " + Arrays.toString(expected) + " != " + Arrays.toString(bytes));
|
assertArrayEquals(expected, bytes, "Invalid bytes: " + Arrays.toString(expected) + " != " + Arrays.toString(bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure resize support
|
||||||
|
{
|
||||||
|
var tmp = new NetworkBuffer(0);
|
||||||
|
action.write(tmp, type, value);
|
||||||
|
assertEquals(0, tmp.readIndex());
|
||||||
|
if (expected != null) assertEquals(expected.length, tmp.writeIndex());
|
||||||
|
|
||||||
|
var tmpRead = action.read(tmp, type);
|
||||||
|
|
||||||
|
assertEquals(value, tmpRead);
|
||||||
|
if (expected != null) assertEquals(expected.length, tmp.readIndex(), "Invalid read index");
|
||||||
|
if (expected != null) assertEquals(expected.length, tmp.writeIndex());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T> void assertBufferType(NetworkBuffer.@NotNull Type<T> type, @NotNull T value, byte @Nullable [] expected) {
|
static <T> void assertBufferType(NetworkBuffer.@NotNull Type<T> type, @NotNull T value, byte @Nullable [] expected) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user