On Tue, Jul 30, 2024 at 5:15 AM Hemraj, Deepthi via lists.openembedded.org <Deepthi.Hemraj=windriver....@lists.openembedded.org> wrote: > > From: Deepthi Hemraj <deepthi.hem...@windriver.com> > > Signed-off-by: Deepthi Hemraj <deepthi.hem...@windriver.com> > --- > .../llvm/0008-llvm-Fix-CVE-2024-31852-1.patch | 85 +++++++++++++ > .../llvm/0009-llvm-Fix-CVE-2024-31852-2.patch | 117 ++++++++++++++++++ > meta/recipes-devtools/llvm/llvm_git.bb | 2 + > 3 files changed, 204 insertions(+) > create mode 100644 > meta/recipes-devtools/llvm/llvm/0008-llvm-Fix-CVE-2024-31852-1.patch > create mode 100644 > meta/recipes-devtools/llvm/llvm/0009-llvm-Fix-CVE-2024-31852-2.patch
Preferred filenames would be just CVE-2024-31852-1.patch and CVE-2024-31852-2.patch No need to send a V2 as I've fixed this on my end. Thanks! Steve > > diff --git > a/meta/recipes-devtools/llvm/llvm/0008-llvm-Fix-CVE-2024-31852-1.patch > b/meta/recipes-devtools/llvm/llvm/0008-llvm-Fix-CVE-2024-31852-1.patch > new file mode 100644 > index 0000000000..7cf4a52715 > --- /dev/null > +++ b/meta/recipes-devtools/llvm/llvm/0008-llvm-Fix-CVE-2024-31852-1.patch > @@ -0,0 +1,85 @@ > +commit b1a5ee1febd8a903cec3dfdad61d57900dc3823e > +Author: Florian Hahn <f...@fhahn.com> > +Date: Wed Dec 20 16:56:15 2023 +0100 > + > + [ARM] Check all terms in emitPopInst when clearing Restored for LR. > (#75527) > + > + emitPopInst checks a single function exit MBB. If other paths also exit > + the function and any of there terminators uses LR implicitly, it is not > + save to clear the Restored bit. > + > + Check all terminators for the function before clearing Restored. > + > + This fixes a mis-compile in outlined-fn-may-clobber-lr-in-caller.ll > + where the machine-outliner previously introduced BLs that clobbered LR > + which in turn is used by the tail call return. > + > + Alternative to #73553 > + > +Upstream-Status: Backport > [https://github.com/llvm/llvm-project/commit/b1a5ee1febd8a903cec3dfdad61d57900dc3823e] > +CVE: CVE-2024-31852 > +Signed-off-by: Deepthi Hemraj <deepthi.hem...@windriver.com> > +--- > +diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp > b/llvm/lib/Target/ARM/ARMFrameLowering.cpp > +index 025e43444f9c..a9acf338ebf5 100644 > +--- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp > ++++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp > +@@ -1236,9 +1236,6 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock > &MBB, > + // Fold the return instruction into the LDM. > + DeleteRet = true; > + LdmOpc = AFI->isThumbFunction() ? ARM::t2LDMIA_RET : ARM::LDMIA_RET; > +- // We 'restore' LR into PC so it is not live out of the return > block: > +- // Clear Restored bit. > +- Info.setRestored(false); > + } > + > + // If NoGap is true, pop consecutive registers and then leave the rest > +@@ -2292,6 +2289,33 @@ void > ARMFrameLowering::determineCalleeSaves(MachineFunction &MF, > + AFI->setLRIsSpilled(SavedRegs.test(ARM::LR)); > + } > + > ++void ARMFrameLowering::processFunctionBeforeFrameFinalized( > ++ MachineFunction &MF, RegScavenger *RS) const { > ++ TargetFrameLowering::processFunctionBeforeFrameFinalized(MF, RS); > ++ > ++ MachineFrameInfo &MFI = MF.getFrameInfo(); > ++ if (!MFI.isCalleeSavedInfoValid()) > ++ return; > ++ > ++ // Check if all terminators do not implicitly use LR. Then we can > 'restore' LR > ++ // into PC so it is not live out of the return block: Clear the Restored > bit > ++ // in that case. > ++ for (CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) { > ++ if (Info.getReg() != ARM::LR) > ++ continue; > ++ if (all_of(MF, [](const MachineBasicBlock &MBB) { > ++ return all_of(MBB.terminators(), [](const MachineInstr &Term) { > ++ return !Term.isReturn() || Term.getOpcode() == ARM::LDMIA_RET || > ++ Term.getOpcode() == ARM::t2LDMIA_RET || > ++ Term.getOpcode() == ARM::tPOP_RET; > ++ }); > ++ })) { > ++ Info.setRestored(false); > ++ break; > ++ } > ++ } > ++} > ++ > + void ARMFrameLowering::getCalleeSaves(const MachineFunction &MF, > + BitVector &SavedRegs) const { > + TargetFrameLowering::getCalleeSaves(MF, SavedRegs); > +diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.h > b/llvm/lib/Target/ARM/ARMFrameLowering.h > +index 9822e2321bb4..266d642bb97b 100644 > +--- a/llvm/lib/Target/ARM/ARMFrameLowering.h > ++++ b/llvm/lib/Target/ARM/ARMFrameLowering.h > +@@ -58,6 +58,9 @@ public: > + void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, > + RegScavenger *RS) const override; > + > ++ void processFunctionBeforeFrameFinalized( > ++ MachineFunction &MF, RegScavenger *RS = nullptr) const > override; > ++ > + void adjustForSegmentedStacks(MachineFunction &MF, > + MachineBasicBlock &MBB) const override; > + > + > diff --git > a/meta/recipes-devtools/llvm/llvm/0009-llvm-Fix-CVE-2024-31852-2.patch > b/meta/recipes-devtools/llvm/llvm/0009-llvm-Fix-CVE-2024-31852-2.patch > new file mode 100644 > index 0000000000..b6082b0ef3 > --- /dev/null > +++ b/meta/recipes-devtools/llvm/llvm/0009-llvm-Fix-CVE-2024-31852-2.patch > @@ -0,0 +1,117 @@ > +commit 0e16af8e4cf3a66ad5d078d52744ae2776f9c4b2 > +Author: ostannard <oliver.stann...@arm.com> > +Date: Mon Feb 26 12:23:25 2024 +0000 > + > + [ARM] Update IsRestored for LR based on all returns (#82745) > + > + PR #75527 fixed ARMFrameLowering to set the IsRestored flag for LR based > + on all of the return instructions in the function, not just one. > + However, there is also code in ARMLoadStoreOptimizer which changes > + return instructions, but it set IsRestored based on the one instruction > + it changed, not the whole function. > + > + The fix is to factor out the code added in #75527, and also call it from > + ARMLoadStoreOptimizer if it made a change to return instructions. > + > + Fixes #80287. > + > + (cherry picked from commit 749384c08e042739342c88b521c8ba5dac1b9276) > + > +Upstream-Status: Backport > [https://github.com/llvm/llvm-project/commit/0e16af8e4cf3a66ad5d078d52744ae2776f9c4b2] > +CVE: CVE-2024-31852 > +Signed-off-by: Deepthi Hemraj <deepthi.hem...@windriver.com> > +--- > +diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp > b/llvm/lib/Target/ARM/ARMFrameLowering.cpp > +index a9acf338ebf5..13d3cbf650ed 100644 > +--- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp > ++++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp > +@@ -2289,10 +2289,7 @@ void > ARMFrameLowering::determineCalleeSaves(MachineFunction &MF, > + AFI->setLRIsSpilled(SavedRegs.test(ARM::LR)); > + } > + > +-void ARMFrameLowering::processFunctionBeforeFrameFinalized( > +- MachineFunction &MF, RegScavenger *RS) const { > +- TargetFrameLowering::processFunctionBeforeFrameFinalized(MF, RS); > +- > ++void ARMFrameLowering::updateLRRestored(MachineFunction &MF) { > + MachineFrameInfo &MFI = MF.getFrameInfo(); > + if (!MFI.isCalleeSavedInfoValid()) > + return; > +@@ -2316,6 +2313,12 @@ void > ARMFrameLowering::processFunctionBeforeFrameFinalized( > + } > + } > + > ++void ARMFrameLowering::processFunctionBeforeFrameFinalized( > ++ MachineFunction &MF, RegScavenger *RS) const { > ++ TargetFrameLowering::processFunctionBeforeFrameFinalized(MF, RS); > ++ updateLRRestored(MF); > ++} > ++ > + void ARMFrameLowering::getCalleeSaves(const MachineFunction &MF, > + BitVector &SavedRegs) const { > + TargetFrameLowering::getCalleeSaves(MF, SavedRegs); > +diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.h > b/llvm/lib/Target/ARM/ARMFrameLowering.h > +index 67505b61a5e1..b13b76d7086c 100644 > +--- a/llvm/lib/Target/ARM/ARMFrameLowering.h > ++++ b/llvm/lib/Target/ARM/ARMFrameLowering.h > +@@ -58,6 +58,10 @@ public: > + void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, > + RegScavenger *RS) const override; > + > ++ /// Update the IsRestored flag on LR if it is spilled, based on the return > ++ /// instructions. > ++ static void updateLRRestored(MachineFunction &MF); > ++ > + void processFunctionBeforeFrameFinalized( > + MachineFunction &MF, RegScavenger *RS = nullptr) const > override; > + > +diff --git a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp > b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp > +index fd06bfdf352c..561c1396190d 100644 > +--- a/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp > ++++ b/llvm/lib/Target/ARM/ARMLoadStoreOptimizer.cpp > +@@ -2060,17 +2060,6 @@ bool > ARMLoadStoreOpt::MergeReturnIntoLDM(MachineBasicBlock &MBB) { > + MO.setReg(ARM::PC); > + PrevMI.copyImplicitOps(*MBB.getParent(), *MBBI); > + MBB.erase(MBBI); > +- // We now restore LR into PC so it is not live-out of the return block > +- // anymore: Clear the CSI Restored bit. > +- MachineFrameInfo &MFI = MBB.getParent()->getFrameInfo(); > +- // CSI should be fixed after PrologEpilog Insertion > +- assert(MFI.isCalleeSavedInfoValid() && "CSI should be valid"); > +- for (CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) { > +- if (Info.getReg() == ARM::LR) { > +- Info.setRestored(false); > +- break; > +- } > +- } > + return true; > + } > + } > +@@ -2118,16 +2107,24 @@ bool > ARMLoadStoreOpt::runOnMachineFunction(MachineFunction &Fn) { > + isThumb2 = AFI->isThumb2Function(); > + isThumb1 = AFI->isThumbFunction() && !isThumb2; > + > +- bool Modified = false; > ++ bool Modified = false, ModifiedLDMReturn = false; > + for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E; > + ++MFI) { > + MachineBasicBlock &MBB = *MFI; > + Modified |= LoadStoreMultipleOpti(MBB); > + if (STI->hasV5TOps()) > +- Modified |= MergeReturnIntoLDM(MBB); > ++ ModifiedLDMReturn |= MergeReturnIntoLDM(MBB); > + if (isThumb1) > + Modified |= CombineMovBx(MBB); > + } > ++ Modified |= ModifiedLDMReturn; > ++ > ++ // If we merged a BX instruction into an LDM, we need to re-calculate > whether > ++ // LR is restored. This check needs to consider the whole function, not > just > ++ // the instruction(s) we changed, because there may be other BX returns > which > ++ // still need LR to be restored. > ++ if (ModifiedLDMReturn) > ++ ARMFrameLowering::updateLRRestored(Fn); > + > + Allocator.DestroyAll(); > + return Modified; > + > diff --git a/meta/recipes-devtools/llvm/llvm_git.bb > b/meta/recipes-devtools/llvm/llvm_git.bb > index cedbfb138e..d342da649a 100644 > --- a/meta/recipes-devtools/llvm/llvm_git.bb > +++ b/meta/recipes-devtools/llvm/llvm_git.bb > @@ -33,6 +33,8 @@ SRC_URI = > "git://github.com/llvm/llvm-project.git;branch=${BRANCH};protocol=http > > file://0007-llvm-allow-env-override-of-exe-path.patch;striplevel=2 \ > > file://0001-AsmMatcherEmitter-sort-ClassInfo-lists-by-name-as-we.patch;striplevel=2 > \ > > file://0001-Support-Add-missing-cstdint-header-to-Signals.h.patch;striplevel=2 > \ > + file://0008-llvm-Fix-CVE-2024-31852-1.patch;striplevel=2 \ > + file://0009-llvm-Fix-CVE-2024-31852-2.patch;striplevel=2 \ > " > > UPSTREAM_CHECK_GITTAGREGEX = "llvmorg-(?P<pver>\d+(\.\d+)+)" > -- > 2.43.0 > > > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#202676): https://lists.openembedded.org/g/openembedded-core/message/202676 Mute This Topic: https://lists.openembedded.org/mt/107626200/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-