diff --git a/CHANGELOG.md b/CHANGELOG.md index 32175538b1..0c28db40e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ # Changelog +## v1.28.1 (2022-11-19) + + copier.Put(): clear up os/syscall mode bit confusion + ## v1.28.0 (2022-09-30) Update vendor containers/(common,image) diff --git a/changelog.txt b/changelog.txt index 1d066f0686..e839ab2e3b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,6 @@ +- Changelog for v1.28.1 (2022-11-19) + * copier.Put(): clear up os/syscall mode bit confusion + - Changelog for v1.28.0 (2022-09-30) * Update vendor containers/(common,image) * [CI:DOCS] Add quay-description update reminder diff --git a/copier/copier.go b/copier/copier.go index 6d4c81c67a..5a1b489d3c 100644 --- a/copier/copier.go +++ b/copier/copier.go @@ -1566,15 +1566,15 @@ func copierHandlerPut(bulkReader io.Reader, req request, idMappings *idtools.IDM return nil } makeDirectoryWriteable := func(directory string) error { - st, err := os.Lstat(directory) - if err != nil { - return fmt.Errorf("copier: put: error reading permissions of directory %q: %w", directory, err) - } - mode := st.Mode() & os.ModePerm if _, ok := directoryModes[directory]; !ok { + st, err := os.Lstat(directory) + if err != nil { + return fmt.Errorf("copier: put: error reading permissions of directory %q: %w", directory, err) + } + mode := st.Mode() directoryModes[directory] = mode } - if err = os.Chmod(directory, 0o700); err != nil { + if err := os.Chmod(directory, 0o700); err != nil { return fmt.Errorf("copier: put: error making directory %q writable: %w", directory, err) } return nil @@ -1862,16 +1862,21 @@ func copierHandlerPut(bulkReader io.Reader, req request, idMappings *idtools.IDM // set other bits that might have been reset by chown() if hdr.Typeflag != tar.TypeSymlink { if hdr.Mode&cISUID == cISUID { - mode |= syscall.S_ISUID + mode |= os.ModeSetuid } if hdr.Mode&cISGID == cISGID { - mode |= syscall.S_ISGID + mode |= os.ModeSetgid } if hdr.Mode&cISVTX == cISVTX { - mode |= syscall.S_ISVTX + mode |= os.ModeSticky + } + if hdr.Typeflag == tar.TypeDir { + // if/when we do the final setting of permissions on this + // directory, make sure to incorporate these bits, too + directoryModes[path] = mode } - if err = syscall.Chmod(path, uint32(mode)); err != nil { - return fmt.Errorf("setting additional permissions on %q to 0%o: %w", path, mode, err) + if err = os.Chmod(path, mode); err != nil { + return fmt.Errorf("copier: put: setting additional permissions on %q to 0%o: %w", path, mode, err) } } // set xattrs, including some that might have been reset by chown() diff --git a/define/types.go b/define/types.go index ae088a43d5..7ba36ca830 100644 --- a/define/types.go +++ b/define/types.go @@ -30,7 +30,7 @@ const ( Package = "buildah" // Version for the Package. Bump version in contrib/rpm/buildah.spec // too. - Version = "1.28.0" + Version = "1.28.1" // DefaultRuntime if containers.conf fails. DefaultRuntime = "runc" diff --git a/tests/bud.bats b/tests/bud.bats index 24c7cec295..ec7d8e3dfd 100644 --- a/tests/bud.bats +++ b/tests/bud.bats @@ -4110,7 +4110,7 @@ _EOF run_buildah tag image-amd localhost/ubi8-minimal run_buildah build -f Containerfile --pull=false -q --arch=arm64 -t image-arm $WITH_POLICY_JSON ${mytmpdir} run_buildah inspect --format '{{ index .Docker.Config.Labels "architecture" }}' image-arm - expect_output --substring arm64 + expect_output --substring aarch64 run_buildah inspect --format '{{ .FromImageID }}' image-arm fromiid=$output diff --git a/tests/conformance/conformance_test.go b/tests/conformance/conformance_test.go index 49fe1dafca..7f2a8cc291 100644 --- a/tests/conformance/conformance_test.go +++ b/tests/conformance/conformance_test.go @@ -1863,6 +1863,42 @@ var internalTestCases = []testCase{ if _, err = io.Copy(tw, bytes.NewReader([]byte("whatever"))); err != nil { return fmt.Errorf("writing tar archive content: %w", err) } + hdr = tar.Header{ + Name: "setuid-dir", + Uid: 0, + Gid: 0, + Typeflag: tar.TypeDir, + Size: 0, + Mode: cISUID | 0755, + ModTime: testDate, + } + if err = tw.WriteHeader(&hdr); err != nil { + return fmt.Errorf("error writing tar archive header: %w", err) + } + hdr = tar.Header{ + Name: "setgid-dir", + Uid: 0, + Gid: 0, + Typeflag: tar.TypeDir, + Size: 0, + Mode: cISGID | 0755, + ModTime: testDate, + } + if err = tw.WriteHeader(&hdr); err != nil { + return fmt.Errorf("error writing tar archive header: %w", err) + } + hdr = tar.Header{ + Name: "sticky-dir", + Uid: 0, + Gid: 0, + Typeflag: tar.TypeDir, + Size: 0, + Mode: cISVTX | 0755, + ModTime: testDate, + } + if err = tw.WriteHeader(&hdr); err != nil { + return fmt.Errorf("error writing tar archive header: %w", err) + } return nil }, },