Skip to content

Commit 9c83333

Browse files
Fix integer overflow with /burn + /more & fix % in chat formats (#6452)
Before: - Using `/burn <player> 107374183` extinguished the player. - `/burn` accepted negative values. - Using `/more 2147483647` deleted the held item(s) entirely. After: - Using `/burn <player> 107374183` sets the player on fire for 107374183 seconds correctly. - `/burn` doesn't accept negative values. - Using `/more 2147483647` correctly increases the held item stack to 64.
1 parent 5abe8b6 commit 9c83333

File tree

3 files changed

+23
-17
lines changed

3 files changed

+23
-17
lines changed

Essentials/src/main/java/com/earth2me/essentials/commands/Commandburn.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ protected void run(final Server server, final CommandSource sender, final String
1919
}
2020

2121
final User user = getPlayer(server, sender, args, 0);
22-
user.getBase().setFireTicks(Integer.parseInt(args[1]) * 20);
23-
sender.sendTl("burnMsg", user.getDisplayName(), Integer.parseInt(args[1]));
22+
final int seconds = Integer.parseInt(args[1]);
23+
24+
final int fireTicks = (int) Math.max(0L, Math.min((long) seconds * 20, Integer.MAX_VALUE));
25+
26+
user.getBase().setFireTicks(fireTicks);
27+
sender.sendTl("burnMsg", user.getDisplayName(), Math.max(0, seconds));
2428
}
2529

2630
@Override

Essentials/src/main/java/com/earth2me/essentials/commands/Commandmore.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ public void run(final Server server, final User user, final String commandLabel,
3636
if (!NumberUtil.isPositiveInt(args[0])) {
3737
throw new TranslatableException("nonZeroPosNumber");
3838
}
39-
newStackSize += Integer.parseInt(args[0]);
40-
41-
if (newStackSize > (canOversized ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize())) {
42-
user.sendTl(canOversized ? "fullStackDefaultOversize" : "fullStackDefault", canOversized ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize());
43-
newStackSize = canOversized ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize();
39+
final int cap = canOversized ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize();
40+
final long newSizeLong = (long) stack.getAmount() + Integer.parseInt(args[0]);
41+
if (newSizeLong > cap) {
42+
user.sendTl(canOversized ? "fullStackDefaultOversize" : "fullStackDefault", cap);
43+
newStackSize = cap;
44+
} else {
45+
newStackSize = (int) newSizeLong;
4446
}
4547
} else if (canOversized) {
4648
newStackSize = ess.getSettings().getOversizedStackSize();

EssentialsChat/src/main/java/com/earth2me/essentials/chat/processing/AbstractChatHandler.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,16 @@ protected void handleChatFormat(AbstractChatEvent event) {
9292

9393
final ChatType chatType = chat.getType();
9494
String format = ess.getSettings().getChatFormat(group, chat.getRadius() > 0 && chatType == ChatType.UNKNOWN ? ChatType.LOCAL : chatType);
95-
format = format.replace("{0}", group);
96-
format = format.replace("{1}", ess.getSettings().getWorldAlias(world));
97-
format = format.replace("{2}", world.substring(0, 1).toUpperCase(Locale.ENGLISH));
98-
format = format.replace("{3}", team == null ? "" : team.getPrefix());
99-
format = format.replace("{4}", team == null ? "" : team.getSuffix());
100-
format = format.replace("{5}", team == null ? "" : team.getDisplayName());
101-
format = format.replace("{6}", prefix);
102-
format = format.replace("{7}", suffix);
103-
format = format.replace("{8}", username);
104-
format = format.replace("{9}", nickname == null ? username : nickname);
95+
format = format.replace("{0}", group.replace("%", "%%"));
96+
format = format.replace("{1}", ess.getSettings().getWorldAlias(world).replace("%", "%%"));
97+
format = format.replace("{2}", world.substring(0, 1).toUpperCase(Locale.ENGLISH).replace("%", "%%"));
98+
format = format.replace("{3}", team == null ? "" : team.getPrefix().replace("%", "%%"));
99+
format = format.replace("{4}", team == null ? "" : team.getSuffix().replace("%", "%%"));
100+
format = format.replace("{5}", team == null ? "" : team.getDisplayName().replace("%", "%%"));
101+
format = format.replace("{6}", prefix.replace("%", "%%"));
102+
format = format.replace("{7}", suffix.replace("%", "%%"));
103+
format = format.replace("{8}", username.replace("%", "%%"));
104+
format = format.replace("{9}", (nickname == null ? username : nickname).replace("%", "%%"));
105105

106106
// Local, shout and question chat types are only enabled when there's a valid radius
107107
if (chat.getRadius() > 0 && !event.getMessage().isEmpty()) {

0 commit comments

Comments
 (0)