Skip to content

Commit 28ddd80

Browse files
author
Mrunal Patel
authored
Merge pull request opencontainers#164 from wking/privileged-cap-list
Check CAP_LAST_CAP while setting privileged
2 parents 5067a2e + 5295830 commit 28ddd80

File tree

6 files changed

+51
-26
lines changed

6 files changed

+51
-26
lines changed

cmd/ocitools/generate.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ var generateCommand = cli.Command{
7878
}
7979
}
8080

81-
err := setupSpec(specgen, context)
81+
err := setupSpec(&specgen, context)
8282
if err != nil {
8383
return err
8484
}
@@ -96,8 +96,12 @@ var generateCommand = cli.Command{
9696
},
9797
}
9898

99-
func setupSpec(g generate.Generator, context *cli.Context) error {
100-
spec := g.GetSpec()
99+
func setupSpec(g *generate.Generator, context *cli.Context) error {
100+
if context.GlobalBool("host-specific") {
101+
g.HostSpecific = true
102+
}
103+
104+
spec := g.Spec()
101105

102106
if len(spec.Version) == 0 {
103107
g.SetVersion(rspec.Version)
@@ -369,7 +373,7 @@ func checkNs(nsMaps map[string]string, nsName string) bool {
369373
return true
370374
}
371375

372-
func setupLinuxNamespaces(g generate.Generator, needsNewUser bool, nsMaps map[string]string) {
376+
func setupLinuxNamespaces(g *generate.Generator, needsNewUser bool, nsMaps map[string]string) {
373377
for _, nsName := range generate.Namespaces {
374378
if !checkNs(nsMaps, nsName) && !(needsNewUser && nsName == "user") {
375379
continue

cmd/ocitools/main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ func main() {
1818
Value: "error",
1919
Usage: "Log level (panic, fatal, error, warn, info, or debug)",
2020
},
21+
cli.BoolFlag{
22+
Name: "host-specific",
23+
Usage: "generate host-specific configs or do host-specific validations",
24+
},
2125
}
2226

2327
app.Commands = []cli.Command{

cmd/ocitools/validate.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ type configCheck func(rspec.Spec, string, bool) []string
2424

2525
var bundleValidateFlags = []cli.Flag{
2626
cli.StringFlag{Name: "path", Value: ".", Usage: "path to a bundle"},
27-
cli.BoolFlag{Name: "host-specific", Usage: "Check host specific configs."},
2827
}
2928

3029
var (
@@ -99,7 +98,7 @@ var bundleValidateCommand = cli.Command{
9998
return fmt.Errorf("The root path %q is not a directory.", rootfsPath)
10099
}
101100

102-
hostCheck := context.Bool("host-specific")
101+
hostCheck := context.GlobalBool("host-specific")
103102

104103
checks := []configCheck{
105104
checkMandatoryFields,

generate/generate.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ var (
2121

2222
// Generator represents a generator for a container spec.
2323
type Generator struct {
24-
spec *rspec.Spec
24+
spec *rspec.Spec
25+
HostSpecific bool
2526
}
2627

2728
// New creates a spec Generator with the default spec.
@@ -139,12 +140,16 @@ func New() Generator {
139140
Devices: []rspec.Device{},
140141
},
141142
}
142-
return Generator{&spec}
143+
return Generator{
144+
spec: &spec,
145+
}
143146
}
144147

145148
// NewFromSpec creates a spec Generator from a given spec.
146149
func NewFromSpec(spec *rspec.Spec) Generator {
147-
return Generator{spec}
150+
return Generator{
151+
spec: spec,
152+
}
148153
}
149154

150155
// NewFromFile loads the template specifed in a file into a spec Generator.
@@ -166,16 +171,18 @@ func NewFromTemplate(r io.Reader) (Generator, error) {
166171
if err := json.NewDecoder(r).Decode(&spec); err != nil {
167172
return Generator{}, err
168173
}
169-
return Generator{&spec}, nil
174+
return Generator{
175+
spec: &spec,
176+
}, nil
170177
}
171178

172179
// SetSpec sets the spec in the Generator g.
173180
func (g *Generator) SetSpec(spec *rspec.Spec) {
174181
g.spec = spec
175182
}
176183

177-
// GetSpec gets the spec in the Generator g.
178-
func (g *Generator) GetSpec() *rspec.Spec {
184+
// Spec gets the spec in the Generator g.
185+
func (g *Generator) Spec() *rspec.Spec {
179186
return g.spec
180187
}
181188

@@ -968,6 +975,9 @@ func (g *Generator) SetupPrivileged(privileged bool) {
968975
// Add all capabilities in privileged mode.
969976
var finalCapList []string
970977
for _, cap := range capability.List() {
978+
if g.HostSpecific && cap > capability.CAP_LAST_CAP {
979+
continue
980+
}
971981
finalCapList = append(finalCapList, fmt.Sprintf("CAP_%s", strings.ToUpper(cap.String())))
972982
}
973983
g.initSpecLinux()
@@ -978,12 +988,15 @@ func (g *Generator) SetupPrivileged(privileged bool) {
978988
}
979989
}
980990

981-
func checkCap(c string) error {
991+
func checkCap(c string, hostSpecific bool) error {
982992
isValid := false
983993
cp := strings.ToUpper(c)
984994

985995
for _, cap := range capability.List() {
986996
if cp == strings.ToUpper(cap.String()) {
997+
if hostSpecific && cap > capability.CAP_LAST_CAP {
998+
return fmt.Errorf("CAP_%s is not supported on the current host", cp)
999+
}
9871000
isValid = true
9881001
break
9891002
}
@@ -1005,7 +1018,7 @@ func (g *Generator) ClearProcessCapabilities() {
10051018

10061019
// AddProcessCapability adds a process capability into g.spec.Process.Capabilities.
10071020
func (g *Generator) AddProcessCapability(c string) error {
1008-
if err := checkCap(c); err != nil {
1021+
if err := checkCap(c, g.HostSpecific); err != nil {
10091022
return err
10101023
}
10111024

@@ -1024,7 +1037,7 @@ func (g *Generator) AddProcessCapability(c string) error {
10241037

10251038
// DropProcessCapability drops a process capability from g.spec.Process.Capabilities.
10261039
func (g *Generator) DropProcessCapability(c string) error {
1027-
if err := checkCap(c); err != nil {
1040+
if err := checkCap(c, g.HostSpecific); err != nil {
10281041
return err
10291042
}
10301043

man/ocitools-validate.1.md

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,6 @@ Validate an OCI bundle
1818
**--path=PATH
1919
Path to bundle
2020

21-
**--host-specific**
22-
Check host specific configs.
23-
By default, validation only tests for compatibility with a hypothetical host.
24-
With this flag, validation will also run more specific tests to see whether
25-
the current host is capable of launching a container from the configuration.
26-
For example, validating a compliant Windows configuration on a Linux machine
27-
will pass without this flag ("there may be a Windows host capable of
28-
launching this container"), but will fail with it ("this host is not capable
29-
of launching this container").
30-
3121
# SEE ALSO
3222
**ocitools**(1)
3323

man/ocitools.1.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,26 @@ ocitools is a collection of tools for working with the [OCI runtime specificatio
1515

1616
# OPTIONS
1717
**--help**
18-
Print usage statement
18+
Print usage statement.
1919

2020
**-v**, **--version**
2121
Print version information.
2222

23+
**--log-level**
24+
Log level (panic, fatal, error, warn, info, or debug) (default: "error").
25+
26+
**--host-specific**
27+
Generate host-specific configs or do host-specific validations.
28+
29+
By default, generator generates configs without checking whether they are
30+
supported on the current host. With this flag, generator will first check
31+
whether each config is supported on the current host, and only add it into
32+
the config file if it passes the checking.
33+
34+
By default, validation only tests for compatibility with a hypothetical host.
35+
With this flag, validation will also run more specific tests to see whether
36+
the current host is capable of launching a container from the configuration.
37+
2338
# COMMANDS
2439
**validate**
2540
Validating OCI bundle

0 commit comments

Comments
 (0)