Skip to content

Commit a5c6b51

Browse files
committed
smarter packet-in string handling
1 parent 648dd96 commit a5c6b51

File tree

6 files changed

+29
-33
lines changed

6 files changed

+29
-33
lines changed

src/main/java/com/denizenscript/depenizen/bungee/DepenizenConnection.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ public void build(Channel channel, InetAddress address) {
3535
isValid = true;
3636
}
3737

38+
public boolean hasFailed = false;
39+
3840
public void fail(String reason) {
41+
if (hasFailed) {
42+
return;
43+
}
44+
hasFailed = true;
3945
DepenizenBungee.instance.getLogger().info("Connection '" + connectionName + (thisServer == null ? "" : (" / " + thisServer.getName())) + "' failed: " + reason);
4046
channel.close();
4147
}

src/main/java/com/denizenscript/depenizen/bungee/PacketIn.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,18 @@ public abstract class PacketIn {
99

1010
public abstract void process(DepenizenConnection connection, ByteBuf data);
1111

12-
public String readString(ByteBuf buf, int length) {
13-
byte[] strBytes = new byte[length];
14-
buf.readBytes(strBytes, 0, length);
12+
public String readString(DepenizenConnection connection, ByteBuf buf, String label) {
13+
if (buf.readableBytes() < 4) {
14+
connection.fail("Invalid " + getName() + " Packet " + label + " length bytes (needed 4)");
15+
return null;
16+
}
17+
int len = buf.readInt();
18+
if (buf.readableBytes() < len || len < 0) {
19+
connection.fail("Invalid " + getName() + " Packet " + label + " (bytes requested: " + len + ", bytes available: " + buf.readableBytes() + ")");
20+
return null;
21+
}
22+
byte[] strBytes = new byte[len];
23+
buf.readBytes(strBytes, 0, len);
1524
return new String(strBytes, Charsets.UTF_8);
1625
}
1726
}

src/main/java/com/denizenscript/depenizen/bungee/packets/in/ExecuteCommandPacketIn.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,10 @@ public String getName() {
1414

1515
@Override
1616
public void process(DepenizenConnection connection, ByteBuf data) {
17-
if (data.readableBytes() < 4) {
18-
connection.fail("Invalid ExecuteCommandPacket (bytes available: " + data.readableBytes() + ")");
17+
String command = readString(connection, data, "command");
18+
if (command == null) {
1919
return;
2020
}
21-
int commandLength = data.readInt();
22-
if (data.readableBytes() < commandLength || commandLength < 0) {
23-
connection.fail("Invalid ExecuteCommandPacket (version bytes requested: " + commandLength + ")");
24-
return;
25-
}
26-
String command = readString(data, commandLength);
2721
ProxyServer.getInstance().getPluginManager().dispatchCommand(ProxyServer.getInstance().getConsole(), command);
2822
}
2923
}

src/main/java/com/denizenscript/depenizen/bungee/packets/in/ProxyCommandResultPacketIn.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@ public void process(DepenizenConnection connection, ByteBuf data) {
2121
return;
2222
}
2323
long id = data.readLong();
24-
int resultLength = data.readInt();
25-
if (data.readableBytes() < resultLength || resultLength < 0) {
26-
connection.fail("Invalid ProxyCommandResultPacket (result bytes requested: " + resultLength + ")");
24+
String result = readString(connection, data, "result");
25+
if (result == null) {
2726
return;
2827
}
29-
String result = readString(data, resultLength);
3028
CompletableFuture<String> future = DepenizenBungee.instance.proxyCommandWaiters.get(id);
3129
if (future == null) {
3230
return;

src/main/java/com/denizenscript/depenizen/bungee/packets/in/ProxyPingResultPacketIn.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,22 @@ public void process(DepenizenConnection connection, ByteBuf data) {
2626
}
2727
long id = data.readLong();
2828
int maxPlayers = data.readInt();
29-
int versionLength = data.readInt();
30-
if (data.readableBytes() < versionLength || versionLength < 0) {
31-
connection.fail("Invalid ProxyPingResultPacket (version bytes requested: " + versionLength + ")");
29+
String version = readString(connection, data, "version");
30+
String motd = readString(connection, data, "motd");
31+
if (version == null || motd == null) {
3232
return;
3333
}
34-
String version = readString(data, versionLength);
35-
int motdLength = data.readInt();
36-
if (data.readableBytes() < motdLength || motdLength < 0) {
37-
connection.fail("Invalid ProxyPingResultPacket (motd bytes requested: " + motdLength + ")");
38-
return;
39-
}
40-
String motd = readString(data, motdLength);
4134
int playerListCount = data.readInt();
4235
if (playerListCount < -1 || playerListCount > 1024) {
4336
connection.fail("Invalid ProxyPingResultPacket (playerListCount requested: " + playerListCount + ")");
4437
return;
4538
}
4639
ServerPing.PlayerInfo[] playerInfo = playerListCount == -1 ? null : new ServerPing.PlayerInfo[playerListCount];
4740
for (int i = 0; i < playerListCount; i++) {
48-
int nameLength = data.readInt();
49-
if (data.readableBytes() < nameLength || nameLength < 0) {
50-
connection.fail("Invalid ProxyPingResultPacket (player " + i + "name bytes requested: " + nameLength + ")");
41+
String name = readString(connection, data, "name");
42+
if (name == null) {
5143
return;
5244
}
53-
String name = readString(data, nameLength);
5445
long idMost = data.readLong();
5546
long idLeast = data.readLong();
5647
UUID uuid = new UUID(idMost, idLeast);

src/main/java/com/denizenscript/depenizen/bungee/packets/in/RedirectPacketIn.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ public void process(DepenizenConnection connection, ByteBuf data) {
1919
connection.fail("Invalid RedirectPacket (bytes available: " + data.readableBytes() + ")");
2020
return;
2121
}
22-
int targetServerNameLength = data.readInt();
23-
if (data.readableBytes() < targetServerNameLength || targetServerNameLength < 0) {
24-
connection.fail("Invalid RedirectPacket (name bytes requested: " + targetServerNameLength + ")");
22+
String serverName = readString(connection, data, "serverName");
23+
if (serverName == null) {
2524
return;
2625
}
27-
String serverName = readString(data, targetServerNameLength);
2826
int newPacketLen = data.readInt();
2927
if (data.readableBytes() < newPacketLen || newPacketLen < 0) {
3028
connection.fail("Invalid RedirectPacket (packet bytes requested: " + newPacketLen + ")");

0 commit comments

Comments
 (0)