OSDN Git Service

Fix use after free when deleting attributes in a chained folding set.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 14 Oct 2012 08:48:40 +0000 (08:48 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 14 Oct 2012 08:48:40 +0000 (08:48 +0000)
Can't follow the intrusive linked list when the element is gone.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165898 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/LLVMContextImpl.cpp

index a86363b..74247bd 100644 (file)
@@ -97,9 +97,11 @@ LLVMContextImpl::~LLVMContextImpl() {
 
   // Destroy attributes.
   for (FoldingSetIterator<AttributesImpl> I = AttrsSet.begin(),
-         E = AttrsSet.end(); I != E; ++I)
-    delete &*I;
-  
+         E = AttrsSet.end(); I != E;) {
+    FoldingSetIterator<AttributesImpl> Elem = I++;
+    delete &*Elem;
+  }
+
   // Destroy MDNodes.  ~MDNode can move and remove nodes between the MDNodeSet
   // and the NonUniquedMDNodes sets, so copy the values out first.
   SmallVector<MDNode*, 8> MDNodes;