@@ -66,14 +66,12 @@ namespace PAuthGadgetScanner {
66
66
}
67
67
68
68
[[maybe_unused]] static void traceReg (const BinaryContext &BC, StringRef Label,
69
- ErrorOr< MCPhysReg> Reg) {
69
+ MCPhysReg Reg) {
70
70
dbgs () << " " << Label << " : " ;
71
- if (Reg.getError ())
72
- dbgs () << " (error)" ;
73
- else if (*Reg == BC.MIB ->getNoRegister ())
71
+ if (Reg == BC.MIB ->getNoRegister ())
74
72
dbgs () << " (none)" ;
75
73
else
76
- dbgs () << BC.MRI ->getName (* Reg);
74
+ dbgs () << BC.MRI ->getName (Reg);
77
75
dbgs () << " \n " ;
78
76
}
79
77
@@ -365,17 +363,15 @@ class SrcSafetyAnalysis {
365
363
SmallVector<MCPhysReg> getRegsMadeSafeToDeref (const MCInst &Point ,
366
364
const SrcState &Cur) const {
367
365
SmallVector<MCPhysReg> Regs;
368
- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
369
366
370
367
// A signed pointer can be authenticated, or
371
- ErrorOr<MCPhysReg> AutReg = BC. MIB -> getAuthenticatedReg ( Point ) ;
372
- if (AutReg && * AutReg != NoReg )
368
+ bool Dummy = false ;
369
+ if (auto AutReg = BC. MIB -> getWrittenAuthenticatedReg ( Point , Dummy) )
373
370
Regs.push_back (*AutReg);
374
371
375
372
// ... a safe address can be materialized, or
376
- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point );
377
- if (NewAddrReg != NoReg)
378
- Regs.push_back (NewAddrReg);
373
+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point ))
374
+ Regs.push_back (*NewAddrReg);
379
375
380
376
// ... an address can be updated in a safe manner, producing the result
381
377
// which is as trusted as the input address.
@@ -391,13 +387,20 @@ class SrcSafetyAnalysis {
391
387
SmallVector<MCPhysReg> getRegsMadeTrusted (const MCInst &Point ,
392
388
const SrcState &Cur) const {
393
389
SmallVector<MCPhysReg> Regs;
394
- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
395
390
396
391
// An authenticated pointer can be checked, or
397
- MCPhysReg CheckedReg =
392
+ std::optional< MCPhysReg> CheckedReg =
398
393
BC.MIB ->getAuthCheckedReg (Point , /* MayOverwrite=*/ false );
399
- if (CheckedReg != NoReg && Cur.SafeToDerefRegs [CheckedReg])
400
- Regs.push_back (CheckedReg);
394
+ if (CheckedReg && Cur.SafeToDerefRegs [*CheckedReg])
395
+ Regs.push_back (*CheckedReg);
396
+
397
+ // ... a pointer can be authenticated by an instruction that always checks
398
+ // the pointer, or
399
+ bool IsChecked = false ;
400
+ std::optional<MCPhysReg> AutReg =
401
+ BC.MIB ->getWrittenAuthenticatedReg (Point , IsChecked);
402
+ if (AutReg && IsChecked)
403
+ Regs.push_back (*AutReg);
401
404
402
405
if (CheckerSequenceInfo.contains (&Point )) {
403
406
MCPhysReg CheckedReg;
@@ -413,9 +416,8 @@ class SrcSafetyAnalysis {
413
416
}
414
417
415
418
// ... a safe address can be materialized, or
416
- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point );
417
- if (NewAddrReg != NoReg)
418
- Regs.push_back (NewAddrReg);
419
+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point ))
420
+ Regs.push_back (*NewAddrReg);
419
421
420
422
// ... an address can be updated in a safe manner, producing the result
421
423
// which is as trusted as the input address.
@@ -738,25 +740,27 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
738
740
if (!BC.MIB ->isReturn (Inst))
739
741
return std::nullopt;
740
742
741
- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
742
- if (MaybeRetReg.getError ()) {
743
+ bool IsAuthenticated = false ;
744
+ std::optional<MCPhysReg> RetReg =
745
+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
746
+ if (!RetReg) {
743
747
return make_generic_report (
744
748
Inst, " Warning: pac-ret analysis could not analyze this return "
745
749
" instruction" );
746
750
}
747
- MCPhysReg RetReg = *MaybeRetReg;
751
+ if (IsAuthenticated)
752
+ return std::nullopt;
753
+
748
754
LLVM_DEBUG ({
749
755
traceInst (BC, " Found RET inst" , Inst);
750
- traceReg (BC, " RetReg" , RetReg);
751
- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
756
+ traceReg (BC, " RetReg" , * RetReg);
757
+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
752
758
});
753
- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
754
- return std::nullopt;
755
- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
756
- if (S.SafeToDerefRegs [RetReg])
759
+
760
+ if (S.SafeToDerefRegs [*RetReg])
757
761
return std::nullopt;
758
762
759
- return make_gadget_report (RetKind, Inst, RetReg);
763
+ return make_gadget_report (RetKind, Inst, * RetReg);
760
764
}
761
765
762
766
static std::optional<PartialReport<MCPhysReg>>
@@ -772,7 +776,7 @@ shouldReportCallGadget(const BinaryContext &BC, const MCInstReference &Inst,
772
776
if (IsAuthenticated)
773
777
return std::nullopt;
774
778
775
- assert (DestReg != BC.MIB ->getNoRegister ());
779
+ assert (DestReg != BC.MIB ->getNoRegister () && " Valid register expected " );
776
780
LLVM_DEBUG ({
777
781
traceInst (BC, " Found call inst" , Inst);
778
782
traceReg (BC, " Call destination reg" , DestReg);
@@ -789,19 +793,19 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
789
793
const SrcState &S) {
790
794
static const GadgetKind SigningOracleKind (" signing oracle found" );
791
795
792
- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
793
- if (SignedReg == BC. MIB -> getNoRegister () )
796
+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
797
+ if (! SignedReg)
794
798
return std::nullopt;
795
799
796
800
LLVM_DEBUG ({
797
801
traceInst (BC, " Found sign inst" , Inst);
798
- traceReg (BC, " Signed reg" , SignedReg);
802
+ traceReg (BC, " Signed reg" , * SignedReg);
799
803
traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
800
804
});
801
- if (S.TrustedRegs [SignedReg])
805
+ if (S.TrustedRegs [* SignedReg])
802
806
return std::nullopt;
803
807
804
- return make_gadget_report (SigningOracleKind, Inst, SignedReg);
808
+ return make_gadget_report (SigningOracleKind, Inst, * SignedReg);
805
809
}
806
810
807
811
template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments