Skip to content

Commit

Permalink
pkg/system: return even richer xattr errors
Browse files Browse the repository at this point in the history
The names of extended attributes are not completely freeform. Attributes
are namespaced, and the kernel enforces (among other things) that only
attributes whose names are prefixed with a valid namespace are
permitted. The name of the attribute therefore needs to be known in
order to diagnose issues with lsetxattr. Include the name of the
extended attribute in the errors returned from the Lsetxattr and
Lgetxattr so users and us can more easily troubleshoot xattr-related
issues. Include the name in a separate rich-error field to provide code
handling the error enough information to determine whether or not the
failure can be ignored.

Signed-off-by: Cory Snider <csnider@mirantis.com>
  • Loading branch information
corhere committed Jan 22, 2024
1 parent c87e0ad commit 43bf65c
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 9 deletions.
7 changes: 5 additions & 2 deletions builder/remotecontext/archive.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/docker/docker/pkg/archive"
"github.com/docker/docker/pkg/chrootarchive"
"github.com/docker/docker/pkg/longpath"
"github.com/docker/docker/pkg/system"
"github.com/docker/docker/pkg/tarsum"
"github.com/moby/sys/symlink"
"github.com/pkg/errors"
Expand All @@ -24,9 +25,11 @@ func (c *archiveContext) Close() error {
}

func convertPathError(err error, cleanpath string) error {
if err, ok := err.(*os.PathError); ok {
switch err := err.(type) {
case *os.PathError:
err.Path = cleanpath
case *system.XattrError:
err.Path = cleanpath
return err
}
return err
}
Expand Down
18 changes: 18 additions & 0 deletions pkg/system/xattrs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package system // import "github.com/docker/docker/pkg/system"

type XattrError struct {
Op string
Attr string
Path string
Err error
}

func (e *XattrError) Error() string { return e.Op + " " + e.Attr + " " + e.Path + ": " + e.Err.Error() }

func (e *XattrError) Unwrap() error { return e.Err }

// Timeout reports whether this error represents a timeout.
func (e *XattrError) Timeout() bool {
t, ok := e.Err.(interface{ Timeout() bool })
return ok && t.Timeout()
}
12 changes: 5 additions & 7 deletions pkg/system/xattrs_linux.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package system // import "github.com/docker/docker/pkg/system"

import (
"io/fs"

"golang.org/x/sys/unix"
)

// Lgetxattr retrieves the value of the extended attribute identified by attr
// and associated with the given path in the file system.
// It will returns a nil slice and nil error if the xattr is not set.
func Lgetxattr(path string, attr string) ([]byte, error) {
pathErr := func(err error) ([]byte, error) {
return nil, &fs.PathError{Op: "lgetxattr", Path: path, Err: err}
sysErr := func(err error) ([]byte, error) {
return nil, &XattrError{Op: "lgetxattr", Attr: attr, Path: path, Err: err}
}

// Start with a 128 length byte array
Expand All @@ -22,7 +20,7 @@ func Lgetxattr(path string, attr string) ([]byte, error) {
// Buffer too small, use zero-sized buffer to get the actual size
sz, errno = unix.Lgetxattr(path, attr, []byte{})
if errno != nil {
return pathErr(errno)
return sysErr(errno)
}
dest = make([]byte, sz)
sz, errno = unix.Lgetxattr(path, attr, dest)
Expand All @@ -32,7 +30,7 @@ func Lgetxattr(path string, attr string) ([]byte, error) {
case errno == unix.ENODATA:
return nil, nil
case errno != nil:
return pathErr(errno)
return sysErr(errno)
}

return dest[:sz], nil
Expand All @@ -43,7 +41,7 @@ func Lgetxattr(path string, attr string) ([]byte, error) {
func Lsetxattr(path string, attr string, data []byte, flags int) error {
err := unix.Lsetxattr(path, attr, data, flags)
if err != nil {
return &fs.PathError{Op: "lsetxattr", Path: path, Err: err}
return &XattrError{Op: "lsetxattr", Attr: attr, Path: path, Err: err}
}
return nil
}

0 comments on commit 43bf65c

Please sign in to comment.