From 7b96144716e1c133aa89e473efac2533ae12395e Mon Sep 17 00:00:00 2001 From: Vasilis Narain <79228641+Vasilis-Narain@users.noreply.github.com> Date: Fri, 29 May 2026 18:18:18 +0200 Subject: [PATCH] [rcore] `GetCurrentMonitor()`, fix for integer overflow in distance calculation (#5842) * Fix signed integer overflow in GetCurrentMonitor distance calc * Revert "Fix signed integer overflow in GetCurrentMonitor distance calc" This reverts commit e0083bc7fe8a4dab23e6c1783402e37aec2661d2. * fix GetCurrentMonitor() distance calc overflow * fix GetCurrentMonitor() distance calc --- src/platforms/rcore_desktop_glfw.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/platforms/rcore_desktop_glfw.c b/src/platforms/rcore_desktop_glfw.c index 6def8e77a..16f22f605 100644 --- a/src/platforms/rcore_desktop_glfw.c +++ b/src/platforms/rcore_desktop_glfw.c @@ -839,7 +839,7 @@ int GetCurrentMonitor(void) // this is probably an overengineered solution for a side case // trying to match SDL behaviour - int closestDist = 0x7FFFFFFF; + unsigned int closestDist = 0xFFFFFFFFu; // Window center position int wcx = 0; @@ -883,7 +883,14 @@ int GetCurrentMonitor(void) int dx = wcx - xclosest; int dy = wcy - yclosest; - int dist = (dx*dx) + (dy*dy); + + // Unsigned to dodge signed overflow UB; (-x)^2 == x^2 mod 2^32 so sign drops out. + // If |dx| or |dy| >= 65536, dist wraps and the wrong monitor may win. + // Not a concern for realistic monitor layouts. + unsigned int ux = (unsigned int)dx; + unsigned int uy = (unsigned int)dy; + unsigned int dist = ux*ux + uy*uy; + if (dist < closestDist) { index = i;