Skip to content

Commit 3517877

Browse files
authored
Merge pull request #2679 from thaJeztah/isolate_device
libcontainer: isolate libcontainer/devices
2 parents 2a50985 + 4fc2de7 commit 3517877

21 files changed

+465
-444
lines changed

libcontainer/cgroups/devices/devices_emulator.go

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,29 @@ import (
2727
"sort"
2828
"strconv"
2929

30-
"github.com/opencontainers/runc/libcontainer/configs"
30+
"github.com/opencontainers/runc/libcontainer/devices"
3131

3232
"github.com/pkg/errors"
3333
)
3434

35-
// deviceMeta is a DeviceRule without the Allow or Permissions fields, and no
35+
// deviceMeta is a Rule without the Allow or Permissions fields, and no
3636
// wildcard-type support. It's effectively the "match" portion of a metadata
3737
// rule, for the purposes of our emulation.
3838
type deviceMeta struct {
39-
node configs.DeviceType
39+
node devices.Type
4040
major int64
4141
minor int64
4242
}
4343

44-
// deviceRule is effectively the tuple (deviceMeta, DevicePermissions).
44+
// deviceRule is effectively the tuple (deviceMeta, Permissions).
4545
type deviceRule struct {
4646
meta deviceMeta
47-
perms configs.DevicePermissions
47+
perms devices.Permissions
4848
}
4949

5050
// deviceRules is a mapping of device metadata rules to the associated
5151
// permissions in the ruleset.
52-
type deviceRules map[deviceMeta]configs.DevicePermissions
52+
type deviceRules map[deviceMeta]devices.Permissions
5353

