1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-25 23:49:09 +00:00

Fix #10009: bad overflow protection when taking out loans

This commit is contained in:
Rubidium
2023-01-15 11:08:08 +01:00
committed by Michael Lutz
parent 0cb3d85a87
commit bac7ad72b1
2 changed files with 7 additions and 2 deletions

@@ -176,6 +176,9 @@ public:
inline constexpr bool operator <= (const int other) const { return !(*this > other); }
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; }
};

@@ -60,8 +60,10 @@ CommandCost CmdIncreaseLoan(DoCommandFlag flags, LoanCommand cmd, Money amount)
break;
}
/* Overflow protection */
if (c->money + c->current_loan + loan < c->money) return CMD_ERROR;
/* In case adding the loan triggers the overflow protection of Money,
* 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) {
c->money += loan;