1
0
Fork 0

Fix #10009: bad overflow protection when taking out loans

pull/10360/head
Rubidium 2023-01-15 11:08:08 +01:00 committed by rubidium42
parent 2355882ec1
commit 1ed0b35520
2 changed files with 7 additions and 2 deletions

View File

@ -176,6 +176,9 @@ public:
inline constexpr bool operator <= (const int other) const { return !(*this > other); } inline constexpr bool operator <= (const int other) const { return !(*this > other); }
inline constexpr operator T () const { return this->m_value; } inline constexpr operator T () const { return this->m_value; }
static inline constexpr OverflowSafeInt<T> max() { return T_MAX; }
static inline constexpr OverflowSafeInt<T> min() { return T_MIN; }
}; };

View File

@ -60,8 +60,10 @@ CommandCost CmdIncreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
break; break;
} }
/* Overflow protection */ /* In case adding the loan triggers the overflow protection of Money,
if (c->money + c->current_loan + loan < c->money) return CMD_ERROR; * we would essentially be losing money as taking and repaying the loan
* immediately would not get us back to the same bank balance anymore. */
if (c->money > Money::max() - loan) return CMD_ERROR;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
c->money += loan; c->money += loan;