5454
func (r deviceRules) orderedEntries() []deviceRule {
5555
var rules []deviceRule
@@ -103,17 +103,17 @@ func parseLine(line string) (*deviceRule, error) {
103103
// TODO: Double-check that the entire file is "a *:* rwm".
104104
return nil, nil
105105
case "b":
106-
rule.meta.node = configs.BlockDevice
106+
rule.meta.node = devices.BlockDevice
107107
case "c":
108-
rule.meta.node = configs.CharDevice
108+
rule.meta.node = devices.CharDevice
109109
default:
110110
// Should never happen!
111111
return nil, errors.Errorf("unknown device type %q", node)
112112
}
113113

114114
// Parse the major number.
115115
if major == "*" {
116-
rule.meta.major = configs.Wildcard
116+
rule.meta.major = devices.Wildcard
117117
} else {
118118
val, err := strconv.ParseUint(major, 10, 32)
119119
if err != nil {
@@ -124,7 +124,7 @@ func parseLine(line string) (*deviceRule, error) {
124124

125125
// Parse the minor number.
126126
if minor == "*" {
127-
rule.meta.minor = configs.Wildcard
127+
rule.meta.minor = devices.Wildcard
128128
} else {
129129
val, err := strconv.ParseUint(minor, 10, 32)
130130
if err != nil {
@@ -134,7 +134,7 @@ func parseLine(line string) (*deviceRule, error) {
134134
}
135135

136136
// Parse the access permissions.
137-
rule.perms = configs.DevicePermissions(perms)
137+
rule.perms = devices.Permissions(perms)
138138
if !rule.perms.IsValid() || rule.perms.IsEmpty() {
139139
// Should never happen!
140140
return nil, errors.Errorf("parse access mode: contained unknown modes or is empty: %q", perms)
@@ -144,7 +144,7 @@ func parseLine(line string) (*deviceRule, error) {
144144

145145
func (e *Emulator) addRule(rule deviceRule) error {
146146
if e.rules == nil {
147-
e.rules = make(map[deviceMeta]configs.DevicePermissions)
147+
e.rules = make(map[deviceMeta]devices.Permissions)
148148
}
149149

150150
// Merge with any pre-existing permissions.
@@ -169,9 +169,9 @@ func (e *Emulator) rmRule(rule deviceRule) error {
169169
// to mention it'd be really slow (the kernel side is implemented as a
170170
// linked-list of exceptions).
171171
for _, partialMeta := range []deviceMeta{
172-
{node: rule.meta.node, major: configs.Wildcard, minor: rule.meta.minor},
173-
{node: rule.meta.node, major: rule.meta.major, minor: configs.Wildcard},
174-
{node: rule.meta.node, major: configs.Wildcard, minor: configs.Wildcard},
172+
{node: rule.meta.node, major: devices.Wildcard, minor: rule.meta.minor},
173+
{node: rule.meta.node, major: rule.meta.major, minor: devices.Wildcard},
174+
{node: rule.meta.node, major: devices.Wildcard, minor: devices.Wildcard},
175175
} {
176176
// This wildcard rule is equivalent to the requested rule, so skip it.
177177
if rule.meta == partialMeta {
@@ -202,7 +202,7 @@ func (e *Emulator) rmRule(rule deviceRule) error {
202202
func (e *Emulator) allow(rule *deviceRule) error {
203203
// This cgroup is configured as a black-list. Reset the entire emulator,
204204
// and put is into black-list mode.
205-
if rule == nil || rule.meta.node == configs.WildcardDevice {
205+
if rule == nil || rule.meta.node == devices.WildcardDevice {
206206
*e = Emulator{
207207
defaultAllow: true,
208208
rules: nil,
@@ -222,7 +222,7 @@ func (e *Emulator) allow(rule *deviceRule) error {
222222
func (e *Emulator) deny(rule *deviceRule) error {
223223
// This cgroup is configured as a white-list. Reset the entire emulator,
224224
// and put is into white-list mode.
225-
if rule == nil || rule.meta.node == configs.WildcardDevice {
225+
if rule == nil || rule.meta.node == devices.WildcardDevice {
226226
*e = Emulator{
227227
defaultAllow: false,
228228
rules: nil,
@@ -239,7 +239,7 @@ func (e *Emulator) deny(rule *deviceRule) error {
239239
return err
240240
}
241241

242-
func (e *Emulator) Apply(rule configs.DeviceRule) error {
242+
func (e *Emulator) Apply(rule devices.Rule) error {
243243
if !rule.Type.CanCgroup() {
244244
return errors.Errorf("cannot add rule [%#v] with non-cgroup type %q", rule, rule.Type)
245245
}
@@ -252,7 +252,7 @@ func (e *Emulator) Apply(rule configs.DeviceRule) error {
252252
},
253253
perms: rule.Permissions,
254254
}
255-
if innerRule.meta.node == configs.WildcardDevice {
255+
if innerRule.meta.node == devices.WildcardDevice {
256256
innerRule = nil
257257
}
258258

@@ -307,8 +307,8 @@ func EmulatorFromList(list io.Reader) (*Emulator, error) {
307307
// This function is the sole reason for all of Emulator -- to allow us
308308
// to figure out how to update a containers' cgroups without causing spurrious
309309
// device errors (if possible).
310-
func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, error) {
311-
var transitionRules []*configs.DeviceRule
310+
func (source *Emulator) Transition(target *Emulator) ([]*devices.Rule, error) {
311+
var transitionRules []*devices.Rule
312312
oldRules := source.rules
313313

314314
// If the default policy doesn't match, we need to include a "disruptive"
@@ -319,11 +319,11 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err
319319
// deny rules are in place in a black-list cgroup. Thus if the source is a
320320
// black-list we also have to include a disruptive rule.
321321
if source.IsBlacklist() || source.defaultAllow != target.defaultAllow {
322-
transitionRules = append(transitionRules, &configs.DeviceRule{
322+
transitionRules = append(transitionRules, &devices.Rule{
323323
Type: 'a',
324324
Major: -1,
325325
Minor: -1,
326-
Permissions: configs.DevicePermissions("rwm"),
326+
Permissions: devices.Permissions("rwm"),
327327
Allow: target.defaultAllow,
328328
})
329329
// The old rules are only relevant if we aren't starting out with a
@@ -342,7 +342,7 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err
342342
newPerms := target.rules[meta]
343343
droppedPerms := oldPerms.Difference(newPerms)
344344
if !droppedPerms.IsEmpty() {
345-
transitionRules = append(transitionRules, &configs.DeviceRule{
345+
transitionRules = append(transitionRules, &devices.Rule{
346346
Type: meta.node,
347347
Major: meta.major,
348348
Minor: meta.minor,
@@ -360,7 +360,7 @@ func (source *Emulator) Transition(target *Emulator) ([]*configs.DeviceRule, err
360360
oldPerms := oldRules[meta]
361361
gainedPerms := newPerms.Difference(oldPerms)
362362
if !gainedPerms.IsEmpty() {
363-
transitionRules = append(transitionRules, &configs.DeviceRule{
363+
transitionRules = append(transitionRules, &devices.Rule{
364364
Type: meta.node,
365365
Major: meta.major,
366366
Minor: meta.minor,

0 commit comments

Comments
 (0)