mirror of https://github.com/docker/cli.git
vendor: github.com/opencontainers/runc v1.0.1
full diff: https://github.com/opencontainers/runc/comopare/v1.0.0-rc95...v1.0.1 Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
ecad24d47f
commit
cfb07a75a9
|
@ -52,7 +52,7 @@ github.com/modern-go/reflect2 94122c33edd36123c84d5368cfb2
|
||||||
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b # v1.0.0
|
github.com/morikuni/aec 39771216ff4c63d11f5e604076f9c45e8be1067b # v1.0.0
|
||||||
github.com/opencontainers/go-digest ea51bea511f75cfa3ef6098cc253c5c3609b037a # v1.0.0
|
github.com/opencontainers/go-digest ea51bea511f75cfa3ef6098cc253c5c3609b037a # v1.0.0
|
||||||
github.com/opencontainers/image-spec d60099175f88c47cd379c4738d158884749ed235 # v1.0.1
|
github.com/opencontainers/image-spec d60099175f88c47cd379c4738d158884749ed235 # v1.0.1
|
||||||
github.com/opencontainers/runc b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7 # v1.0.0-rc95
|
github.com/opencontainers/runc 4144b63817ebcc5b358fc2c8ef95f7cddd709aa7 # v1.0.1
|
||||||
github.com/opentracing/opentracing-go d34af3eaa63c4d08ab54863a4bdd0daa45212e12 # v1.2.0
|
github.com/opentracing/opentracing-go d34af3eaa63c4d08ab54863a4bdd0daa45212e12 # v1.2.0
|
||||||
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
|
github.com/pkg/errors 614d223910a179a466c1767a985424175c39b465 # v0.9.1
|
||||||
github.com/prometheus/client_golang 6edbbd9e560190e318cdc5b4d3e630b442858380 # v1.6.0
|
github.com/prometheus/client_golang 6edbbd9e560190e318cdc5b4d3e630b442858380 # v1.6.0
|
||||||
|
|
|
@ -3,26 +3,26 @@ module github.com/opencontainers/runc
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/bits-and-blooms/bitset v1.2.0
|
||||||
github.com/checkpoint-restore/go-criu/v5 v5.0.0
|
github.com/checkpoint-restore/go-criu/v5 v5.0.0
|
||||||
github.com/cilium/ebpf v0.5.0
|
github.com/cilium/ebpf v0.6.2
|
||||||
github.com/containerd/console v1.0.2
|
github.com/containerd/console v1.0.2
|
||||||
github.com/coreos/go-systemd/v22 v22.3.1
|
github.com/coreos/go-systemd/v22 v22.3.2
|
||||||
github.com/cyphar/filepath-securejoin v0.2.2
|
github.com/cyphar/filepath-securejoin v0.2.2
|
||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/godbus/dbus/v5 v5.0.4
|
github.com/godbus/dbus/v5 v5.0.4
|
||||||
github.com/moby/sys/mountinfo v0.4.1
|
github.com/moby/sys/mountinfo v0.4.1
|
||||||
github.com/mrunalp/fileutils v0.5.0
|
github.com/mrunalp/fileutils v0.5.0
|
||||||
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417
|
||||||
github.com/opencontainers/selinux v1.8.0
|
github.com/opencontainers/selinux v1.8.2
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/seccomp/libseccomp-golang v0.9.1
|
github.com/seccomp/libseccomp-golang v0.9.1
|
||||||
github.com/sirupsen/logrus v1.7.0
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
||||||
// NOTE: urfave/cli must be <= v1.22.1 due to a regression: https://github.com/urfave/cli/issues/1092
|
// NOTE: urfave/cli must be <= v1.22.1 due to a regression: https://github.com/urfave/cli/issues/1092
|
||||||
github.com/urfave/cli v1.22.1
|
github.com/urfave/cli v1.22.1
|
||||||
github.com/vishvananda/netlink v1.1.0
|
github.com/vishvananda/netlink v1.1.0
|
||||||
github.com/willf/bitset v1.1.11
|
|
||||||
golang.org/x/net v0.0.0-20201224014010-6772e930b67b
|
golang.org/x/net v0.0.0-20201224014010-6772e930b67b
|
||||||
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887
|
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887
|
||||||
google.golang.org/protobuf v1.25.0
|
google.golang.org/protobuf v1.26.0
|
||||||
)
|
)
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testEscapeJsonString(t *testing.T, input, want string) {
|
func testEscapeJSONString(t *testing.T, input, want string) {
|
||||||
in := C.CString(input)
|
in := C.CString(input)
|
||||||
out := C.escape_json_string(in)
|
out := C.escape_json_string(in)
|
||||||
got := C.GoString(out)
|
got := C.GoString(out)
|
||||||
|
@ -25,7 +25,7 @@ func testEscapeJsonString(t *testing.T, input, want string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testEscapeJson(t *testing.T) {
|
func testEscapeJSON(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
input, output string
|
input, output string
|
||||||
}{
|
}{
|
||||||
|
@ -48,6 +48,6 @@ func testEscapeJson(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
testEscapeJsonString(t, tc.input, tc.output)
|
testEscapeJSONString(t, tc.input, tc.output)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
@ -11,19 +12,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
minId = 0
|
minID = 0
|
||||||
maxId = 1<<31 - 1 //for 32-bit systems compatibility
|
maxID = 1<<31 - 1 // for 32-bit systems compatibility
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// The current operating system does not provide the required data for user lookups.
|
// ErrNoPasswdEntries is returned if no matching entries were found in /etc/group.
|
||||||
ErrUnsupported = errors.New("user lookup: operating system does not provide passwd-formatted data")
|
|
||||||
|
|
||||||
// No matching entries found in file.
|
|
||||||
ErrNoPasswdEntries = errors.New("no matching entries in passwd file")
|
ErrNoPasswdEntries = errors.New("no matching entries in passwd file")
|
||||||
|
// ErrNoGroupEntries is returned if no matching entries were found in /etc/passwd.
|
||||||
ErrNoGroupEntries = errors.New("no matching entries in group file")
|
ErrNoGroupEntries = errors.New("no matching entries in group file")
|
||||||
|
// ErrRange is returned if a UID or GID is outside of the valid range.
|
||||||
ErrRange = fmt.Errorf("uids and gids must be in range %d-%d", minId, maxId)
|
ErrRange = fmt.Errorf("uids and gids must be in range %d-%d", minID, maxID)
|
||||||
)
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
|
@ -57,11 +56,11 @@ type IDMap struct {
|
||||||
Count int64
|
Count int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseLine(line string, v ...interface{}) {
|
func parseLine(line []byte, v ...interface{}) {
|
||||||
parseParts(strings.Split(line, ":"), v...)
|
parseParts(bytes.Split(line, []byte(":")), v...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseParts(parts []string, v ...interface{}) {
|
func parseParts(parts [][]byte, v ...interface{}) {
|
||||||
if len(parts) == 0 {
|
if len(parts) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -77,16 +76,16 @@ func parseParts(parts []string, v ...interface{}) {
|
||||||
// This is legit.
|
// This is legit.
|
||||||
switch e := v[i].(type) {
|
switch e := v[i].(type) {
|
||||||
case *string:
|
case *string:
|
||||||
*e = p
|
*e = string(p)
|
||||||
case *int:
|
case *int:
|
||||||
// "numbers", with conversion errors ignored because of some misbehaving configuration files.
|
// "numbers", with conversion errors ignored because of some misbehaving configuration files.
|
||||||
*e, _ = strconv.Atoi(p)
|
*e, _ = strconv.Atoi(string(p))
|
||||||
case *int64:
|
case *int64:
|
||||||
*e, _ = strconv.ParseInt(p, 10, 64)
|
*e, _ = strconv.ParseInt(string(p), 10, 64)
|
||||||
case *[]string:
|
case *[]string:
|
||||||
// Comma-separated lists.
|
// Comma-separated lists.
|
||||||
if p != "" {
|
if len(p) != 0 {
|
||||||
*e = strings.Split(p, ",")
|
*e = strings.Split(string(p), ",")
|
||||||
} else {
|
} else {
|
||||||
*e = []string{}
|
*e = []string{}
|
||||||
}
|
}
|
||||||
|
@ -130,8 +129,8 @@ func ParsePasswdFilter(r io.Reader, filter func(User) bool) ([]User, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
line := strings.TrimSpace(s.Text())
|
line := bytes.TrimSpace(s.Bytes())
|
||||||
if line == "" {
|
if len(line) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,15 +180,53 @@ func ParseGroupFilter(r io.Reader, filter func(Group) bool) ([]Group, error) {
|
||||||
if r == nil {
|
if r == nil {
|
||||||
return nil, fmt.Errorf("nil source for group-formatted data")
|
return nil, fmt.Errorf("nil source for group-formatted data")
|
||||||
}
|
}
|
||||||
|
rd := bufio.NewReader(r)
|
||||||
|
out := []Group{}
|
||||||
|
|
||||||
|
// Read the file line-by-line.
|
||||||
|
for {
|
||||||
var (
|
var (
|
||||||
s = bufio.NewScanner(r)
|
isPrefix bool
|
||||||
out = []Group{}
|
wholeLine []byte
|
||||||
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
for s.Scan() {
|
// Read the next line. We do so in chunks (as much as reader's
|
||||||
text := s.Text()
|
// buffer is able to keep), check if we read enough columns
|
||||||
if text == "" {
|
// already on each step and store final result in wholeLine.
|
||||||
|
for {
|
||||||
|
var line []byte
|
||||||
|
line, isPrefix, err = rd.ReadLine()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
// We should return no error if EOF is reached
|
||||||
|
// without a match.
|
||||||
|
if err == io.EOF { //nolint:errorlint // comparison with io.EOF is legit, https://github.com/polyfloyd/go-errorlint/pull/12
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
return out, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple common case: line is short enough to fit in a
|
||||||
|
// single reader's buffer.
|
||||||
|
if !isPrefix && len(wholeLine) == 0 {
|
||||||
|
wholeLine = line
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
wholeLine = append(wholeLine, line...)
|
||||||
|
|
||||||
|
// Check if we read the whole line already.
|
||||||
|
if !isPrefix {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// There's no spec for /etc/passwd or /etc/group, but we try to follow
|
||||||
|
// the same rules as the glibc parser, which allows comments and blank
|
||||||
|
// space at the beginning of a line.
|
||||||
|
wholeLine = bytes.TrimSpace(wholeLine)
|
||||||
|
if len(wholeLine) == 0 || wholeLine[0] == '#' {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,17 +236,12 @@ func ParseGroupFilter(r io.Reader, filter func(Group) bool) ([]Group, error) {
|
||||||
// root:x:0:root
|
// root:x:0:root
|
||||||
// adm:x:4:root,adm,daemon
|
// adm:x:4:root,adm,daemon
|
||||||
p := Group{}
|
p := Group{}
|
||||||
parseLine(text, &p.Name, &p.Pass, &p.Gid, &p.List)
|
parseLine(wholeLine, &p.Name, &p.Pass, &p.Gid, &p.List)
|
||||||
|
|
||||||
if filter == nil || filter(p) {
|
if filter == nil || filter(p) {
|
||||||
out = append(out, p)
|
out = append(out, p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := s.Err(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ExecUser struct {
|
type ExecUser struct {
|
||||||
|
@ -280,7 +312,7 @@ func GetExecUser(userSpec string, defaults *ExecUser, passwd, group io.Reader) (
|
||||||
|
|
||||||
// Allow for userArg to have either "user" syntax, or optionally "user:group" syntax
|
// Allow for userArg to have either "user" syntax, or optionally "user:group" syntax
|
||||||
var userArg, groupArg string
|
var userArg, groupArg string
|
||||||
parseLine(userSpec, &userArg, &groupArg)
|
parseLine([]byte(userSpec), &userArg, &groupArg)
|
||||||
|
|
||||||
// Convert userArg and groupArg to be numeric, so we don't have to execute
|
// Convert userArg and groupArg to be numeric, so we don't have to execute
|
||||||
// Atoi *twice* for each iteration over lines.
|
// Atoi *twice* for each iteration over lines.
|
||||||
|
@ -328,7 +360,7 @@ func GetExecUser(userSpec string, defaults *ExecUser, passwd, group io.Reader) (
|
||||||
user.Uid = uidArg
|
user.Uid = uidArg
|
||||||
|
|
||||||
// Must be inside valid uid range.
|
// Must be inside valid uid range.
|
||||||
if user.Uid < minId || user.Uid > maxId {
|
if user.Uid < minID || user.Uid > maxID {
|
||||||
return nil, ErrRange
|
return nil, ErrRange
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +409,7 @@ func GetExecUser(userSpec string, defaults *ExecUser, passwd, group io.Reader) (
|
||||||
user.Gid = gidArg
|
user.Gid = gidArg
|
||||||
|
|
||||||
// Must be inside valid gid range.
|
// Must be inside valid gid range.
|
||||||
if user.Gid < minId || user.Gid > maxId {
|
if user.Gid < minID || user.Gid > maxID {
|
||||||
return nil, ErrRange
|
return nil, ErrRange
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +433,7 @@ func GetExecUser(userSpec string, defaults *ExecUser, passwd, group io.Reader) (
|
||||||
// or the given group data is nil, the id will be returned as-is
|
// or the given group data is nil, the id will be returned as-is
|
||||||
// provided it is in the legal range.
|
// provided it is in the legal range.
|
||||||
func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, error) {
|
func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, error) {
|
||||||
var groups = []Group{}
|
groups := []Group{}
|
||||||
if group != nil {
|
if group != nil {
|
||||||
var err error
|
var err error
|
||||||
groups, err = ParseGroupFilter(group, func(g Group) bool {
|
groups, err = ParseGroupFilter(group, func(g Group) bool {
|
||||||
|
@ -439,7 +471,7 @@ func GetAdditionalGroups(additionalGroups []string, group io.Reader) ([]int, err
|
||||||
return nil, fmt.Errorf("Unable to find group %s", ag)
|
return nil, fmt.Errorf("Unable to find group %s", ag)
|
||||||
}
|
}
|
||||||
// Ensure gid is inside gid range.
|
// Ensure gid is inside gid range.
|
||||||
if gid < minId || gid > maxId {
|
if gid < minID || gid > maxID {
|
||||||
return nil, ErrRange
|
return nil, ErrRange
|
||||||
}
|
}
|
||||||
gidMap[int(gid)] = struct{}{}
|
gidMap[int(gid)] = struct{}{}
|
||||||
|
@ -498,8 +530,8 @@ func ParseSubIDFilter(r io.Reader, filter func(SubID) bool) ([]SubID, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
line := strings.TrimSpace(s.Text())
|
line := bytes.TrimSpace(s.Bytes())
|
||||||
if line == "" {
|
if len(line) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -551,14 +583,14 @@ func ParseIDMapFilter(r io.Reader, filter func(IDMap) bool) ([]IDMap, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
for s.Scan() {
|
for s.Scan() {
|
||||||
line := strings.TrimSpace(s.Text())
|
line := bytes.TrimSpace(s.Bytes())
|
||||||
if line == "" {
|
if len(line) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// see: man 7 user_namespaces
|
// see: man 7 user_namespaces
|
||||||
p := IDMap{}
|
p := IDMap{}
|
||||||
parseParts(strings.Fields(line), &p.ID, &p.ParentID, &p.Count)
|
parseParts(bytes.Fields(line), &p.ID, &p.ParentID, &p.Count)
|
||||||
|
|
||||||
if filter == nil || filter(p) {
|
if filter == nil || filter(p) {
|
||||||
out = append(out, p)
|
out = append(out, p)
|
||||||
|
|
Loading…
Reference in New Issue