[SelectionDAG] Fix use-after-free introduced in D130881
authorMarkus Böck <markus.boeck02@gmail.com>
Mon, 3 Oct 2022 13:09:14 +0000 (15:09 +0200)
committerMarkus Böck <markus.boeck02@gmail.com>
Mon, 3 Oct 2022 13:09:14 +0000 (15:09 +0200)
commit36af4c8418c1250faadeb8437bf13e460d606521
treee34b28f0a3265b877b0ccafda4f7633923742b3b
parent20a269cf774e774fb5c7194b1aebe24df27a233f
[SelectionDAG] Fix use-after-free introduced in D130881

The code introduced in https://reviews.llvm.org/D130881 has a bug as it may cause a use-after-free error that can be caught by ASAN.
The bug essentially boils down to iterator invalidation of `DenseMap`. The expression `SDEI[To] = I->second;` may cause `SDEI` to grow if `To` is inserted for the very first time. When that happens, all existing iterators to the map are invalidated as their backing storage has been freed. Accessing `I->second` is then invalid and attempts to access freed memory (as `I` is an iterator of `SDEI`).

This patch fixes that quite simply by first making a copy of `I->second`, and then moving into the possibly newly inserted KV of the ` DenseMap`.

No test attached as I am not sure it is practible to test.

Differential revision: https://reviews.llvm.org/D135019
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp