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);