Browse Source

add_custom_command: Manage backtrace memory correctly (#14299)

Add an assignment operator to cmCustomCommand to copy the Backtrace
member pointee and avoid multiple-free on destruction.

Reported-by: Vitezslav Cizek <[email protected]>
Brad King 12 years ago
parent
commit
17c841c42d
2 changed files with 29 additions and 0 deletions
  1. 28 0
      Source/cmCustomCommand.cxx
  2. 1 0
      Source/cmCustomCommand.h

+ 28 - 0
Source/cmCustomCommand.cxx

@@ -13,6 +13,8 @@
 
 #include "cmMakefile.h"
 
+#include <cmsys/auto_ptr.hxx>
+
 //----------------------------------------------------------------------------
 cmCustomCommand::cmCustomCommand()
 {
@@ -35,6 +37,32 @@ cmCustomCommand::cmCustomCommand(const cmCustomCommand& r):
 {
 }
 
+//----------------------------------------------------------------------------
+cmCustomCommand& cmCustomCommand::operator=(cmCustomCommand const& r)
+{
+  if(this == &r)
+    {
+    return *this;
+    }
+
+  this->Outputs = r.Outputs;
+  this->Depends = r.Depends;
+  this->CommandLines = r.CommandLines;
+  this->HaveComment = r.HaveComment;
+  this->Comment = r.Comment;
+  this->WorkingDirectory = r.WorkingDirectory;
+  this->EscapeAllowMakeVars = r.EscapeAllowMakeVars;
+  this->EscapeOldStyle = r.EscapeOldStyle;
+  this->ImplicitDepends = r.ImplicitDepends;
+
+  cmsys::auto_ptr<cmListFileBacktrace>
+    newBacktrace(new cmListFileBacktrace(*r.Backtrace));
+  delete this->Backtrace;
+  this->Backtrace = newBacktrace.release();
+
+  return *this;
+}
+
 //----------------------------------------------------------------------------
 cmCustomCommand::cmCustomCommand(cmMakefile* mf,
                                  const std::vector<std::string>& outputs,

+ 1 - 0
Source/cmCustomCommand.h

@@ -27,6 +27,7 @@ public:
   /** Default and copy constructors for STL containers.  */
   cmCustomCommand();
   cmCustomCommand(const cmCustomCommand& r);
+  cmCustomCommand& operator=(cmCustomCommand const& r);
 
   /** Main constructor specifies all information for the command.  */
   cmCustomCommand(cmMakefile* mf,