@@ -27,6 +27,8 @@ use crate::prctl::{
27
27
} ;
28
28
use crate :: utils:: as_ptr;
29
29
30
+ use super :: CapabilitySet ;
31
+
30
32
//
31
33
// PR_GET_KEEPCAPS/PR_SET_KEEPCAPS
32
34
//
@@ -178,6 +180,7 @@ pub fn set_secure_computing_mode(mode: SecureComputingMode) -> io::Result<()> {
178
180
const PR_CAPBSET_READ : c_int = 23 ;
179
181
180
182
/// Linux per-thread capability.
183
+ #[ deprecated( since = "1.1.0" , note = "Use CapabilitySet with a single bit instead" ) ]
181
184
#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
182
185
#[ repr( u32 ) ]
183
186
#[ non_exhaustive]
@@ -383,6 +386,75 @@ pub enum Capability {
383
386
CheckpointRestore = linux_raw_sys:: general:: CAP_CHECKPOINT_RESTORE ,
384
387
}
385
388
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
+
386
458
/// Check if the specified capability is in the calling thread's capability
387
459
/// bounding set.
388
460
///
@@ -391,8 +463,14 @@ pub enum Capability {
391
463
///
392
464
/// [`prctl(PR_CAPBSET_READ,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
393
465
#[ 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 )
396
474
}
397
475
398
476
const PR_CAPBSET_DROP : c_int = 24 ;
@@ -406,8 +484,14 @@ const PR_CAPBSET_DROP: c_int = 24;
406
484
///
407
485
/// [`prctl(PR_CAPBSET_DROP,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
408
486
#[ 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| ( ) )
411
495
}
412
496
413
497
//
@@ -608,8 +692,8 @@ const PR_CAP_AMBIENT_IS_SET: usize = 1;
608
692
///
609
693
/// [`prctl(PR_CAP_AMBIENT,PR_CAP_AMBIENT_IS_SET,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
610
694
#[ 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 _ ;
613
697
unsafe { prctl_3args ( PR_CAP_AMBIENT , PR_CAP_AMBIENT_IS_SET as * mut _ , cap) } . map ( |r| r != 0 )
614
698
}
615
699
@@ -636,13 +720,16 @@ const PR_CAP_AMBIENT_LOWER: usize = 3;
636
720
///
637
721
/// [`prctl(PR_CAP_AMBIENT,…)`]: https://man7.org/linux/man-pages/man2/prctl.2.html
638
722
#[ 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 < ( ) > {
640
727
let sub_operation = if enable {
641
728
PR_CAP_AMBIENT_RAISE
642
729
} else {
643
730
PR_CAP_AMBIENT_LOWER
644
731
} ;
645
- let cap = capability as usize as * mut _ ;
732
+ let cap = capability. as_capability_set ( private :: Token ) . bits ( ) as usize as * mut _ ;
646
733
647
734
unsafe { prctl_3args ( PR_CAP_AMBIENT , sub_operation as * mut _ , cap) } . map ( |_r| ( ) )
648
735
}
0 commit comments