clang-format: Fix use-heap-after-free bug.
authorDaniel Jasper <djasper@google.com>
Wed, 21 Jan 2015 17:35:29 +0000 (17:35 +0000)
committerDaniel Jasper <djasper@google.com>
Wed, 21 Jan 2015 17:35:29 +0000 (17:35 +0000)
Discovered by the awesome test case and ASAN.

llvm-svn: 226678

clang/lib/Format/TokenAnnotator.h
clang/unittests/Format/FormatTest.cpp

index ff8e32a..8aa163a 100644 (file)
@@ -59,11 +59,8 @@ public:
       I->Tok->Previous = Current;
       Current = Current->Next;
       Current->Children.clear();
-      for (SmallVectorImpl<UnwrappedLine>::const_iterator
-               I = Node.Children.begin(),
-               E = Node.Children.end();
-           I != E; ++I) {
-        Children.push_back(new AnnotatedLine(*I));
+      for (const auto& Child : Node.Children) {
+        Children.push_back(new AnnotatedLine(Child));
         Current->Children.push_back(Children.back());
       }
     }
@@ -75,6 +72,11 @@ public:
     for (unsigned i = 0, e = Children.size(); i != e; ++i) {
       delete Children[i];
     }
+    FormatToken *Current = First;
+    while (Current) {
+      Current->Children.clear();
+      Current = Current->Next;
+    }
   }
 
   FormatToken *First;
index 436835b..3aa5346 100644 (file)
@@ -2610,6 +2610,8 @@ TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
                getLLVMStyleWithColumns(28));
   verifyFormat("#d, = };");
   verifyFormat("#if \"a");
+
+  verifyNoCrash("#if a\na(\n#else\n#endif\n{a");
 }
 
 TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {