Prevent int overflows when adding/removing items

This commit is contained in:
Melledy
2023-12-06 02:58:55 -08:00
parent 9ba1dc0dfd
commit 1e352947b6
3 changed files with 49 additions and 8 deletions

View File

@@ -24,6 +24,7 @@ import emu.lunarcore.game.player.BasePlayerManager;
import emu.lunarcore.game.player.Player;
import emu.lunarcore.server.packet.send.PacketPlayerSyncScNotify;
import emu.lunarcore.server.packet.send.PacketScenePlaneEventScNotify;
import emu.lunarcore.util.Utils;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -233,8 +234,9 @@ public class Inventory extends BasePlayerManager {
item.save();
return item;
} else {
// Add count
existingItem.setCount(Math.min(existingItem.getCount() + item.getCount(), item.getExcel().getPileLimit()));
// Add count to item
int amount = Utils.safeAdd(existingItem.getCount(), item.getCount(), item.getExcel().getPileLimit(), 0);
existingItem.setCount(amount);
existingItem.save();
return existingItem;
}
@@ -381,7 +383,7 @@ public class Inventory extends BasePlayerManager {
if (item.getExcel() == null || item.getExcel().isEquippable()) {
item.setCount(0);
} else {
item.setCount(item.getCount() - count);
item.setCount(Utils.safeSubtract(item.getCount(), count));
}
if (item.getCount() <= 0) {

View File

@@ -63,6 +63,7 @@ import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.send.*;
import emu.lunarcore.util.Position;
import emu.lunarcore.util.Utils;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
@@ -362,22 +363,22 @@ public class Player {
}
public void addSCoin(int amount) {
this.scoin += amount;
this.scoin = Utils.safeAdd(this.scoin, amount);
this.sendPacket(new PacketPlayerSyncScNotify(this));
}
public void addHCoin(int amount) {
this.hcoin += amount;
this.hcoin = Utils.safeAdd(this.hcoin, amount);
this.sendPacket(new PacketPlayerSyncScNotify(this));
}
public void addMCoin(int amount) {
this.mcoin += amount;
this.mcoin = Utils.safeAdd(this.mcoin, amount);
this.sendPacket(new PacketPlayerSyncScNotify(this));
}
public void addTalentPoints(int amount) {
this.talentPoints += amount;
this.talentPoints = Utils.safeAdd(this.talentPoints, amount);
this.sendPacket(new PacketSyncRogueVirtualItemInfoScNotify(this));
}
@@ -440,7 +441,7 @@ public class Player {
}
public void addStamina(int amount) {
this.stamina += amount;
this.stamina = Utils.safeAdd(this.stamina, amount);
this.sendPacket(new PacketStaminaInfoScNotify(this));
}

View File

@@ -121,6 +121,44 @@ public class Utils {
return i;
}
/**
* Add 2 integers without overflowing
*/
public static int safeAdd(int a, int b) {
return safeAdd(a, b, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
public static int safeAdd(int a, int b, long max, long min) {
long sum = (long) a + (long) b;
if (sum > max) {
return (int) max;
} else if (sum < min) {
return (int) min;
}
return (int) sum;
}
/**
* Subtract 2 integers without overflowing
*/
public static int safeSubtract(int a, int b) {
return safeSubtract(a, b, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
public static int safeSubtract(int a, int b, long max, long min) {
long sum = (long) a - (long) b;
if (sum > max) {
return (int) max;
} else if (sum < min) {
return (int) min;
}
return (int) sum;
}
public static double generateRandomDouble() {
return ThreadLocalRandom.current().nextDouble();