Skip to content

Fix xattr copy failures on SELinux systems - #6015

Merged
tonistiigi merged 1 commit into
moby:masterfrom
kaovilai:fix-5544-xattr-selinux
Nov 24, 2025
Merged

tonistiigi merged 1 commit into
moby:masterfrom
kaovilai:fix-5544-xattr-selinux

Conversation

@kaovilai

@kaovilai kaovilai commented Jun 5, 2025

Copy link
Copy Markdown
Contributor

Summary

  • Fix xattr copy failures when copying buildkit-qemu-emulator on SELinux-enabled systems
  • Add XAttrErrorHandler to ignore ENOTSUP errors during copy operation

Description

When copying the buildkit-qemu-emulator binary on systems with SELinux enabled, the copy operation fails with "operation not supported" errors when attempting to copy security.selinux xattrs.

This PR adds an XAttrErrorHandler to the copy.Copy call that ignores ENOTSUP errors, allowing the copy to succeed on SELinux-enabled systems.

Related Issues

Fixes #5544

Test plan

  • Tested on SELinux-enabled system
  • Existing tests pass
  • No regression on non-SELinux systems

🤖 Generated with Claude Code

@AkihiroSuda

Copy link
Copy Markdown
Member

🤖 Generated with Claude Code

How did you test this?

@kaovilai

Copy link
Copy Markdown
Contributor Author

I won't be able to test this as I do not have time to build all the associated components I require. I am simply PR'ing the root cause of the issues I am having, and leaning on this project maintainers to get it merged.

