summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-06-11 00:18:20 +0200
committerGitHub <noreply@github.com>2021-06-11 00:18:20 +0200
commitef25afd55ab868a4322d0c241b5c4898966ac919 (patch)
treed2741bdd0973cf374993fbf4d1a203aa9d79e519
parentacb6348ba62337d7580397d8f858e4a0bd1b0cab (diff)
downloadopenttd-ef25afd55ab868a4322d0c241b5c4898966ac919.tar.xz
Fix #9348, 4d74e51: don't try to sell shares of spectators (#9349)
"new_owner" can be INVALID_OWNER, and as INVALID_OWNER == COMPANY_SPECTATORS, we could end up trying to sell shares of nobody.
-rw-r--r--src/company_cmd.cpp2
-rw-r--r--src/economy.cpp6
2 files changed, 5 insertions, 3 deletions
diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp
index e58d29b2b..1c79c4b8a 100644
--- a/src/company_cmd.cpp
+++ b/src/company_cmd.cpp
@@ -67,7 +67,7 @@ Company::Company(uint16 name_1, bool is_ai)
this->clear_limit = (uint32)_settings_game.construction.clear_frame_burst << 16;
this->tree_limit = (uint32)_settings_game.construction.tree_frame_burst << 16;
- for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR;
+ for (uint j = 0; j < 4; j++) this->share_owners[j] = INVALID_OWNER;
InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY);
}
diff --git a/src/economy.cpp b/src/economy.cpp
index efea96806..7f14bed8a 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -324,10 +324,12 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
Backup<CompanyID> cur_company2(_current_company, FILE_LINE);
const Company *c = Company::Get(old_owner);
for (i = 0; i < 4; i++) {
+ if (c->share_owners[i] == INVALID_OWNER) continue;
+
if (c->bankrupt_value == 0 && c->share_owners[i] == new_owner) {
/* You are the one buying the company; so don't sell the shares back to you. */
- Company::Get(new_owner)->share_owners[i] = COMPANY_SPECTATOR;
- } else if (c->share_owners[i] != INVALID_OWNER) {
+ Company::Get(new_owner)->share_owners[i] = INVALID_OWNER;
+ } else {
cur_company2.Change(c->share_owners[i]);
/* Sell the shares */
CommandCost res = DoCommand(0, old_owner, 0, DC_EXEC | DC_BANKRUPT, CMD_SELL_SHARE_IN_COMPANY);