Blob Blame History Raw
Subject: Don't override the global new and delete operators
Author: Hans de Goede <hdegoede@redhat.com>

vavoom used to override the global new and delete operators, this is a
bad idea and leads to e.g. crashes inside mesa.

Some code paths in vavoom rely on Z_Malloc / new resp. Z_Free / delete
to be interchangable, e.g. source/vc_type.cpp VScriptArray::Clear
sometimes calls delete[] on memory allocated with Z_Malloc.

So we cannot simply just remove the custom new / delete operator
implementations, in stead this patch removes these operator overrides,
and re-implements Z_Malloc / Z_Free as wrappers around new / delete,
keeping the interchangability, while dropping the troublesome override
of the global new / delete operators.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
--- vavoom-1.33/libs/core/zone.cpp	2010-04-21 15:15:40.000000000 +0200
+++ vavoom-1.33.new/libs/core/zone.cpp	2016-01-03 20:38:07.029914648 +0100
@@ -33,6 +33,8 @@
 
 #include "core.h"
 
+#if 0
+
 // MACROS ------------------------------------------------------------------
 
 #define SMALLID				0x22
@@ -516,3 +518,4 @@
 }
 
 #endif
+#endif
--- vavoom-1.33/libs/core/zone.h	2010-12-23 20:47:55.000000000 +0100
+++ vavoom-1.33.new/libs/core/zone.h	2016-01-03 20:39:57.420007907 +0100
@@ -27,88 +27,20 @@
 //**
 //**************************************************************************
 
-//#define ZONE_DEBUG		1
-
 void Z_Shutdown();
 
-#ifdef ZONE_DEBUG
-
-void* Z_Malloc(int size, const char* FileName, int LineNumber);
-void* Z_Calloc(int size, const char* FileName, int LineNumber);
-void Z_Free(void* ptr, const char* FileName, int LineNumber);
-
-inline void* operator new(size_t Size, const char* FileName, int LineNumber)
-{
-	return Z_Malloc(Size, FileName, LineNumber);
-}
-
-inline void operator delete(void* Ptr, const char* FileName, int LineNumber)
-{
-	Z_Free(Ptr, FileName, LineNumber);
-}
-
-inline void* operator new[](size_t Size, const char* FileName, int LineNumber)
-{
-	return Z_Malloc(Size, FileName, LineNumber);
-}
-
-inline void operator delete[](void* Ptr, const char* FileName, int LineNumber)
-{
-	Z_Free(Ptr, FileName, LineNumber);
-}
-
-inline void* operator new(size_t Size)
-{
-	return Z_Malloc(Size, "", 0);
-}
-
-inline void operator delete(void* Ptr)
+static inline void* Z_Malloc(int size)
 {
-	Z_Free(Ptr, "", 0);
+  return static_cast<void *>(operator new(size));
 }
 
-inline void* operator new[](size_t Size)
+static inline void* Z_Calloc(int size)
 {
-	return Z_Malloc(Size, "", 0);
+  return memset(Z_Malloc(size), 0, size);
 }
 
-inline void operator delete[](void* Ptr)
+static inline void Z_Free(void* ptr)
 {
-	Z_Free(Ptr, "", 0);
+  char *p = (char *)ptr;
+  delete p;
 }
-
-#define Z_Malloc(size)				Z_Malloc(size, __FILE__, __LINE__)
-#define Z_Calloc(size)				Z_Calloc(size, __FILE__, __LINE__)
-#define Z_Free(ptr)					Z_Free(ptr, __FILE__, __LINE__)
-
-#define ZONE_DEBUG_NEW				new(__FILE__, __LINE__)
-#undef new
-#define new							ZONE_DEBUG_NEW
-
-#else
-
-void* Z_Malloc(int size);
-void* Z_Calloc(int size);
-void Z_Free(void* ptr);
-
-inline void* operator new(size_t Size)
-{
-	return Z_Malloc(int(Size));
-}
-
-inline void operator delete(void* Ptr)
-{
-	Z_Free(Ptr);
-}
-
-inline void* operator new[](size_t Size)
-{
-	return Z_Malloc(int(Size));
-}
-
-inline void operator delete[](void* Ptr)
-{
-	Z_Free(Ptr);
-}
-
-#endif
--- vavoom-1.33/source/host.cpp	2010-06-04 23:20:22.000000000 +0200
+++ vavoom-1.33.new/source/host.cpp	2016-01-03 20:42:04.898651198 +0100
@@ -706,5 +706,5 @@
 
 	SAFE_SHUTDOWN(VObject::StaticExit, ())
 	SAFE_SHUTDOWN(VName::StaticExit, ())
-	SAFE_SHUTDOWN(Z_Shutdown, ())
+//	SAFE_SHUTDOWN(Z_Shutdown, ())
 }
--- vavoom-1.33/source/sys_sdl.cpp~	2010-09-07 22:05:19.000000000 +0200
+++ vavoom-1.33/source/sys_sdl.cpp	2016-01-03 20:52:32.566259819 +0100
@@ -530,7 +530,7 @@ int main(int argc,char** argv)
 	catch (VavoomError &e)
 	{
 		Host_Shutdown();
-		stack_trace();
+//		stack_trace();
 
 		printf("\n%s\n", e.message);
 		dprintf("\n\nERROR: %s\n", e.message);