changeset 18962:2d570706467b draft

(svn r23817) -Fix [FS#4962]: desync due to different NewGRF version. So reduce the chance that it happens significantly with betas/RCs/nightlies by doing the same as is done for stable releases: check the NewGRF version of server vs client. Previously this check was not done for nightlies/betas/RCs due to missing versioning information in the source tarballs, but they have that for a while now. So just force the NewGRF version check for all versions, and remove the broken --revision configure option
author rubidium <rubidium@openttd.org>
date Tue, 17 Jan 2012 17:27:38 +0000
parents c39e06809de6
children 1a1a556c75ee
files Makefile.src.in config.lib src/network/network_client.cpp src/network/network_server.cpp
diffstat 4 files changed, 4 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.src.in
+++ b/Makefile.src.in
@@ -37,7 +37,6 @@
 MAKEDEPEND     = !!MAKEDEPEND!!
 CFLAGS_MAKEDEP = !!CFLAGS_MAKEDEP!!
 SORT           = !!SORT!!
-REVISION       = !!REVISION!!
 AWK            = !!AWK!!
 CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
 CONFIG_CACHE_LINKER   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
@@ -94,15 +93,9 @@
 VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh")
 MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d'	')
 
-ifdef REVISION
-# Use specified revision (which should be of the form "r000").
-REV := $(REVISION)
-REV_NR := $(shell echo $(REVISION) | sed "s@[^0-9]@@g")
-else
 # Use autodetected revisions
 REV      := $(shell echo "$(VERSIONS)" | cut -f 1 -d'	')
 REV_NR   := $(shell echo "$(VERSIONS)" | cut -f 2 -d'	')
-endif
 
 # Make sure we have something in REV and REV_NR
 ifeq ($(REV),)
--- a/config.lib
+++ b/config.lib
@@ -32,7 +32,6 @@
 	os="DETECT"
 	endian="AUTO"
 	cpu_type="DETECT"
-	revision=""
 	config_log="config.log"
 	prefix_dir="/usr/local"
 	binary_dir="games"
@@ -107,7 +106,6 @@
 		os
 		endian
 		cpu_type
-		revision
 		config_log
 		prefix_dir
 		binary_dir
@@ -199,8 +197,6 @@
 			--cpu-type)                   prev_p="cpu_type";;
 			--cpu-type=*)                 cpu_type="$optarg";;
 
-			--revision=*)                 revision="$optarg";;
-
 			--cc-build)                   prevp_p="cc_build";;
 			--cc-build=*)                 cc_build="$optarg";;
 			--cc-host)                    prevp_p="cc_host";;
@@ -1010,31 +1006,15 @@
 		fi
 	fi
 
-	if [ -n "$revision" ]; then
-		log 1 "checking revision... $revision"
-		log 1 "WARNING: we do not advise you to use this setting"
-		log 1 "WARNING: in most cases it is not safe for network use"
-		log 1 "WARNING: USE WITH CAUTION!"
-
-		sleep 5
-	elif [ -f "$ROOT_DIR/version" ]; then
-		revision="`cat $ROOT_DIR/version`"
-
-		log 1 "checking revision... $revision"
-	elif [ -d "$ROOT_DIR/.svn" ] && [ -n "`svn help 2>/dev/null`" ]; then
-		revision=""
+	if [ -d "$ROOT_DIR/.svn" ] && [ -n "`svn help 2>/dev/null`" ]; then
 		log 1 "checking revision... svn detection"
 	elif [ -d "$ROOT_DIR/.git" ] && [ -n "`git help 2>/dev/null`" ]; then
-		revision=""
 		log 1 "checking revision... git detection"
 	elif [ -d "$ROOT_DIR/.hg" ] && [ -n "`hg help 2>/dev/null`" ]; then
-		revision=""
 		log 1 "checking revision... hg detection"
 	elif [ -f "$ROOT_DIR/.ottdrev" ]; then
-		revision=""
 		log 1 "checking revision... source tarball"
 	else
-		revision=""
 		log 1 "checking revision... no detection"
 		log 1 "WARNING: there is no means to determine the version."
 		log 1 "WARNING: please use a subversion, mercurial, or git checkout of OpenTTD."
@@ -3245,7 +3225,6 @@
 		s@!!SRCS!!@$SRCS@g;
 		s@!!OS!!@$os@g;
 		s@!!CONFIGURE_FILES!!@$CONFIGURE_FILES@g;
-		s@!!REVISION!!@$revision@g;
 		s@!!AWK!!@$awk@g;
 		s@!!DISTCC!!@$distcc@g;
 		s@!!NFORENUM!!@$nforenum@g;
@@ -3468,8 +3447,6 @@
 	echo "                                 MORPHOS/HPUX/BEOS/SUNOS/CYGWIN/MINGW/OS2/"
 	echo "                                 DOS/WINCE/PSP/HAIKU"
 	echo "  --endian=ENDIAN                set the endian of the HOST (AUTO/LE/BE)"
-	echo "  --revision=rXXXX               overwrite the revision detection."
-	echo "                                 Use with care!"
 	echo ""
 	echo "Paths:"
 	echo "  --prefix-dir=dir               specifies the prefix for all installed"
--- a/src/network/network_client.cpp
+++ b/src/network/network_client.cpp
@@ -329,6 +329,7 @@
 
 	Packet *p = new Packet(PACKET_CLIENT_JOIN);
 	p->Send_string(_openttd_revision);
+	p->Send_uint32(_openttd_newgrf_version);
 	p->Send_string(_settings_client.network.client_name); // Client name
 	p->Send_uint8 (_network_join_as);     // PlayAs
 	p->Send_uint8 (NETLANG_ANY);          // Language
@@ -374,13 +375,6 @@
 	my_client->status = STATUS_MAP_WAIT;
 
 	Packet *p = new Packet(PACKET_CLIENT_GETMAP);
-	/* Send the OpenTTD version to the server, let it validate it too.
-	 * But only do it for stable releases because of those we are sure
-	 * that everybody has the same NewGRF version. For trunk and the
-	 * branches we make tarballs of the OpenTTDs compiled from tarball
-	 * will have the lower bits set to 0. As such they would become
-	 * incompatible, which we would like to prevent by this. */
-	if (IsReleasedVersion()) p->Send_uint32(_openttd_newgrf_version);
 	my_client->SendPacket(p);
 	return NETWORK_RECV_STATUS_OKAY;
 }
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -856,9 +856,10 @@
 	char client_revision[NETWORK_REVISION_LENGTH];
 
 	p->Recv_string(client_revision, sizeof(client_revision));
+	uint32 newgrf_version = p->Recv_uint32();
 
 	/* Check if the client has revision control enabled */
-	if (!IsNetworkCompatibleVersion(client_revision)) {
+	if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) {
 		/* Different revisions!! */
 		return this->SendError(NETWORK_ERROR_WRONG_REVISION);
 	}
@@ -968,26 +969,6 @@
 NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP(Packet *p)
 {
 	NetworkClientSocket *new_cs;
-
-	/* Do an extra version match. We told the client our version already,
-	 * lets confirm that the client isn't lieing to us.
-	 * But only do it for stable releases because of those we are sure
-	 * that everybody has the same NewGRF version. For trunk and the
-	 * branches we make tarballs of the OpenTTDs compiled from tarball
-	 * will have the lower bits set to 0. As such they would become
-	 * incompatible, which we would like to prevent by this. */
-	if (IsReleasedVersion()) {
-		if (_openttd_newgrf_version != p->Recv_uint32()) {
-			/* The version we get from the client differs, it must have the
-			 * wrong version. The client must be wrong. */
-			return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
-		}
-	} else if (p->size != 3) {
-		/* We received a packet from a version that claims to be stable.
-		 * That shouldn't happen. The client must be wrong. */
-		return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
-	}
-
 	/* The client was never joined.. so this is impossible, right?
 	 *  Ignore the packet, give the client a warning, and close his connection */
 	if (this->status < STATUS_AUTHORIZED || this->HasClientQuit()) {