summaryrefslogtreecommitdiff
path: root/vendor/github.com/containerd/continuity/sysx/xattr.go
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2020-04-30 08:40:16 -0400
committerDaniel J Walsh <dwalsh@redhat.com>2020-05-01 15:00:33 -0400
commit97fcbfcbec4c754f2c5a71daadbf933a6ebb0634 (patch)
tree7a1011275dea1080277c0fc4f9761757a56aaf76 /vendor/github.com/containerd/continuity/sysx/xattr.go
parent4a2765c4989df88681c18333c1ae45017e09613a (diff)
downloadpodman-97fcbfcbec4c754f2c5a71daadbf933a6ebb0634.tar.gz
podman-97fcbfcbec4c754f2c5a71daadbf933a6ebb0634.tar.bz2
podman-97fcbfcbec4c754f2c5a71daadbf933a6ebb0634.zip
cgroupsns was not following containers.conf
Implement ParseCgroupsNamespace to handle defaults. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Diffstat (limited to 'vendor/github.com/containerd/continuity/sysx/xattr.go')
-rw-r--r--vendor/github.com/containerd/continuity/sysx/xattr.go68
1 files changed, 30 insertions, 38 deletions
diff --git a/vendor/github.com/containerd/continuity/sysx/xattr.go b/vendor/github.com/containerd/continuity/sysx/xattr.go
index 9e4326dcf..db6fe70fe 100644
--- a/vendor/github.com/containerd/continuity/sysx/xattr.go
+++ b/vendor/github.com/containerd/continuity/sysx/xattr.go
@@ -20,7 +20,6 @@ package sysx
import (
"bytes"
- "syscall"
"golang.org/x/sys/unix"
)
@@ -66,60 +65,53 @@ func LGetxattr(path, attr string) ([]byte, error) {
return getxattrAll(path, attr, unix.Lgetxattr)
}
-const defaultXattrBufferSize = 5
+const defaultXattrBufferSize = 128
type listxattrFunc func(path string, dest []byte) (int, error)
func listxattrAll(path string, listFunc listxattrFunc) ([]string, error) {
- var p []byte // nil on first execution
-
- for {
- n, err := listFunc(path, p) // first call gets buffer size.
+ buf := make([]byte, defaultXattrBufferSize)
+ n, err := listFunc(path, buf)
+ for err == unix.ERANGE {
+ // Buffer too small, use zero-sized buffer to get the actual size
+ n, err = listFunc(path, []byte{})
if err != nil {
return nil, err
}
+ buf = make([]byte, n)
+ n, err = listFunc(path, buf)
+ }
+ if err != nil {
+ return nil, err
+ }
- if n > len(p) {
- p = make([]byte, n)
- continue
- }
-
- p = p[:n]
-
- ps := bytes.Split(bytes.TrimSuffix(p, []byte{0}), []byte{0})
- var entries []string
- for _, p := range ps {
- s := string(p)
- if s != "" {
- entries = append(entries, s)
- }
+ ps := bytes.Split(bytes.TrimSuffix(buf[:n], []byte{0}), []byte{0})
+ var entries []string
+ for _, p := range ps {
+ if len(p) > 0 {
+ entries = append(entries, string(p))
}
-
- return entries, nil
}
+
+ return entries, nil
}
type getxattrFunc func(string, string, []byte) (int, error)
func getxattrAll(path, attr string, getFunc getxattrFunc) ([]byte, error) {
- p := make([]byte, defaultXattrBufferSize)
- for {
- n, err := getFunc(path, attr, p)
+ buf := make([]byte, defaultXattrBufferSize)
+ n, err := getFunc(path, attr, buf)
+ for err == unix.ERANGE {
+ // Buffer too small, use zero-sized buffer to get the actual size
+ n, err = getFunc(path, attr, []byte{})
if err != nil {
- if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERANGE {
- p = make([]byte, len(p)*2) // this can't be ideal.
- continue // try again!
- }
-
return nil, err
}
-
- // realloc to correct size and repeat
- if n > len(p) {
- p = make([]byte, n)
- continue
- }
-
- return p[:n], nil
+ buf = make([]byte, n)
+ n, err = getFunc(path, attr, buf)
+ }
+ if err != nil {
+ return nil, err
}
+ return buf[:n], nil
}