From 16ce2192e45cbc4d2ba01267578ea5c3943caf0f Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 19 Jun 2007 00:05:26 +0000 Subject: (svn r10212) -Fix [FS#723]: money overflow bugs in many locations. --- src/misc_cmd.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/misc_cmd.cpp') diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index ecbf5d8bf..69ecbf29d 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -144,6 +144,9 @@ CommandCost CmdIncreaseLoan(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) break; } + /* Overflow protection */ + if (p->player_money + p->current_loan + loan < p->player_money) return CMD_ERROR; + if (flags & DC_EXEC) { p->player_money += loan; p->current_loan += loan; @@ -166,14 +169,14 @@ CommandCost CmdDecreaseLoan(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) if (p->current_loan == 0) return_cmd_error(STR_702D_LOAN_ALREADY_REPAYED); - int32 loan; + Money loan; switch (p2) { default: return CMD_ERROR; // Invalid method case 0: // Pay back one step loan = min(p->current_loan, (IsHumanPlayer(_current_player) || _patches.ainew_active) ? LOAN_INTERVAL : LOAN_INTERVAL_OLD_AI); break; case 1: // Pay back as much as possible - loan = max(min(p->current_loan, p->player_money), (int32)LOAN_INTERVAL); + loan = max(min(p->current_loan, p->player_money), (Money)LOAN_INTERVAL); loan -= loan % LOAN_INTERVAL; break; } @@ -304,7 +307,7 @@ CommandCost CmdMoneyCheat(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) CommandCost CmdGiveMoney(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { const Player *p = GetPlayer(_current_player); - CommandCost amount((Money)min(p1, 20000000LL)); + CommandCost amount(min((Money)p1, 20000000LL)); SET_EXPENSES_TYPE(EXPENSES_OTHER); -- cgit v1.2.3-54-g00ecf