From 152dc613483672b8535c9095e24bf0d18104ec45 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 31 Aug 2015 22:36:45 +0100 Subject: Fix exception message corruption. Using the c_str() of a std::string after the string has been freed is unsafe and can lead to corrupted error messages in tests, or worse. --- lib/common/makeexception.pl.in | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'lib/common') diff --git a/lib/common/makeexception.pl.in b/lib/common/makeexception.pl.in index e4018180..498c81b8 100755 --- a/lib/common/makeexception.pl.in +++ b/lib/common/makeexception.pl.in @@ -117,6 +117,7 @@ print H <<__E; private: unsigned int mSubType; std::string mMessage; + std::string mWhat; }; #endif // $guardname @@ -190,21 +191,15 @@ unsigned int ${class}Exception::GetSubType() const throw() const char * ${class}Exception::what() const throw() { - std::string what = "${class}"; - -#ifdef EXCEPTION_CODENAMES_EXTENDED - if(mSubType < (sizeof(whats) / sizeof(whats[0]))) - { - what = whats[mSubType]; - } -#endif + // We need to use a string that will persist after this function exits. + mWhat = GetMessage(mSubType); if(mMessage != "") { - what += ": " + mMessage; + mWhat += ": " + mMessage; } - return what.c_str(); + return mWhat.c_str(); } const char * ${class}Exception::GetMessage(int SubType) -- cgit v1.2.3 From 9dec71921ebc777cc9e29e6e0aee60593cb2600e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 2 Sep 2015 21:05:35 +0100 Subject: Really fix makeexception.pl.in this time --- lib/common/makeexception.pl.in | 58 +++--------------------------------------- 1 file changed, 3 insertions(+), 55 deletions(-) (limited to 'lib/common') diff --git a/lib/common/makeexception.pl.in b/lib/common/makeexception.pl.in index 498c81b8..bddaa94a 100755 --- a/lib/common/makeexception.pl.in +++ b/lib/common/makeexception.pl.in @@ -73,12 +73,13 @@ class ${class}Exception : public BoxException public: ${class}Exception(unsigned int SubType, const std::string& rMessage = "") - : mSubType(SubType), mMessage(rMessage) + : mSubType(SubType), mMessage(rMessage), + mWhat(GetMessage(SubType) + std::string(rMessage.empty() ? "" : ": ") + rMessage) { } ${class}Exception(const ${class}Exception &rToCopy) - : mSubType(rToCopy.mSubType), mMessage(rToCopy.mMessage) + : mSubType(rToCopy.mSubType), mMessage(rToCopy.mMessage), mWhat(rToCopy.mWhat) { } @@ -134,51 +135,6 @@ print CPP <<__E; #include "MemLeakFindOn.h" -#ifdef EXCEPTION_CODENAMES_EXTENDED - #ifdef EXCEPTION_CODENAMES_EXTENDED_WITH_DESCRIPTION -static const char *whats[] = { -__E - -my $last_seen = -1; -for(my $e = 0; $e <= $#exception; $e++) -{ - if($exception[$e] ne '') - { - for(my $s = $last_seen + 1; $s < $e; $s++) - { - print CPP "\t\"UNUSED\",\n" - } - my $ext = ($exception_desc[$e] ne '')?" ($exception_desc[$e])":''; - print CPP "\t\"${class} ".$exception[$e].$ext.'"'.(($e==$#exception)?'':',')."\n"; - $last_seen = $e; - } -} - -print CPP <<__E; -}; - #else -static const char *whats[] = { -__E - -$last_seen = -1; -for(my $e = 0; $e <= $#exception; $e++) -{ - if($exception[$e] ne '') - { - for(my $s = $last_seen + 1; $s < $e; $s++) - { - print CPP "\t\"UNUSED\",\n" - } - print CPP "\t\"${class} ".$exception[$e].'"'.(($e==$#exception)?'':',')."\n"; - $last_seen = $e; - } -} - -print CPP <<__E; -}; - #endif -#endif - unsigned int ${class}Exception::GetType() const throw() { return ${class}Exception::ExceptionType; @@ -191,14 +147,6 @@ unsigned int ${class}Exception::GetSubType() const throw() const char * ${class}Exception::what() const throw() { - // We need to use a string that will persist after this function exits. - mWhat = GetMessage(mSubType); - - if(mMessage != "") - { - mWhat += ": " + mMessage; - } - return mWhat.c_str(); } -- cgit v1.2.3