From 32231b48fe671e36b55d738e360e0c3649ad69c1 Mon Sep 17 00:00:00 2001 From: Jordan Date: Sun, 5 Jun 2022 19:52:36 +0100 Subject: [PATCH] Avoid int overflow when using fillr in negative coords (#1711) Fix int overflow when using fill and fillr in negative y-coordinates --- .../src/main/java/com/sk89q/worldedit/EditSession.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java index 55c5ab21f..d32b579fe 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -1459,10 +1459,17 @@ public class EditSession extends PassthroughExtent implements AutoCloseable { checkArgument(radius >= 0, "radius >= 0"); checkArgument(depth >= 1, "depth >= 1"); + // Avoid int overflow (negative coordinate space allows for overflow back round to positive if the depth is large enough). + // Depth is always 1 or greater, thus the lower bound should always be <= origin y. + int lowerBound = origin.getBlockY() - depth + 1; + if (lowerBound > origin.getBlockY()) { + lowerBound = Integer.MIN_VALUE; + } + Mask mask = new MaskIntersection( new RegionMask(new EllipsoidRegion(null, origin, Vector3.at(radius, radius, radius))), new BoundedHeightMask( - Math.max(origin.getBlockY() - depth + 1, minY), + Math.max(lowerBound, minY), Math.min(maxY, origin.getBlockY()) ), Masks.negate(new ExistingBlockMask(this))