1
0
mirror of https://github.com/OpenTTD/OpenTTD synced 2026-01-24 04:34:16 +01:00

(svn r22935) [1.1] -Backport from trunk:

- Fix: Prevent authentication bypass for the admin port when a new game is started [FS#4771] (r22934)
- Fix: TTO savegames with any aircraft not in an hangar caused crashes during load (r22915)
- Fix: Windows 2000 and XP without service pack 3 must use the win9x binary/installer; the newer MSVC compiler of the compile farm does not support those versions of Windows anymore [FS#4749] (r22909)
This commit is contained in:
rubidium
2011-09-15 18:56:43 +00:00
parent c33d1fc60b
commit c42d060a44
10 changed files with 61 additions and 43 deletions

View File

@@ -31,7 +31,7 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height);
void UpdateAirplanesOnNewStation(const Station *st);
void UpdateAircraftCache(Aircraft *v);
void AircraftLeaveHangar(Aircraft *v);
void AircraftLeaveHangar(Aircraft *v, Direction exit_dir);
void AircraftNextAirportPos_and_Order(Aircraft *v);
void SetAircraftPosition(Aircraft *v, int x, int y, int z);
byte GetAircraftFlyingAltitude(const Aircraft *v);

View File

@@ -1246,15 +1246,17 @@ void AircraftNextAirportPos_and_Order(Aircraft *v)
/**
* Aircraft is about to leave the hangar.
* @param v Aircraft leaving.
* @param exit_dir The direction the vehicle leaves the hangar.
* @note This function is called in AfterLoadGame for old savegames, so don't rely
* on any data to be valid, especially don't rely on the fact that the vehicle
* is actually on the ground inside a depot.
*/
void AircraftLeaveHangar(Aircraft *v)
void AircraftLeaveHangar(Aircraft *v, Direction exit_dir)
{
const Station *st = Station::GetByTile(v->tile);
v->cur_speed = 0;
v->subspeed = 0;
v->progress = 0;
v->direction = st->airport.GetHangarExitDirection(v->tile);
v->direction = exit_dir;
v->vehstatus &= ~VS_HIDDEN;
{
Vehicle *u = v->Next();
@@ -1339,7 +1341,8 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
/* airplane goto state takeoff, helicopter to helitakeoff */
v->state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
}
AircraftLeaveHangar(v);
const Station *st = Station::GetByTile(v->tile);
AircraftLeaveHangar(v, st->airport.GetHangarExitDirection(v->tile));
AirportMove(v, apc);
}

View File

@@ -393,6 +393,15 @@ public:
const char *ReceiveCommand(Packet *p, struct CommandPacket *cp);
void SendCommand(Packet *p, const struct CommandPacket *cp);
/**
* Get the status of the admin.
* @return The status of the admin.
*/
AdminStatus GetAdminStatus() const
{
return this->status;
}
};
#endif /* ENABLE_NETWORK */

View File

@@ -750,7 +750,7 @@ void NetworkReboot()
}
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
as->SendNewGame();
as->SendPackets();
}
@@ -777,7 +777,7 @@ void NetworkDisconnect(bool blocking, bool close_admins)
if (close_admins) {
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
as->SendShutdown();
as->SendPackets();
}

View File

