1515package auth
1616
1717import (
18- "fmt"
1918 "testing"
2019
2120 "gvisor.dev/gvisor/pkg/abi/linux"
@@ -40,37 +39,62 @@ func credentialsWithCaps(creds *Credentials, permittedCaps, inheritableCaps, eff
4039 return newCreds
4140}
4241
42+ func vfsNsCapDataFrom (effective bool , rootid uint32 , permitted , inheritable CapabilitySet ) linux.VfsNsCapData {
43+ capData := vfsCapDataFrom (effective , permitted , inheritable )
44+ capData .MagicEtc = linux .VFS_CAP_REVISION_3
45+ if effective {
46+ capData .MagicEtc |= linux .VFS_CAP_FLAGS_EFFECTIVE
47+ }
48+ capData .RootID = rootid
49+ return capData
50+ }
51+
52+ func vfsCapDataFrom (effective bool , permitted , inheritable CapabilitySet ) linux.VfsNsCapData {
53+ var capData linux.VfsNsCapData
54+ capData .MagicEtc = linux .VFS_CAP_REVISION_2
55+ if effective {
56+ capData .MagicEtc |= linux .VFS_CAP_FLAGS_EFFECTIVE
57+ }
58+ capData .PermittedLo = uint32 (permitted & 0xffffffff )
59+ capData .PermittedHi = uint32 (permitted >> 32 )
60+ capData .InheritableLo = uint32 (inheritable & 0xffffffff )
61+ capData .InheritableHi = uint32 (inheritable >> 32 )
62+ return capData
63+ }
64+
4365func TestCapsFromVfsCaps (t * testing.T ) {
4466 for _ , tst := range []struct {
4567 name string
46- capData VfsCapData
68+ capData linux. VfsNsCapData
4769 creds * Credentials
4870 wantCaps TaskCapabilities
4971 wantErr error
5072 }{
5173 {
5274 name : "TestRootCredential" ,
53- capData : VfsCapData {
54- MagicEtc : 0x2000001 ,
55- Permitted : CapabilitySetOf (linux .CAP_NET_ADMIN ),
56- Inheritable : CapabilitySetOf (linux .CAP_NET_ADMIN ),
57- },
58- creds : credentialsWithCaps (NewRootCredentials (NewRootUserNamespace ()), AllCapabilities , CapabilitySetOf (linux .CAP_NET_RAW ), AllCapabilities , CapabilitySetOf (linux .CAP_SYSLOG )),
75+ capData : vfsCapDataFrom (
76+ true , // effective
77+ CapabilitySetOf (linux .CAP_NET_ADMIN ), // permitted
78+ 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 )),
5985 wantCaps : TaskCapabilities {
6086 PermittedCaps : AllCapabilities ,
6187 InheritableCaps : CapabilitySetOf (linux .CAP_NET_RAW ),
6288 EffectiveCaps : AllCapabilities ,
6389 BoundingCaps : CapabilitySetOf (linux .CAP_SYSLOG ),
6490 },
65- wantErr : nil ,
6691 },
6792 {
6893 name : "TestPermittedAndInheritableCaps" ,
69- capData : VfsCapData {
70- MagicEtc : 0x2000001 ,
71- Permitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
72- Inheritable : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID }),
73- },
94+ capData : vfsCapDataFrom (
95+ true , // effective
96+ CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
97+ CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID })), // inheritable
7498 creds : credentialsWithCaps (
7599 NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
76100 AllCapabilities ,
@@ -83,15 +107,13 @@ func TestCapsFromVfsCaps(t *testing.T) {
83107 EffectiveCaps : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID , linux .CAP_SETGID }),
84108 BoundingCaps : AllCapabilities ,
85109 },
86- wantErr : nil ,
87110 },
88111 {
89112 name : "TestEffectiveBitOff" ,
90- capData : VfsCapData {
91- MagicEtc : 0x2000000 ,
92- Permitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
93- Inheritable : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID }),
94- },
113+ capData : vfsCapDataFrom (
114+ false , // effective
115+ CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
116+ CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETGID })), // inheritable
95117 creds : credentialsWithCaps (
96118 NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
97119 AllCapabilities ,
@@ -104,23 +126,20 @@ func TestCapsFromVfsCaps(t *testing.T) {
104126 EffectiveCaps : 0 ,
105127 BoundingCaps : AllCapabilities ,
106128 },
107- wantErr : nil ,
108129 },
109130 {
110131 name : "TestInsufficientCaps" ,
111- capData : VfsCapData {
112- MagicEtc : 0x2000001 ,
113- Permitted : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }),
114- Inheritable : CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN }),
115- },
132+ capData : vfsCapDataFrom (
133+ true , // effective
134+ CapabilitySetOfMany ([]linux.Capability {linux .CAP_CHOWN , linux .CAP_SETUID }), // permitted
135+ CapabilitySetOf (linux .CAP_CHOWN )), // inheritable
116136 creds : credentialsWithCaps (
117137 NewUserCredentials (123 , 321 , nil , nil , NewRootUserNamespace ()),
118138 AllCapabilities ,
119139 AllCapabilities ,
120140 AllCapabilities ,
121141 CapabilitySetOf (linux .CAP_CHOWN )),
122- wantCaps : TaskCapabilities {},
123- wantErr : linuxerr .EPERM ,
142+ wantErr : linuxerr .EPERM ,
124143 },
125144 } {
126145 t .Run (tst .name , func (t * testing.T ) {
@@ -150,47 +169,28 @@ func TestVfsCapData(t *testing.T) {
150169 for _ , tst := range []struct {
151170 name string
152171 data []byte
153- capData VfsCapData
172+ capData linux. VfsNsCapData
154173 wantErr error
155174 }{
156175 {
157176 name : "VfsCapRevision1" ,
158- data : []byte {0 , 0 , 0 , 1 , 0 , 16 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
159- capData : VfsCapData {},
160- wantErr : fmt .Errorf ("VFS_CAP_REVISION_%v with cap data size %v is not supported" , 0x1000000 , 20 ),
177+ data : []byte {0 , 0 , 0 , 1 , 0 , 16 , 0 , 0 , 0 , 0 , 0 , 0 },
178+ wantErr : linuxerr .EINVAL ,
161179 },
162180 {
163- name : "VfsCapRevision2" ,
164- data : []byte {1 , 0 , 0 , 2 , 0 , 32 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 },
165- capData : VfsCapData {
166- MagicEtc : 0x2000001 ,
167- Permitted : CapabilitySetOf (linux .CAP_NET_RAW ),
168- Inheritable : CapabilitySetOf (linux .CAP_SYSLOG ),
169- },
170- wantErr : nil ,
181+ name : "VfsCapRevision2WithEffective" ,
182+ data : []byte {1 , 0 , 0 , 2 , 0 , 32 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 },
183+ capData : vfsCapDataFrom (true , CapabilitySetOf (linux .CAP_NET_RAW ), CapabilitySetOf (linux .CAP_SYSLOG )),
171184 },
172185 {
173- name : "VfsCapRevision3" ,
174- data : []byte {0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 16 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 },
175- capData : VfsCapData {
176- MagicEtc : 0x3000000 ,
177- RootID : 1 ,
178- Permitted : CapabilitySetOf (linux .CAP_SYSLOG ),
179- Inheritable : CapabilitySetOf (linux .CAP_NET_ADMIN ),
180- },
181- wantErr : nil ,
186+ name : "VfsCapRevision3" ,
187+ data : []byte {0 , 0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 16 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 },
188+ capData : vfsNsCapDataFrom (false , 1 , CapabilitySetOf (linux .CAP_SYSLOG ), CapabilitySetOf (linux .CAP_NET_ADMIN )),
182189 },
183190 {
184191 name : "VfsCapRevisionNotSupported" ,
185192 data : []byte {0 , 0 , 0 , 0xf , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
186- capData : VfsCapData {},
187- wantErr : fmt .Errorf ("VFS_CAP_REVISION_%v with cap data size %v is not supported" , 0xf000000 , 20 ),
188- },
189- {
190- name : "VfsInvalidInput" ,
191- data : []byte {0 , 0 , 0 , 0 },
192- capData : VfsCapData {},
193- wantErr : fmt .Errorf ("the size of security.capability is too small, actual size: %v" , 4 ),
193+ wantErr : linuxerr .EINVAL ,
194194 },
195195 } {
196196 t .Run (tst .name , func (t * testing.T ) {
@@ -200,11 +200,20 @@ func TestVfsCapData(t *testing.T) {
200200 t .Errorf ("VfsCapDataOf(%v) returned unexpected error %v" , tst .data , tst .wantErr )
201201 }
202202 if tst .capData != capData {
203- t .Errorf ("VfsCapDataOf(%v) = %v, want %v" , tst .data , capData , tst .capData )
203+ t .Errorf ("VfsCapDataOf(%v) = %+ v, want %+ v" , tst .data , capData , tst .capData )
204204 }
205205 } else if tst .wantErr == nil || tst .wantErr .Error () != err .Error () {
206206 t .Errorf ("VfsCapDataOf(%v) returned error %v, wantErr: %v" , tst .data , err , tst .wantErr )
207207 }
208208 })
209209 }
210210}
211+
212+ func TestXattrCapsSizeBytes (t * testing.T ) {
213+ if got := (* linux .VfsCapData )(nil ).SizeBytes (); got != linux .XATTR_CAPS_SZ_2 {
214+ t .Errorf ("XATTR_CAPS_SZ_2 = %v, got %v" , linux .XATTR_CAPS_SZ_2 , got )
215+ }
216+ if got := (* linux .VfsNsCapData )(nil ).SizeBytes (); got != linux .XATTR_CAPS_SZ_3 {
217+ t .Errorf ("XATTR_CAPS_SZ_3 = %v, got %v" , linux .XATTR_CAPS_SZ_3 , got )
218+ }
219+ }
0 commit comments