mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
SafeStack: Prevent OOB reads with mem intrinsics
Summary: Currently, the SafeStack analysis disallows out-of-bounds writes but not out-of-bounds reads for mem intrinsics like llvm.memcpy. This could cause leaks of pointers to the safe stack by leaking spilled registers/ frame pointers. Check for allocas used as source or destination pointers to mem intrinsics. Reviewers: eugenis Reviewed By: eugenis Subscribers: pcc, llvm-commits, kcc Differential Revision: https://reviews.llvm.org/D51334 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341116 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -260,8 +260,14 @@ bool SafeStack::IsAccessSafe(Value *Addr, uint64_t AccessSize,
|
||||
bool SafeStack::IsMemIntrinsicSafe(const MemIntrinsic *MI, const Use &U,
|
||||
const Value *AllocaPtr,
|
||||
uint64_t AllocaSize) {
|
||||
// All MemIntrinsics have destination address in Arg0 and size in Arg2.
|
||||
if (MI->getRawDest() != U) return true;
|
||||
if (auto MTI = dyn_cast<MemTransferInst>(MI)) {
|
||||
if (MTI->getRawSource() != U && MTI->getRawDest() != U)
|
||||
return true;
|
||||
} else {
|
||||
if (MI->getRawDest() != U)
|
||||
return true;
|
||||
}
|
||||
|
||||
const auto *Len = dyn_cast<ConstantInt>(MI->getLength());
|
||||
// Non-constant size => unsafe. FIXME: try SCEV getRange.
|
||||
if (!Len) return false;
|
||||
|
||||
Reference in New Issue
Block a user