From 16900dd61895df6b88b3375783cf4116f16133ab Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 21 Jun 2017 09:54:36 +0200 Subject: [PATCH] Avoid booster speed overflows and undefined behaviour, fixes #5679 --- src/openrct2/ride/ride.c | 8 ++++++-- src/openrct2/ride/ride.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/openrct2/ride/ride.c b/src/openrct2/ride/ride.c index 5c344f3034..5863ba6016 100644 --- a/src/openrct2/ride/ride.c +++ b/src/openrct2/ride/ride.c @@ -8612,10 +8612,14 @@ bool ride_type_supports_boosters(uint8 rideType) return false; } -uint16 get_booster_speed(uint8 rideType, uint16 rawSpeed) +sint32 get_booster_speed(uint8 rideType, sint32 rawSpeed) { sint8 shiftFactor = RideProperties[rideType].booster_speed_factor; - if (shiftFactor > 0) + if (shiftFactor == 0) + { + return rawSpeed; + } + else if (shiftFactor > 0) { return (rawSpeed << shiftFactor); } diff --git a/src/openrct2/ride/ride.h b/src/openrct2/ride/ride.h index 1e76388a5e..b4ac78de87 100644 --- a/src/openrct2/ride/ride.h +++ b/src/openrct2/ride/ride.h @@ -1194,6 +1194,6 @@ const char * ride_type_get_enum_name(sint32 rideType); uint8 ride_entry_get_first_non_null_ride_type(rct_ride_entry * rideEntry); bool ride_type_supports_boosters(uint8 rideType); -uint16 get_booster_speed(uint8 rideType, uint16 rawSpeed); +sint32 get_booster_speed(uint8 rideType, sint32 rawSpeed); #endif