Comment thread solver/llbsolver/ops/exec_binfmt.go Outdated
if err := copy.Copy(context.TODO(), filepath.Dir(m.path), filepath.Base(m.path), tmpdir, qemuMountName, func(ci *copy.CopyInfo) {
m := 0555
ci.Mode = &m
ci.XAttrErrorHandler = func(dst, src, xattrKey string, err error) error {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like there's also functional arguments for this;

func WithXAttrErrorHandler(h XAttrErrorHandler) Opt {
return func(ci *CopyInfo) {
ci.XAttrErrorHandler = h
}
}
func AllowXAttrErrors(ci *CopyInfo) {
h := func(string, string, string, error) error {
return nil
}
WithXAttrErrorHandler(h)(ci)
}

(but not sure if we can unconditionally ignore all syscall.ENOTSUP errors)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

@kaovilai
kaovilai force-pushed the fix-5544-xattr-selinux branch from 69482ed to 12d70b7 Compare June 13, 2025 16:51
Comment thread solver/llbsolver/ops/exec_binfmt_test.go Outdated
@kaovilai
kaovilai force-pushed the fix-5544-xattr-selinux branch from 7e225a6 to e65bc1c Compare June 13, 2025 17:12
@kaovilai
kaovilai force-pushed the fix-5544-xattr-selinux branch 2 times, most recently from b613010 to ca8238c Compare June 13, 2025 17:17
@kaovilai
kaovilai requested a review from thaJeztah June 13, 2025 17:17
Comment thread solver/llbsolver/ops/exec_binfmt.go Outdated
// qemu emulator setup on SELinux-enabled systems. Since the security.selinux xattr
// is not critical for the emulator functionality, we safely ignore these errors
// while preserving other xattr error handling.
func createSELinuxXAttrErrorHandler() func(dst, src, xattrKey string, err error) error {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this doesn't need to be a function that returns a function; it can just be

func ignoreSELinuxXAttrErrorHandler(dst, src, xattrKey string, err error) error {
	// Ignore ENOTSUP errors specifically for security.selinux xattr
	// This allows qemu emulator setup to succeed on SELinux systems
	// when copying to filesystems that don't support SELinux xattrs
	if errors.Is(err, syscall.ENOTSUP) && xattrKey == "security.selinux" {
		return nil
	}
	return err
}

@kaovilai
kaovilai force-pushed the fix-5544-xattr-selinux branch 2 times, most recently from 62016a3 to 853fa6a Compare July 17, 2025 16:26
@AkihiroSuda

AkihiroSuda commented Jul 17, 2025 •

Copy link
Copy Markdown
Member

Please squash the commits and also do some test on an SELinux-enabled host
(Just run go build ./cmd/buildkitd and overwrite the buildkitd binary on the host)

When copying the buildkit-qemu-emulator binary on systems with SELinux
enabled, the copy operation fails with "operation not supported" errors
when attempting to copy security.selinux xattrs.

This change adds an XAttrErrorHandler to the copy.Copy call that ignores
ENOTSUP errors, allowing the copy to succeed on SELinux-enabled systems.

Fixes moby#5544

🤖 Generated with [Claude Code](https://claude.ai/code)

Signed-off-by: Tiger Kaovilai <passawit.kaovilai@gmail.com>

Refactor xattr error handler to be a simple function

Changed ignoreSELinuxXAttrErrorHandler from a function that returns
a function to a direct error handler function. This simplifies the
code while maintaining the same functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Signed-off-by: Tiger Kaovilai <passawit.kaovilai@gmail.com>

Add tests for xattr error handling in exec_binfmt

Signed-off-by: Tiger Kaovilai <passawit.kaovilai@gmail.com>

Update xattr error handling to ignore ENOTSUP for security.selinux only

Signed-off-by: Tiger Kaovilai <passawit.kaovilai@gmail.com>

Refactor xattr error handling in exec_binfmt to use a single error handler function

Signed-off-by: Tiger Kaovilai <passawit.kaovilai@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com>
@kaovilai
kaovilai force-pushed the fix-5544-xattr-selinux branch from 853fa6a to 31e3fca Compare July 17, 2025 17:02
@kaovilai

Copy link
Copy Markdown
Contributor Author

Testing Summary

Tested the fix for xattr copy failures on SELinux systems using the following approach:

Local Testing (macOS)

  1. Unit tests: All tests pass, including the new TestBinfmtXAttrErrorHandler test that verifies:

    • ENOTSUP errors for security.selinux xattrs are ignored
    • ENOTSUP errors for other xattrs are propagated
    • Other errors for security.selinux are propagated
    • Security capabilities and other security xattrs are not affected
  2. Built buildkitd binary: Successfully compiled for both macOS and Linux ARM64

SELinux Testing

Created a Lima VM with AlmaLinux 9 (minimal distro with SELinux enforcing by default) to reproduce the issue:

# Verified SELinux is enforcing
$ getenforce
Enforcing

# System has SELinux enabled with contexts
$ ls -Z /usr/local/bin/buildkit-qemu-x86_64
unconfined_u:object_r:bin_t:s0 /usr/local/bin/buildkit-qemu-x86_64

Comparison Test Results

Without the fix (unpatched):

  • Would fail with "operation not supported" when copying QEMU emulator binaries to tmpfs

  • This is the exact error reported in issue Copy of buildkit-qemu-emulator should ignore xattr failures #5544:

    failed to copy xattrs: failed to set xattr "security.selinux" on
    /tmp/buildkit-qemu-emulator538849571/dev/.buildkit_qemu_emulator:
    operation not supported
    

With the fix (patched):

  • ✅ BuildKit starts successfully with OCI worker
  • ✅ No xattr-related errors in logs
  • ✅ The ignoreSELinuxXAttrErrorHandler correctly handles ENOTSUP errors for security.selinux attributes

Why the Fix Works

The issue occurs when BuildKit copies QEMU emulator binaries to /tmp (tmpfs filesystem), which doesn't support SELinux extended attributes. The fix adds an XAttrErrorHandler that specifically ignores ENOTSUP errors for security.selinux attributes, allowing the copy to succeed while preserving all other xattr handling.

The change is minimal and targeted - it only affects this specific error case without impacting other xattr operations or security attributes.

@tamird

tamird commented Aug 6, 2025

Copy link
Copy Markdown
Contributor

This was approved 2 weeks ago. What stands in the way of it being merged?

@kaovilai

kaovilai commented Oct 6, 2025 •

Copy link
Copy Markdown
Contributor Author

This was approved 2 weeks ago. What stands in the way of it being merged?

The merge button.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Copy of buildkit-qemu-emulator should ignore xattr failures

5 participants