[PATCH] Inconsistency in Preprocessor::ReleaseMacroInfo(MacroInfo *MI)

Vassil Vassilev vvasilev at cern.ch
Sat Aug 2 13:05:44 PDT 2014


Hi,
   In cases where ReleaseMacroInfo gets called and it doesn't cleanup 
the Preprocessor's MIChainHead can lead to double deletion. I am sending 
the patch that fixes the problem for me.
Vassil


diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
index 5f38387..1a9b5eb 100644
--- a/lib/Lex/PPDirectives.cpp
+++ b/lib/Lex/PPDirectives.cpp
@@ -94,6 +94,14 @@ 
Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
  /// error in the macro definition.
  void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
    // Don't try to reuse the storage; this only happens on error paths.
+
+  // If this is on the macro info chain, avoid double deletion on teardown.
+  while (MacroInfoChain *I = MIChainHead) {
+    if (&(I->MI) == MI)
+      I->Next = (I->Next) ? I->Next->Next : 0;
+    MIChainHead = I->Next;
+  }
+
    MI->~MacroInfo();
  }




More information about the cfe-commits mailing list