Skip to content

Commit 1cdae10

Browse files
committed
Fix integer overflow in WatchersSortingList3D causing a crash when teleporting too far
1 parent 8236395 commit 1cdae10

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

src/main/java/io/github/opencubicchunks/cubicchunks/core/util/WatchersSortingList3D.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,20 @@ private int computeBucketIdx(T element) {
260260
int dx = x - playerPositions[0];
261261
int dy = y - playerPositions[1];
262262
int dz = z - playerPositions[2];
263-
int distSqMin = dx*dx + dy*dy + dz*dz;
263+
long dx2 = (long) dx * (long) dx;
264+
long dy2 = (long) dy * (long) dy;
265+
long dz2 = (long) dz * (long) dz;
266+
long masked = dx2 | dy2 | dz2;
267+
int distSqMin = masked > (long) Integer.MAX_VALUE ? Integer.MAX_VALUE : dx*dx + dy*dy + dz*dz;
264268
for (int i = 3; i < playerPositions.length; i += 3) {
265269
dx = x - playerPositions[i];
266270
dy = y - playerPositions[i+1];
267271
dz = z - playerPositions[i+2];
268-
int distSq = dx*dx + dy*dy + dz*dz;
272+
dx2 = (long) dx * (long) dx;
273+
dy2 = (long) dy * (long) dy;
274+
dz2 = (long) dz * (long) dz;
275+
masked = dx2 | dy2 | dz2;
276+
int distSq = masked > (long) Integer.MAX_VALUE ? Integer.MAX_VALUE : dx*dx + dy*dy + dz*dz;
269277
if (distSq < distSqMin) {
270278
distSqMin = distSq;
271279
}
@@ -274,7 +282,8 @@ private int computeBucketIdx(T element) {
274282
int log2dist = 32 - Integer.numberOfLeadingZeros(distSqMin);
275283
int bitsToCutOff = log2dist >> 1;
276284
int approxDist = distSqMin >> bitsToCutOff;
277-
return Math.min(approxDist, BUCKET_COUNT - 1);
285+
int min = Math.min(approxDist, BUCKET_COUNT - 1);
286+
return min;
278287
}
279288

280289
/**

0 commit comments

Comments
 (0)