@@ -27,6 +27,8 @@ use crate::prctl::{
2727} ;
2828use crate :: utils:: as_ptr;
2929
30+ use super :: CapabilitySet ;
31+
3032//
3133// PR_GET_KEEPCAPS/PR_SET_KEEPCAPS
3234//
@@ -178,6 +180,7 @@ pub fn set_secure_computing_mode(mode: SecureComputingMode) -> io::Result<()> {
178180const PR_CAPBSET_READ : c_int = 23 ;
179181
180182/// Linux per-thread capability.
183+ #[ deprecated( since = "1.1.0" , note = "Use CapabilitySet with a single bit instead" ) ]
181184#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
182185#[ repr( u32 ) ]
183186#[ non_exhaustive]
@@ -383,6 +386,75 @@ pub enum Capability {
383386 CheckpointRestore = linux_raw_sys:: general:: CAP_CHECKPOINT_RESTORE ,
384387}
385388
389+ mod private {
390+ pub trait Sealed { }
391+ pub struct Token ;
392+
393+ #[ allow( deprecated) ]
394+ impl Sealed for crate :: thread:: Capability { }
395+ impl Sealed for crate :: thread:: CapabilitySet { }
396+ }
397+ /// Compatibility trait to keep existing code that uses the deprecated [`Capability`] type working.
398+ ///
399+ /// This trait and its methods are sealed. It must not be used downstream.
400+ pub trait CompatCapability : private:: Sealed + Copy {
401+ #[ doc( hidden) ]
402+ fn as_capability_set ( self , _: private:: Token ) -> CapabilitySet ;
403+ }
404+ #[ allow( deprecated) ]
405+ impl CompatCapability for Capability {
406+ fn as_capability_set ( self , _: private:: Token ) -> CapabilitySet {
407+ match self {
408+ Self :: ChangeOwnership => CapabilitySet :: CHOWN ,
409+ Self :: DACOverride => CapabilitySet :: DAC_OVERRIDE ,
410+ Self :: DACReadSearch => CapabilitySet :: DAC_READ_SEARCH ,
411+ Self :: FileOwner => CapabilitySet :: FOWNER ,
412+ Self :: FileSetID => CapabilitySet :: FSETID ,
413+ Self :: Kill => CapabilitySet :: KILL ,
414+ Self :: SetGroupID => CapabilitySet :: SETGID ,
415+ Self :: SetUserID => CapabilitySet :: SETUID ,
416+ Self :: SetPermittedCapabilities => CapabilitySet :: SETPCAP ,
417+ Self :: LinuxImmutable => CapabilitySet :: LINUX_IMMUTABLE ,
418+ Self :: NetBindService => CapabilitySet :: NET_BIND_SERVICE ,
419+ Self :: NetBroadcast => CapabilitySet :: NET_BROADCAST ,
420+ Self :: NetAdmin => CapabilitySet :: NET_ADMIN ,
421+ Self :: NetRaw => CapabilitySet :: NET_RAW ,
422+ Self :: IPCLock => CapabilitySet :: IPC_LOCK ,
423+ Self :: IPCOwner => CapabilitySet :: IPC_OWNER ,
424+ Self :: SystemModule => CapabilitySet :: SYS_MODULE ,
425+ Self :: SystemRawIO => CapabilitySet :: SYS_RAWIO ,
426+ Self :: SystemChangeRoot => CapabilitySet :: SYS_CHROOT ,
427+ Self :: SystemProcessTrace => CapabilitySet :: SYS_PTRACE ,
428+ Self :: SystemProcessAccounting => CapabilitySet :: SYS_PACCT ,
429+ Self :: SystemAdmin => CapabilitySet :: SYS_ADMIN ,
430+ Self :: SystemBoot => CapabilitySet :: SYS_BOOT ,
431+ Self :: SystemNice => CapabilitySet :: SYS_NICE ,
432+ Self :: SystemResource => CapabilitySet :: SYS_RESOURCE ,
433+ Self :: SystemTime => CapabilitySet :: SYS_TIME ,
434+ Self :: SystemTTYConfig => CapabilitySet :: SYS_TTY_CONFIG ,
435+ Self :: MakeNode => CapabilitySet :: MKNOD ,
436+ Self :: Lease => CapabilitySet :: LEASE ,
437+ Self :: AuditWrite => CapabilitySet :: AUDIT_WRITE ,
438+ Self :: AuditControl => CapabilitySet :: AUDIT_CONTROL ,
439+ Self :: SetFileCapabilities => CapabilitySet :: SETFCAP ,
440+ Self :: MACOverride => CapabilitySet :: MAC_OVERRIDE ,
441+ Self :: MACAdmin => CapabilitySet :: MAC_ADMIN ,
442+ Self :: SystemLog => CapabilitySet :: SYSLOG ,
443+ Self :: WakeAlarm => CapabilitySet :: WAKE_ALARM ,
444+ Self :: BlockSuspend => CapabilitySet :: BLOCK_SUSPEND ,
445+ Self :: AuditRead => CapabilitySet :: AUDIT_READ ,
446+ Self :: PerformanceMonitoring => CapabilitySet :: PERFMON ,
447+ Self :: BerkeleyPacketFilters => CapabilitySet :: BPF ,
448+ Self :: CheckpointRestore => CapabilitySet :: CHECKPOINT_RESTORE ,
449+ }
450+ }
451+ }
452+ impl CompatCapability for CapabilitySet {
453+ fn as_capability_set ( self , _: private:: Token ) -> CapabilitySet {
454+ self
455+ }
456+ }
457+
386458/// Check if the specified capability is in the calling thread's capability
387459/// bounding set.
388460///
@@ -391,8 +463,14 @@ pub enum Capability {
391463///
392464/// [`prctl(PR_CAPBSET_READ,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
393465#[ inline]
394- pub fn capability_is_in_bounding_set ( capability : Capability ) -> io:: Result < bool > {
395- unsafe { prctl_2args ( PR_CAPBSET_READ , capability as usize as * mut _ ) } . map ( |r| r != 0 )
466+ pub fn capability_is_in_bounding_set ( capability : impl CompatCapability ) -> io:: Result < bool > {
467+ unsafe {
468+ prctl_2args (
469+ PR_CAPBSET_READ ,
470+ capability. as_capability_set ( private:: Token ) . bits ( ) as usize as * mut _ ,
471+ )
472+ }
473+ . map ( |r| r != 0 )
396474}
397475
398476const PR_CAPBSET_DROP : c_int = 24 ;
@@ -406,8 +484,14 @@ const PR_CAPBSET_DROP: c_int = 24;
406484///
407485/// [`prctl(PR_CAPBSET_DROP,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
408486#[ inline]
409- pub fn remove_capability_from_bounding_set ( capability : Capability ) -> io:: Result < ( ) > {
410- unsafe { prctl_2args ( PR_CAPBSET_DROP , capability as usize as * mut _ ) } . map ( |_r| ( ) )
487+ pub fn remove_capability_from_bounding_set ( capability : impl CompatCapability ) -> io:: Result < ( ) > {
488+ unsafe {
489+ prctl_2args (
490+ PR_CAPBSET_DROP ,
491+ capability. as_capability_set ( private:: Token ) . bits ( ) as usize as * mut _ ,
492+ )
493+ }
494+ . map ( |_r| ( ) )
411495}
412496
413497//
@@ -608,8 +692,8 @@ const PR_CAP_AMBIENT_IS_SET: usize = 1;
608692///
609693/// [`prctl(PR_CAP_AMBIENT,PR_CAP_AMBIENT_IS_SET,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
610694#[ inline]
611- pub fn capability_is_in_ambient_set ( capability : Capability ) -> io:: Result < bool > {
612- let cap = capability as usize as * mut _ ;
695+ pub fn capability_is_in_ambient_set ( capability : impl CompatCapability ) -> io:: Result < bool > {
696+ let cap = capability. as_capability_set ( private :: Token ) . bits ( ) as usize as * mut _ ;
613697 unsafe { prctl_3args ( PR_CAP_AMBIENT , PR_CAP_AMBIENT_IS_SET as * mut _ , cap) } . map ( |r| r != 0 )
614698}
615699
@@ -636,13 +720,16 @@ const PR_CAP_AMBIENT_LOWER: usize = 3;
636720///
637721/// [`prctl(PR_CAP_AMBIENT,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
638722#[ inline]
639- pub fn configure_capability_in_ambient_set ( capability : Capability , enable : bool ) -> io:: Result < ( ) > {
723+ pub fn configure_capability_in_ambient_set (
724+ capability : impl CompatCapability ,
725+ enable : bool ,
726+ ) -> io:: Result < ( ) > {
640727 let sub_operation = if enable {
641728 PR_CAP_AMBIENT_RAISE
642729 } else {
643730 PR_CAP_AMBIENT_LOWER
644731 } ;
645- let cap = capability as usize as * mut _ ;
732+ let cap = capability. as_capability_set ( private :: Token ) . bits ( ) as usize as * mut _ ;
646733
647734 unsafe { prctl_3args ( PR_CAP_AMBIENT , sub_operation as * mut _ , cap) } . map ( |_r| ( ) )
648735}
0 commit comments