[SCM] Quake 3 engine branch, debian-experimental, updated. debian/1.36+svn1946-3-19-gf3cfa12
Simon McVittie
smcv at debian.org
Thu Aug 4 09:17:06 UTC 2011
The following commit has been merged in the debian-experimental branch:
commit 685b406ce4788b4891ca27a97d2f009dbd56c214
Author: Simon McVittie <smcv at debian.org>
Date: Thu Aug 4 08:37:20 2011 +0100
update fake-QVM patch for this snapshot, and restore the ability to load replacement shared objects from a subdirectory
diff --git a/debian/changelog b/debian/changelog
index 6ccbbee..c33adb1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -6,6 +6,8 @@ ioquake3 (1.36+svn2131-1) UNRELEASED; urgency=low
* New upstream snapshot
- drop security patches, no longer needed
- install the new pluggable renderers
+ - update fake-QVM patch for this snapshot, and restore the ability to
+ load replacement shared objects from a subdirectory
* Amend previous changelog to include bug numbers, which were not available
when the package was prepared before the embargo date
* Add Breaks for openarena versions that don't set the protocol version
diff --git a/debian/patches/0002-Add-a-special-vmMagic-that-causes-equivalent-native-.patch b/debian/patches/0002-Add-a-special-vmMagic-that-causes-equivalent-native-.patch
index 9884e8c..2f754ec 100644
--- a/debian/patches/0002-Add-a-special-vmMagic-that-causes-equivalent-native-.patch
+++ b/debian/patches/0002-Add-a-special-vmMagic-that-causes-equivalent-native-.patch
@@ -1,19 +1,75 @@
+From b2efe45819c6544372e6bb96ff3aae0c52d856a0 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv at debian.org>
-Date: Thu, 10 Mar 2011 23:32:30 +0000
-Subject: Add a special vmMagic that causes equivalent native code to be loaded instead
+Date: Thu, 4 Aug 2011 08:36:09 +0100
+Subject: [PATCH] Add a special vmMagic that causes equivalent native code to
+ be loaded instead
This means that mods can build everything from source without relying on
the non-GPL q3lcc compiler. By padding the fake QVM with bytes chosen
to match the CRC-32 of the upstream-released QVM, it's even possible to
be network-compatible with the upstream one, and so play on pure servers.
+If the magic number in the fake QVM file is immediately followed by a
+non-empty string (e.g. "pak0"), we try using it as a subdirectory name,
+so we end up loading something like pak0/qagamex86_64.so; otherwise we
+just use the base name, as if for VMI_NATIVE. This is necessary for mods
+like OpenArena, where the game-code for 0.8.1 and 0.8.5 is not
+network-compatible, so 0.8.5 clients on a 0.8.1 pure server need to load
+the 0.8.1 game-code.
+
Origin: vendor, Debian
Forwarded: no
---
- code/qcommon/qfiles.h | 4 ++++
- code/qcommon/vm.c | 18 ++++++++++++++++++
- 2 files changed, 22 insertions(+), 0 deletions(-)
+ code/qcommon/files.c | 6 ++--
+ code/qcommon/qcommon.h | 2 +-
+ code/qcommon/qfiles.h | 4 +++
+ code/qcommon/vm.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 64 insertions(+), 5 deletions(-)
+diff --git a/code/qcommon/files.c b/code/qcommon/files.c
+index d2e906a..b8e04ee 100644
+--- a/code/qcommon/files.c
++++ b/code/qcommon/files.c
+@@ -1384,7 +1384,7 @@ Return the searchpath in "startSearch".
+ =================
+ */
+
+-vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, int enableDll)
++vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, int enableDll, int forceDll)
+ {
+ searchpath_t *search, *lastSearch;
+ directory_t *dir;
+@@ -1408,7 +1408,7 @@ vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const cha
+
+ while(search)
+ {
+- if(search->dir && !fs_numServerPaks)
++ if(search->dir && (forceDll || !fs_numServerPaks))
+ {
+ dir = search->dir;
+
+@@ -1431,7 +1431,7 @@ vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const cha
+ return VMI_COMPILED;
+ }
+ }
+- else if(search->pack)
++ else if(search->pack && !forceDll)
+ {
+ pack = search->pack;
+
+diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h
+index eb5e45a..2f93ee4 100644
+--- a/code/qcommon/qcommon.h
++++ b/code/qcommon/qcommon.h
+@@ -624,7 +624,7 @@ qboolean FS_FileExists( const char *file );
+
+ qboolean FS_CreatePath (char *OSPath);
+
+-vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, int enableDll);
++vmInterpret_t FS_FindVM(void **startSearch, char *found, int foundlen, const char *name, int enableDll, int forceDll);
+
+ char *FS_BuildOSPath( const char *base, const char *game, const char *qpath );
+ qboolean FS_CompareZipChecksum(const char *zipfile);
diff --git a/code/qcommon/qfiles.h b/code/qcommon/qfiles.h
index 7f1ef96..e3515b4 100644
--- a/code/qcommon/qfiles.h
@@ -30,20 +86,64 @@ index 7f1ef96..e3515b4 100644
int vmMagic;
diff --git a/code/qcommon/vm.c b/code/qcommon/vm.c
-index d3fb85b..0b7bbfe 100644
+index c500aea..64cd648 100644
--- a/code/qcommon/vm.c
+++ b/code/qcommon/vm.c
-@@ -387,6 +387,18 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
+@@ -370,6 +370,7 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
+ union {
+ vmHeader_t *h;
+ void *v;
++ unsigned char *bytes;
+ } header;
+
+ // load the image
+@@ -390,6 +391,54 @@ vmHeader_t *VM_LoadQVM( vm_t *vm, qboolean alloc ) {
// show where the qvm was loaded from
- Cmd_ExecuteString( va( "which %s\n", filename ) );
+ FS_Which(filename, vm->searchPath);
+ if (LittleLong( header.h->vmMagic ) == VM_MAGIC_USE_NATIVE) {
-+ Com_Printf( "...which has vmMagic VM_MAGIC_USE_NATIVE.\n" );
-+ Com_Printf( "Loading DLL file %s instead.\n", vm->name );
-+ vm->dllHandle = Sys_LoadDll( vm->name, &vm->entryPoint, VM_DllSyscall );
-+ if ( !vm->dllHandle ) {
-+ Com_Printf( "Failed to load DLL.\n" );
-+ VM_Free( vm );
++ char module[MAX_OSPATH];
++ char filename[MAX_OSPATH];
++ int retval = -1;
++ void *startSearch = NULL;
++
++ Com_Printf("...which has vmMagic VM_MAGIC_USE_NATIVE.\n");
++
++ if (header.bytes[sizeof(int)] != '\0') {
++ // FS_ReadFileDir guarantees a trailing \0, even if
++ // there wasn't actually one in the file
++ Com_sprintf(module, sizeof(module), "%s/%s",
++ header.bytes + sizeof(int), vm->name);
++ Com_Printf("... trying %s\n", module);
++ startSearch = NULL;
++
++ if (FS_CheckDirTraversal(module)) {
++ Com_Printf("Directory traversal detected! %s\n", module);
++ VM_Free(vm);
++ return NULL;
++ }
++
++ retval = FS_FindVM(&startSearch, filename, sizeof(filename), module, qtrue, qtrue);
++ }
++
++ if (retval != VMI_NATIVE) {
++ Com_sprintf(module, sizeof(module), "%s", vm->name);
++ Com_Printf("... trying %s\n", module);
++ startSearch = NULL;
++
++ retval = FS_FindVM(&startSearch, filename, sizeof(filename), module, qtrue, qtrue);
++ }
++
++ if (retval != VMI_NATIVE) {
++ VM_Free(vm);
++ return NULL;
++ }
++
++ Com_Printf("Loading DLL file %s instead.\n", filename);
++ vm->dllHandle = Sys_LoadGameDll(filename, &vm->entryPoint, VM_DllSyscall);
++ if (!vm->dllHandle) {
++ Com_Printf("Failed to load DLL %s.\n", filename);
++ VM_Free(vm);
+ return NULL;
+ }
+ return header.h;
@@ -52,9 +152,18 @@ index d3fb85b..0b7bbfe 100644
if( LittleLong( header.h->vmMagic ) == VM_MAGIC_VER2 ) {
Com_Printf( "...which has vmMagic VM_MAGIC_VER2\n" );
-@@ -573,6 +585,12 @@ vm_t *VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *),
- return NULL;
- }
+@@ -573,7 +622,7 @@ vm_t *VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *),
+
+ do
+ {
+- retval = FS_FindVM(&startSearch, filename, sizeof(filename), module, (interpret == VMI_NATIVE));
++ retval = FS_FindVM(&startSearch, filename, sizeof(filename), module, (interpret == VMI_NATIVE), qfalse);
+
+ if(retval == VMI_NATIVE)
+ {
+@@ -605,6 +654,12 @@ vm_t *VM_Create( const char *module, intptr_t (*systemCalls)(intptr_t *),
+
+ vm->systemCall = systemCalls;
+ if ( vm->dllHandle ) {
+ // it was replaced by a DLL anyway
@@ -64,5 +173,7 @@ index d3fb85b..0b7bbfe 100644
+
// allocate space for the jump targets, which will be filled in by the compile/prep functions
vm->instructionCount = header->instructionCount;
- vm->instructionPointers = Hunk_Alloc( vm->instructionCount*4, h_high );
+ vm->instructionPointers = Hunk_Alloc(vm->instructionCount * sizeof(*vm->instructionPointers), h_high);
--
+1.7.5.4
+
--
Quake 3 engine
More information about the Pkg-games-commits
mailing list