From f4136ae7ed253bd4fa3467a8b99f49e0f1fc1249 Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Sun, 4 Jan 2026 20:29:16 +0000 Subject: [PATCH] Prevent division by zero in particle emitter frametime calculation --- .../Libraries/Source/WWVegas/WW3D2/part_emt.cpp | 14 ++++++++++---- .../Libraries/Source/WWVegas/WW3D2/part_emt.cpp | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp index 37a1731b0e9..7ab21a450a3 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp @@ -554,11 +554,17 @@ void ParticleEmitterClass::Create_New_Particles(const Quaternion & curr_quat, co if (frametime > 100 * EmitRate) { // If the loop will run over 100 times unsigned int buf_size = Buffer->Get_Buffer_Size(); unsigned int gcd = Greatest_Common_Divisor(buf_size, BurstSize); - unsigned int bursts = buf_size / gcd; - unsigned int cycle_time = EmitRate * bursts; - if (cycle_time > 1) { - frametime = frametime % cycle_time; + // Prevent division by zero - if gcd is 0, the buffer/burst parameters are degenerate + if (gcd > 0) { + unsigned int bursts = buf_size / gcd; + unsigned int cycle_time = EmitRate * bursts; + if (cycle_time > 1) { + frametime = frametime % cycle_time; + } else { + frametime = 1; + } } else { + // Degenerate case: buffer size and burst size are both 0 frametime = 1; } } diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp index 735610ee76c..bfb521a2792 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/part_emt.cpp @@ -563,11 +563,17 @@ void ParticleEmitterClass::Create_New_Particles(const Quaternion & curr_quat, co if (frametime > 100 * EmitRate) { // If the loop will run over 100 times unsigned int buf_size = Buffer->Get_Buffer_Size(); unsigned int gcd = Greatest_Common_Divisor(buf_size, BurstSize); - unsigned int bursts = buf_size / gcd; - unsigned int cycle_time = EmitRate * bursts; - if (cycle_time > 1) { - frametime = frametime % cycle_time; + // Prevent division by zero - if gcd is 0, the buffer/burst parameters are degenerate + if (gcd > 0) { + unsigned int bursts = buf_size / gcd; + unsigned int cycle_time = EmitRate * bursts; + if (cycle_time > 1) { + frametime = frametime % cycle_time; + } else { + frametime = 1; + } } else { + // Degenerate case: buffer size and burst size are both 0 frametime = 1; } }