@@ -6,16 +6,15 @@ import (
6
6
"sort"
7
7
"strings"
8
8
9
+ "github.com/kolyshkin/capability"
9
10
"github.com/opencontainers/runc/libcontainer/configs"
10
11
"github.com/sirupsen/logrus"
11
- "github.com/syndtr/gocapability/capability"
12
12
)
13
13
14
14
const allCapabilityTypes = capability .CAPS | capability .BOUNDING | capability .AMBIENT
15
15
16
16
var (
17
- capabilityMap map [string ]capability.Cap
18
- capTypes = []capability.CapType {
17
+ capTypes = []capability.CapType {
19
18
capability .BOUNDING ,
20
19
capability .PERMITTED ,
21
20
capability .INHERITABLE ,
@@ -24,14 +23,19 @@ var (
24
23
}
25
24
)
26
25
27
- func init () {
28
- capabilityMap = make (map [string ]capability.Cap , capability .CAP_LAST_CAP + 1 )
26
+ func getCapMap () (map [string ]capability.Cap , error ) {
27
+ lastcap , err := capability .LastCap ()
28
+ if err != nil {
29
+ return nil , err
30
+ }
31
+ capabilityMap := make (map [string ]capability.Cap , lastcap + 1 )
29
32
for _ , c := range capability .List () {
30
- if c > capability . CAP_LAST_CAP {
33
+ if c > lastcap {
31
34
continue
32
35
}
33
36
capabilityMap ["CAP_" + strings .ToUpper (c .String ())] = c
34
37
}
38
+ return capabilityMap , nil
35
39
}
36
40
37
41
// KnownCapabilities returns the list of the known capabilities.
@@ -53,14 +57,17 @@ func New(capConfig *configs.Capabilities) (*Caps, error) {
53
57
err error
54
58
c Caps
55
59
)
56
-
60
+ cmap , err := getCapMap ()
61
+ if err != nil {
62
+ return nil , err
63
+ }
57
64
unknownCaps := make (map [string ]struct {})
58
65
c .caps = map [capability.CapType ][]capability.Cap {
59
- capability .BOUNDING : capSlice (capConfig .Bounding , unknownCaps ),
60
- capability .EFFECTIVE : capSlice (capConfig .Effective , unknownCaps ),
61
- capability .INHERITABLE : capSlice (capConfig .Inheritable , unknownCaps ),
62
- capability .PERMITTED : capSlice (capConfig .Permitted , unknownCaps ),
63
- capability .AMBIENT : capSlice (capConfig .Ambient , unknownCaps ),
66
+ capability .BOUNDING : capSlice (capConfig .Bounding , cmap , unknownCaps ),
67
+ capability .EFFECTIVE : capSlice (capConfig .Effective , cmap , unknownCaps ),
68
+ capability .INHERITABLE : capSlice (capConfig .Inheritable , cmap , unknownCaps ),
69
+ capability .PERMITTED : capSlice (capConfig .Permitted , cmap , unknownCaps ),
70
+ capability .AMBIENT : capSlice (capConfig .Ambient , cmap , unknownCaps ),
64
71
}
65
72
if c .pid , err = capability .NewPid2 (0 ); err != nil {
66
73
return nil , err
@@ -77,10 +84,10 @@ func New(capConfig *configs.Capabilities) (*Caps, error) {
77
84
// capSlice converts the slice of capability names in caps, to their numeric
78
85
// equivalent, and returns them as a slice. Unknown or unavailable capabilities
79
86
// are not returned, but appended to unknownCaps.
80
- func capSlice (caps []string , unknownCaps map [string ]struct {}) []capability.Cap {
87
+ func capSlice (caps []string , cmap map [ string ]capability. Cap , unknownCaps map [string ]struct {}) []capability.Cap {
81
88
var out []capability.Cap
82
89
for _ , c := range caps {
83
- if v , ok := capabilityMap [c ]; ! ok {
90
+ if v , ok := cmap [c ]; ! ok {
84
91
unknownCaps [c ] = struct {}{}
85
92
} else {
86
93
out = append (out , v )
0 commit comments