changeset 15001:43eedecffc5a draft

(svn r19613) -Fix [FS#3755]: possible invalid read when server moves client to spectators before he finishes joining
author smatz <smatz@openttd.org>
date Sun, 11 Apr 2010 22:06:17 +0000
parents c10b7750962f
children baf0e12ad2b4
files src/network/network_server.cpp
diffstat 1 files changed, 6 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -779,10 +779,12 @@
 	char password[NETWORK_PASSWORD_LENGTH];
 	p->Recv_string(password, sizeof(password));
 
-	/* Check company password. Allow joining if we cleared the password meanwhile */
-	const NetworkClientInfo *ci = cs->GetInfo();
-	if (!StrEmpty(_network_company_states[ci->client_playas].password) &&
-			strcmp(password, _network_company_states[ci->client_playas].password) != 0) {
+	/* Check company password. Allow joining if we cleared the password meanwhile.
+	 * Also, check the company is still valid - client could be moved to spectators
+	 * in the middle of the authorization process */
+	CompanyID playas = cs->GetInfo()->client_playas;
+	if (Company::IsValidID(playas) && !StrEmpty(_network_company_states[playas].password) &&
+			strcmp(password, _network_company_states[playas].password) != 0) {
 		/* Password is invalid */
 		return SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_PASSWORD);
 	}