From 3eb8d62148c586d57c5e67eeb0fec0586bb2ce18 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 11 Jun 2020 17:12:47 +0100 Subject: [PATCH] Fix #157: Integer overflow in town GetNormalGrowthRate --- src/town_cmd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 6f336e2954..bddb4fdc96 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -3727,9 +3727,9 @@ static uint GetNormalGrowthRate(Town *t) return stat.old_max ? ((uint64) (stat.old_act << 15)) / stat.old_max : 1 << 15; }; uint32 cargo_ratio_fix16 = calculate_cargo_ratio_fix15(t->supplied[CT_PASSENGERS]) + calculate_cargo_ratio_fix15(t->supplied[CT_MAIL]); - uint32 cargo_dependant_part = (((uint64) cargo_ratio_fix16) * ((uint64) inverse_m) * _settings_game.economy.town_growth_cargo_transported) >> 16; - uint32 non_cargo_dependant_part = ((uint64) inverse_m) * (100 - _settings_game.economy.town_growth_cargo_transported); - uint32 total = (cargo_dependant_part + non_cargo_dependant_part); + uint64 cargo_dependant_part = (((uint64) cargo_ratio_fix16) * ((uint64) inverse_m) * _settings_game.economy.town_growth_cargo_transported) >> 16; + uint64 non_cargo_dependant_part = ((uint64) inverse_m) * (100 - _settings_game.economy.town_growth_cargo_transported); + uint64 total = (cargo_dependant_part + non_cargo_dependant_part); if (total == 0) { ClrBit(t->flags, TOWN_IS_GROWING); return UINT16_MAX;