@@ -22,12 +22,11 @@ package devices
2222
2323import (
2424 "bufio"
25- "errors"
2625 "fmt"
2726 "io"
28- "regexp"
2927 "sort"
3028 "strconv"
29+ "strings"
3130
3231 "github.com/opencontainers/runc/libcontainer/devices"
3332)
@@ -79,19 +78,21 @@ func (e *Emulator) IsAllowAll() bool {
7978 return e .IsBlacklist () && len (e .rules ) == 0
8079}
8180
82- var devicesListRegexp = regexp .MustCompile (`^([abc])\s+(\d+|\*):(\d+|\*)\s+([rwm]+)$` )
83-
8481func parseLine (line string ) (* deviceRule , error ) {
85- matches := devicesListRegexp .FindStringSubmatch (line )
86- if matches == nil {
87- return nil , errors .New ("line doesn't match devices.list format" )
82+ // Input: node major:minor perms.
83+ fields := strings .FieldsFunc (line , func (r rune ) bool {
84+ return r == ' ' || r == ':'
85+ })
86+ if len (fields ) != 4 {
87+ return nil , fmt .Errorf ("malformed devices.list rule %s" , line )
8888 }
89+
8990 var (
9091 rule deviceRule
91- node = devices .Type (matches [ 1 ])
92- major = matches [ 2 ]
93- minor = matches [ 3 ]
94- perms = matches [ 4 ]
92+ node = devices .Type (fields [ 0 ])
93+ major = fields [ 1 ]
94+ minor = fields [ 2 ]
95+ perms = fields [ 3 ]
9596 )
9697
9798 // Parse the node type.
@@ -105,7 +106,6 @@ func parseLine(line string) (*deviceRule, error) {
105106 case devices .BlockDevice , devices .CharDevice :
106107 rule .meta .node = node
107108 default :
108- // Should never happen!
109109 return nil , fmt .Errorf ("unknown device type %q" , node )
110110 }
111111
@@ -134,7 +134,6 @@ func parseLine(line string) (*deviceRule, error) {
134134 // Parse the access permissions.
135135 rule .perms = devices .Permissions (perms )
136136 if ! rule .perms .IsValid () || rule .perms .IsEmpty () {
137- // Should never happen!
138137 return nil , fmt .Errorf ("parse access mode: contained unknown modes or is empty: %q" , perms )
139138 }
140139
0 commit comments