@@ -21,22 +21,14 @@ import (
2121 "gvisor.dev/gvisor/pkg/errors/linuxerr"
2222)
2323
24- // capsEquals returns true when the given creds' capabilities match the given caps.
25- func capsEquals (creds * Credentials , caps TaskCapabilities ) bool {
26- return creds .PermittedCaps == caps .PermittedCaps &&
27- creds .InheritableCaps == caps .InheritableCaps &&
28- creds .EffectiveCaps == caps .EffectiveCaps &&
29- creds .BoundingCaps == caps .BoundingCaps
30- }
31-
32- // credentialsWithCaps returns a copy of creds with the given capabilities.
33- func credentialsWithCaps (creds * Credentials , permittedCaps , inheritableCaps , effectiveCaps , boundingCaps CapabilitySet ) * Credentials {
34- newCreds := creds .Fork ()
35- newCreds .PermittedCaps = permittedCaps
36- newCreds .InheritableCaps = inheritableCaps
37- newCreds .EffectiveCaps = effectiveCaps
38- newCreds .BoundingCaps = boundingCaps
39- return newCreds
24+ // credentialsWithCaps creates a credentials object with the given capabilities.
25+ func credentialsWithCaps (inheritable , bounding CapabilitySet ) * Credentials {
26+ creds := NewRootCredentials (NewRootUserNamespace ())
27+ creds .PermittedCaps = 0
28+ creds .InheritableCaps = inheritable
29+ creds .EffectiveCaps = 0
30+ creds .BoundingCaps = bounding
31+ return creds
4032}
4133
4234func vfsNsCapDataFrom (effective bool , rootid uint32 , permitted , inheritable CapabilitySet ) linux.VfsNsCapData {
@@ -64,102 +56,68 @@ func vfsCapDataFrom(effective bool, permitted, inheritable CapabilitySet) linux.
6456
6557func TestCapsFromVfsCaps (t * testing.T ) {
6658 for _ , tst := range []struct {
67- name string
68- capData linux.VfsNsCapData
69- creds * Credentials
70- wantCaps TaskCapabilities
71- wantErr error
59+ name string
60+ capData linux.VfsNsCapData
61+ creds * Credentials
62+ wantPermitted CapabilitySet
63+ wantEffective bool
64+ wantErr error
7265 }{
7366 {
74- name : "TestRootCredential " ,
67+ name : "TestSamePermittedAndInheritableCaps " ,
7568 capData : vfsCapDataFrom (
7669 true , // effective
7770 CapabilitySetOf (linux .CAP_NET_ADMIN ), // permitted
7871 CapabilitySetOf (linux .CAP_NET_ADMIN )), // inheritable
79- creds : credentialsWithCaps (
80- NewRootCredentials (NewRootUserNamespace ()),
81- AllCapabilities ,
82- CapabilitySetOf (linux .CAP_NET_RAW ),
83- AllCapabilities ,
84- CapabilitySetOf (linux .CAP_SYSLOG )),
85- wantCaps : TaskCapabilities {
86- PermittedCaps : AllCapabilities ,
87- InheritableCaps : CapabilitySetOf (linux .CAP_NET_RAW ),
88- EffectiveCaps : AllCapabilities ,
89- BoundingCaps : CapabilitySetOf (linux .CAP_SYSLOG ),
90- },
72+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
73+ wantPermitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
74+ wantEffective : true ,
9175 },
9276 {
93- name : "TestPermittedAndInheritableCaps " ,
77+ name : "TestDifferentPermittedAndInheritableCaps " ,
9478 capData : vfsCapDataFrom (
9579 true , // effective
9680 CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
9781 CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID })), // inheritable
98- creds : credentialsWithCaps (
99- NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
100- AllCapabilities ,
101- AllCapabilities ,
102- AllCapabilities ,
103- AllCapabilities ),
104- wantCaps : TaskCapabilities {
105- PermittedCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
106- InheritableCaps : AllCapabilities ,
107- EffectiveCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
108- BoundingCaps : AllCapabilities ,
109- },
82+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
83+ wantPermitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
84+ wantEffective : true ,
11085 },
11186 {
11287 name : "TestEffectiveBitOff" ,
11388 capData : vfsCapDataFrom (
11489 false , // effective
11590 CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
11691 CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID })), // inheritable
117- creds : credentialsWithCaps (
118- NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
119- AllCapabilities ,
120- AllCapabilities ,
121- AllCapabilities ,
122- AllCapabilities ),
123- wantCaps : TaskCapabilities {
124- PermittedCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
125- InheritableCaps : AllCapabilities ,
126- EffectiveCaps : 0 ,
127- BoundingCaps : AllCapabilities ,
128- },
92+ creds : credentialsWithCaps (AllCapabilities , AllCapabilities ),
93+ wantPermitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
94+ wantEffective : false ,
12995 },
13096 {
13197 name : "TestInsufficientCaps" ,
13298 capData : vfsCapDataFrom (
13399 true , // effective
134100 CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
135101 CapabilitySetOf (linux .CAP_CHOWN )), // inheritable
136- creds : credentialsWithCaps (
137- NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
138- AllCapabilities ,
139- AllCapabilities ,
140- AllCapabilities ,
141- CapabilitySetOf (linux .CAP_CHOWN )),
102+ creds : credentialsWithCaps (AllCapabilities , CapabilitySetOf (linux .CAP_CHOWN )),
142103 wantErr : linuxerr .EPERM ,
143104 },
144105 } {
145106 t .Run (tst .name , func (t * testing.T ) {
146- newCreds , err := CapsFromVfsCaps (tst .capData , tst .creds )
107+ setEff , _ , err := HandleVfsCaps (tst .capData , tst .creds )
147108 if err == nil {
148109 if tst .wantErr != nil {
149- t .Errorf ("CapsFromVfsCaps(%v, %v) returned unexpected error %v" , tst .capData , tst .creds , tst .wantErr )
110+ t .Errorf ("CapsFromVfsCaps(%v) returned unexpected error %v" , tst .capData , tst .wantErr )
111+ }
112+ if tst .creds .PermittedCaps != tst .wantPermitted {
113+ t .Errorf ("CapsFromVfsCaps(%v) set PermittedCaps to: %#x, want capabilities: %#x" ,
114+ tst .capData , tst .creds .PermittedCaps , tst .wantPermitted )
150115 }
151- if ! capsEquals (newCreds , tst .wantCaps ) {
152- t .Errorf ("CapsFromVfsCaps(%v, %v) returned capabilities: %v, want capabilities: %v" ,
153- tst .capData , tst .creds ,
154- TaskCapabilities {
155- PermittedCaps : newCreds .PermittedCaps ,
156- InheritableCaps : newCreds .InheritableCaps ,
157- EffectiveCaps : newCreds .EffectiveCaps ,
158- BoundingCaps : newCreds .BoundingCaps ,
159- }, tst .wantCaps )
116+ if setEff != tst .wantEffective {
117+ t .Errorf ("CapsFromVfsCaps(%v) returned effective=%t, want: %t" , tst .capData , setEff , tst .wantEffective )
160118 }
161119 } else if tst .wantErr == nil || tst .wantErr .Error () != err .Error () {
162- t .Errorf ("CapsFromVfsCaps(%v, %v ) returned error %v, wantErr: %v" , tst .capData , tst . creds , err , tst .wantErr )
120+ t .Errorf ("CapsFromVfsCaps(%v) returned error %v, wantErr: %v" , tst .capData , err , tst .wantErr )
163121 }
164122 })
165123 }
0 commit comments