Skip to content

Commit b0f5bc3

Browse files
authored
Merge pull request moby#42352 from AkihiroSuda/cherrypick-41724
[20.10 backport] Use v2 capabilities in layer archives
2 parents 497c50a + 2a0c446 commit b0f5bc3

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

integration/build/build_userns_linux_test.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,6 @@ func TestBuildUserNamespaceValidateCapabilitiesAreV2(t *testing.T) {
118118
_, err = stdcopy.StdCopy(actualStdout, actualStderr, logReader)
119119
assert.NilError(t, err)
120120
if strings.TrimSpace(actualStdout.String()) != "/bin/sleep cap_net_bind_service=eip" {
121-
// Activate when fix is merged: https://github.com/moby/moby/pull/41724
122-
//t.Fatalf("run produced invalid output: %q, expected %q", actualStdout.String(), "/bin/sleep cap_net_bind_service=eip")
123-
// t.Logf("run produced invalid output (expected until #41724 merges): %q, expected %q",
124-
// actualStdout.String(),
125-
// "/bin/sleep cap_net_bind_service=eip")
126-
} else {
127-
// Shouldn't happen until fix is merged: https://github.com/moby/moby/pull/41724
128-
t.Fatalf("run produced valid output (unexpected until #41724 merges): %q, expected %q",
129-
actualStdout.String(),
130-
"/bin/sleep cap_net_bind_service=eip")
121+
t.Fatalf("run produced invalid output: %q, expected %q", actualStdout.String(), "/bin/sleep cap_net_bind_service=eip")
131122
}
132123
}

pkg/archive/archive.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,24 @@ func fillGo18FileTypeBits(mode int64, fi os.FileInfo) int64 {
402402
// ReadSecurityXattrToTarHeader reads security.capability xattr from filesystem
403403
// to a tar header
404404
func ReadSecurityXattrToTarHeader(path string, hdr *tar.Header) error {
405+
const (
406+
// Values based on linux/include/uapi/linux/capability.h
407+
xattrCapsSz2 = 20
408+
versionOffset = 3
409+
vfsCapRevision2 = 2
410+
vfsCapRevision3 = 3
411+
)
405412
capability, _ := system.Lgetxattr(path, "security.capability")
406413
if capability != nil {
414+
length := len(capability)
415+
if capability[versionOffset] == vfsCapRevision3 {
416+
// Convert VFS_CAP_REVISION_3 to VFS_CAP_REVISION_2 as root UID makes no
417+
// sense outside the user namespace the archive is built in.
418+
capability[versionOffset] = vfsCapRevision2
419+
length = xattrCapsSz2
420+
}
407421
hdr.Xattrs = make(map[string]string)
408-
hdr.Xattrs["security.capability"] = string(capability)
422+
hdr.Xattrs["security.capability"] = string(capability[:length])
409423
}
410424
return nil
411425
}

0 commit comments

Comments
 (0)