@@ -147,8 +147,6 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendProtocol()
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendWelcome()
{
this->status = ADMIN_STATUS_ACTIVE;
Packet *p = new Packet(ADMIN_PACKET_SERVER_WELCOME);
p->Send_string(_settings_client.network.server_name);
@@ -525,6 +523,8 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_JOIN)
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}
this->status = ADMIN_STATUS_ACTIVE;
DEBUG(net, 1, "[admin] '%s' (%s) has connected", this->admin_name, this->admin_version);
return this->SendProtocol();
@@ -656,7 +656,7 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_CHAT)
void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendClientInfo(cs);
if (new_client) {
@@ -673,7 +673,7 @@ void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client)
void NetworkAdminClientUpdate(const NetworkClientInfo *ci)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendClientUpdate(ci);
}
@@ -687,7 +687,7 @@ void NetworkAdminClientUpdate(const NetworkClientInfo *ci)
void NetworkAdminClientQuit(ClientID client_id)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendClientQuit(client_id);
}
@@ -702,7 +702,7 @@ void NetworkAdminClientQuit(ClientID client_id)
void NetworkAdminClientError(ClientID client_id, NetworkErrorCode error_code)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CLIENT_INFO] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendClientError(client_id, error_code);
}
@@ -722,7 +722,7 @@ void NetworkAdminCompanyInfo(const Company *company, bool new_company)
}
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue;
as->SendCompanyInfo(company);
@@ -741,7 +741,7 @@ void NetworkAdminCompanyUpdate(const Company *company)
if (company == NULL) return;
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_COMPANY_INFO] != ADMIN_FREQUENCY_AUTOMATIC) continue;
as->SendCompanyUpdate(company);
@@ -756,7 +756,7 @@ void NetworkAdminCompanyUpdate(const Company *company)
void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
as->SendCompanyRemove(company_id, bcrr);
}
}
@@ -770,7 +770,7 @@ void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_i
if (from_admin) return;
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CHAT] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendChat(action, desttype, client_id, msg, data);
}
@@ -796,7 +796,7 @@ void NetworkServerSendAdminRcon(AdminIndex admin_index, TextColour colour_code,
void NetworkAdminConsole(const char *origin, const char *string)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendConsole(origin, string);
}
@@ -813,7 +813,7 @@ void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacke
ClientID client_id = owner == NULL ? _network_own_client_id : owner->client_id;
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
if (as->update_frequency[ADMIN_UPDATE_CMD_LOGGING] & ADMIN_FREQUENCY_AUTOMATIC) {
as->SendCmdLogging(client_id, cp);
}
@@ -826,7 +826,7 @@ void NetworkAdminCmdLogging(const NetworkClientSocket *owner, const CommandPacke
void ServerNetworkAdminSocketHandler::WelcomeAll()
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
as->SendWelcome();
}
}
@@ -838,7 +838,7 @@ void ServerNetworkAdminSocketHandler::WelcomeAll()
void NetworkAdminUpdate(AdminUpdateFrequency freq)
{
ServerNetworkAdminSocketHandler *as;
FOR_ALL_ADMIN_SOCKETS(as) {
FOR_ALL_ACTIVE_ADMIN_SOCKETS(as) {
for (int i = 0; i < ADMIN_UPDATE_END; i++) {
if (as->update_frequency[i] & freq) {
/* Update the admin for the required details */

View File

@@ -85,6 +85,14 @@ public:
#define FOR_ALL_ADMIN_SOCKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(ServerNetworkAdminSocketHandler, adminsocket_index, var, start)
#define FOR_ALL_ADMIN_SOCKETS(var) FOR_ALL_ADMIN_SOCKETS_FROM(var, 0)
/**
* Iterate over all the active sockets.
* @param var The variable to iterate with.
*/
#define FOR_ALL_ACTIVE_ADMIN_SOCKETS(var) \
FOR_ALL_ADMIN_SOCKETS(var) \
if (var->GetAdminStatus() == ADMIN_STATUS_ACTIVE)
void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client = false);
void NetworkAdminClientUpdate(const NetworkClientInfo *ci);
void NetworkAdminClientQuit(ClientID client_id);

View File

@@ -178,7 +178,7 @@ void UpdateOldAircraft()
continue;
}
AircraftLeaveHangar(a); // make airplane visible if it was in a depot for example
AircraftLeaveHangar(a, a->direction); // make airplane visible if it was in a depot for example
a->vehstatus &= ~VS_STOPPED; // make airplane moving
UpdateAircraftCache(a);
a->cur_speed = a->vcache.cached_max_speed; // so aircraft don't have zero speed while in air