diff options
author | rubidium <rubidium@openttd.org> | 2007-06-19 00:05:26 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-06-19 00:05:26 +0000 |
commit | 16ce2192e45cbc4d2ba01267578ea5c3943caf0f (patch) | |
tree | b07b07a2f5f04c71f8608530c990ebe9bdf603e1 /src/misc_cmd.cpp | |
parent | 23af871615557914fd36744afe46a93a360603ce (diff) | |
download | openttd-16ce2192e45cbc4d2ba01267578ea5c3943caf0f.tar.xz |
(svn r10212) -Fix [FS#723]: money overflow bugs in many locations.
Diffstat (limited to 'src/misc_cmd.cpp')
-rw-r--r-- | src/misc_cmd.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
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); |