]> granicus.if.org Git - llvm/commitdiff
Fix use-after-frees
authorNicolai Haehnle <nhaehnle@gmail.com>
Fri, 14 Oct 2016 09:49:51 +0000 (09:49 +0000)
committerNicolai Haehnle <nhaehnle@gmail.com>
Fri, 14 Oct 2016 09:49:51 +0000 (09:49 +0000)
Extracted from D25313, as suggested by Justin Bogner.

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

include/llvm/CodeGen/SelectionDAGNodes.h
lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 1d14d1228ce26cb421ce9cec3e4a5c4eb53e923d..6a80e5ad8d225e106480af2026dfbbae9db044b1 100644 (file)
@@ -924,7 +924,10 @@ public:
 
 inline SDValue::SDValue(SDNode *node, unsigned resno)
     : Node(node), ResNo(resno) {
-  assert((!Node || ResNo < Node->getNumValues()) &&
+  // Explicitly check for !ResNo to avoid use-after-free, because there are
+  // callers that use SDValue(N, 0) with a deleted N to indicate successful
+  // combines.
+  assert((!Node || !ResNo || ResNo < Node->getNumValues()) &&
          "Invalid result number for the given node!");
   assert(ResNo < -2U && "Cannot use result numbers reserved for DenseMaps.");
 }
index da903764e10f13540eb7e3f802c6de64c8cabdc8..360ce8f1be0acb1cb29050fd518c24e6bfe2acea 100644 (file)
@@ -2262,8 +2262,8 @@ SDValue DAGCombiner::useDivRem(SDNode *Node) {
   SDValue Op1 = Node->getOperand(1);
   SDValue combined;
   for (SDNode::use_iterator UI = Op0.getNode()->use_begin(),
-         UE = Op0.getNode()->use_end(); UI != UE; ++UI) {
-    SDNode *User = *UI;
+         UE = Op0.getNode()->use_end(); UI != UE;) {
+    SDNode *User = *UI++;
     if (User == Node || User->use_empty())
       continue;
     // Convert the other matching node(s), too;