mirror of
https://github.com/PaperMC/Paper.git
synced 2025-03-28 09:17:21 +01:00
Don't wait for main thread when processing commands.
In order to correctly handle disconnects for invalid chat we setup a Waitable and pass it to the main thread then wait for it to be processed. However, commands are also chat packets and they are already on the main thread. In this case, waiting will deadlock the server so we should just do a normal disconnect.
This commit is contained in:
parent
9add7d3000
commit
558411692a
1 changed files with 57 additions and 45 deletions
|
@ -794,22 +794,26 @@ public class NetServerHandler extends NetHandler {
|
||||||
|
|
||||||
if (s.length() > 100) {
|
if (s.length() > 100) {
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
Waitable waitable = new Waitable() {
|
if (packet3chat.a_()) {
|
||||||
@Override
|
Waitable waitable = new Waitable() {
|
||||||
protected Object evaluate() {
|
@Override
|
||||||
NetServerHandler.this.disconnect("Chat message too long");
|
protected Object evaluate() {
|
||||||
return null;
|
NetServerHandler.this.disconnect("Chat message too long");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.minecraftServer.processQueue.add(waitable);
|
||||||
|
|
||||||
|
try {
|
||||||
|
waitable.get();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
};
|
} else {
|
||||||
|
this.disconnect("Chat message too long");
|
||||||
this.minecraftServer.processQueue.add(waitable);
|
|
||||||
|
|
||||||
try {
|
|
||||||
waitable.get();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
} else {
|
} else {
|
||||||
|
@ -818,22 +822,26 @@ public class NetServerHandler extends NetHandler {
|
||||||
for (int i = 0; i < s.length(); ++i) {
|
for (int i = 0; i < s.length(); ++i) {
|
||||||
if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) {
|
if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) {
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
Waitable waitable = new Waitable() {
|
if (packet3chat.a_()) {
|
||||||
@Override
|
Waitable waitable = new Waitable() {
|
||||||
protected Object evaluate() {
|
@Override
|
||||||
NetServerHandler.this.disconnect("Illegal characters in chat");
|
protected Object evaluate() {
|
||||||
return null;
|
NetServerHandler.this.disconnect("Illegal characters in chat");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.minecraftServer.processQueue.add(waitable);
|
||||||
|
|
||||||
|
try {
|
||||||
|
waitable.get();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
};
|
} else {
|
||||||
|
this.disconnect("Illegal characters in chat");
|
||||||
this.minecraftServer.processQueue.add(waitable);
|
|
||||||
|
|
||||||
try {
|
|
||||||
waitable.get();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
return;
|
return;
|
||||||
|
@ -851,22 +859,26 @@ public class NetServerHandler extends NetHandler {
|
||||||
// This section stays because it is only applicable to packets
|
// This section stays because it is only applicable to packets
|
||||||
if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getServerConfigurationManager().isOp(this.player.name)) { // CraftBukkit use thread-safe spam
|
if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getServerConfigurationManager().isOp(this.player.name)) { // CraftBukkit use thread-safe spam
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
Waitable waitable = new Waitable() {
|
if (packet3chat.a_()) {
|
||||||
@Override
|
Waitable waitable = new Waitable() {
|
||||||
protected Object evaluate() {
|
@Override
|
||||||
NetServerHandler.this.disconnect("disconnect.spam");
|
protected Object evaluate() {
|
||||||
return null;
|
NetServerHandler.this.disconnect("disconnect.spam");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.minecraftServer.processQueue.add(waitable);
|
||||||
|
|
||||||
|
try {
|
||||||
|
waitable.get();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
} catch (ExecutionException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
};
|
} else {
|
||||||
|
this.disconnect("disconnect.spam");
|
||||||
this.minecraftServer.processQueue.add(waitable);
|
|
||||||
|
|
||||||
try {
|
|
||||||
waitable.get();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue