From c564fa943145ddaf2c54dc34b6ad435ebe63f6d4 Mon Sep 17 00:00:00 2001 From: bobtista Date: Fri, 5 Dec 2025 12:44:30 -0500 Subject: [PATCH 1/5] bugfix: fix sizeof(this) in W3DMPO_GLUE macro --- Core/Libraries/Source/WWVegas/WWLib/always.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Libraries/Source/WWVegas/WWLib/always.h b/Core/Libraries/Source/WWVegas/WWLib/always.h index d63eeec2fb..3173ad5ab3 100644 --- a/Core/Libraries/Source/WWVegas/WWLib/always.h +++ b/Core/Libraries/Source/WWVegas/WWLib/always.h @@ -144,7 +144,7 @@ private: \ return The##ARGCLASS##Pool; \ } \ protected: \ - virtual int glueEnforcer() const { return sizeof(this); } \ + virtual int glueEnforcer() const { return sizeof(*this); } \ public: \ inline void* operator new(size_t s) { return allocateFromW3DMemPool(getClassMemoryPool(), s); } \ inline void operator delete(void *p) { freeFromW3DMemPool(getClassMemoryPool(), p); } \ From 68a637b4b8a17edaf9718d608e34b50284339370 Mon Sep 17 00:00:00 2001 From: bobtista Date: Fri, 5 Dec 2025 13:12:48 -0500 Subject: [PATCH 2/5] bugfix: fix sizeof(this) in BitFlags CRC calculation --- Generals/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h index 2d7be09044..c0d24a77d4 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,7 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values - xfer->xferUser( this, sizeof( this ) ); + xfer->xferUser( this, sizeof( *this ) ); } else diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h index 2c9d8ba8aa..950b48b9cc 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,7 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values - xfer->xferUser( this, sizeof( this ) ); + xfer->xferUser( this, sizeof( *this ) ); } else From 04ebb42fd4a4c0cfa72a3bc6bab06b5f2a7daf56 Mon Sep 17 00:00:00 2001 From: bobtista Date: Fri, 5 Dec 2025 13:22:37 -0500 Subject: [PATCH 3/5] compat: add RETAIL_COMPATIBLE_CRC flag for BitFlags sizeof fix --- Generals/Code/GameEngine/Include/Common/BitFlagsIO.h | 6 ++++++ GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h index c0d24a77d4..781d30ada0 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,13 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values + // TheSuperHackers @bugfix bobtista 05/12/2025 Fix sizeof(this) bug + // Original code used sizeof(this) which is pointer size +#ifndef RETAIL_COMPATIBLE_CRC xfer->xferUser( this, sizeof( *this ) ); +#else + xfer->xferUser( this, sizeof( this ) ); +#endif } else diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h index 950b48b9cc..4ae3fac9b3 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,13 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values + // TheSuperHackers @bugfix bobtista 05/12/2025 Fix sizeof(this) bug + // Original code used sizeof(this) which is pointer size +#ifndef RETAIL_COMPATIBLE_CRC xfer->xferUser( this, sizeof( *this ) ); +#else + xfer->xferUser( this, sizeof( this ) ); +#endif } else From 0e6a476c1d54588d55f6040997d0679404ca5711 Mon Sep 17 00:00:00 2001 From: bobtista Date: Fri, 5 Dec 2025 21:09:20 -0500 Subject: [PATCH 4/5] refactor: use RETAIL_COMPATIBLE_XFER_SAVE flag and change glueEnforcer to void --- Core/Libraries/Source/WWVegas/WWLib/always.h | 4 ++-- Generals/Code/GameEngine/Include/Common/BitFlagsIO.h | 8 +++----- GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h | 8 +++----- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Core/Libraries/Source/WWVegas/WWLib/always.h b/Core/Libraries/Source/WWVegas/WWLib/always.h index 3173ad5ab3..c58e6dd8e4 100644 --- a/Core/Libraries/Source/WWVegas/WWLib/always.h +++ b/Core/Libraries/Source/WWVegas/WWLib/always.h @@ -144,7 +144,7 @@ private: \ return The##ARGCLASS##Pool; \ } \ protected: \ - virtual int glueEnforcer() const { return sizeof(*this); } \ + virtual void glueEnforcer() const { } \ public: \ inline void* operator new(size_t s) { return allocateFromW3DMemPool(getClassMemoryPool(), s); } \ inline void operator delete(void *p) { freeFromW3DMemPool(getClassMemoryPool(), p); } \ @@ -162,7 +162,7 @@ class W3DMPO } protected: // we never call this; it is present to cause compile errors in descendent classes - virtual int glueEnforcer() const = 0; + virtual void glueEnforcer() const = 0; public: virtual ~W3DMPO() { /* nothing */ } }; diff --git a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h index 781d30ada0..58990f3bc4 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,12 +214,10 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values - // TheSuperHackers @bugfix bobtista 05/12/2025 Fix sizeof(this) bug - // Original code used sizeof(this) which is pointer size -#ifndef RETAIL_COMPATIBLE_CRC - xfer->xferUser( this, sizeof( *this ) ); -#else +#if RETAIL_COMPATIBLE_XFER_SAVE xfer->xferUser( this, sizeof( this ) ); +#else + xfer->xferUser( this, sizeof( *this ) ); #endif } diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h index 4ae3fac9b3..c87ae93e6b 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,12 +214,10 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values - // TheSuperHackers @bugfix bobtista 05/12/2025 Fix sizeof(this) bug - // Original code used sizeof(this) which is pointer size -#ifndef RETAIL_COMPATIBLE_CRC - xfer->xferUser( this, sizeof( *this ) ); -#else +#if RETAIL_COMPATIBLE_XFER_SAVE xfer->xferUser( this, sizeof( this ) ); +#else + xfer->xferUser( this, sizeof( *this ) ); #endif } From 0a0c27a39dd84b96970c4e89c1e25d48ed292052 Mon Sep 17 00:00:00 2001 From: Bobby Battista Date: Sat, 6 Dec 2025 10:46:53 -0500 Subject: [PATCH 5/5] use RETAIL_COMPATIBLE_CRC --- Generals/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h index 58990f3bc4..197c79f31f 100644 --- a/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/Generals/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,7 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values -#if RETAIL_COMPATIBLE_XFER_SAVE +#if RETAIL_COMPATIBLE_CRC xfer->xferUser( this, sizeof( this ) ); #else xfer->xferUser( this, sizeof( *this ) ); diff --git a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h index c87ae93e6b..f579652028 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/BitFlagsIO.h @@ -214,7 +214,7 @@ void BitFlags::xfer(Xfer* xfer) { // just call the xfer implementation on the data values -#if RETAIL_COMPATIBLE_XFER_SAVE +#if RETAIL_COMPATIBLE_CRC xfer->xferUser( this, sizeof( this ) ); #else xfer->xferUser( this, sizeof( *this ) );