Skip to content

build: add musl support - #70

Open
KnorpelSenf wants to merge 1 commit into
rustls:mainfrom
KnorpelSenf:musl
Open

build: add musl support#70
KnorpelSenf wants to merge 1 commit into
rustls:mainfrom
KnorpelSenf:musl

Conversation

@KnorpelSenf

Copy link
Copy Markdown

This uses unsafe Rust to create zero'ed structs first, and then explicitly set the known fields. As a result, the hidden padding fields are filled with zeros, too, so we can compile with musl.

Please note that I haven't spent too much time on ktls-related things yet, so please tell me if I am making a stupid mistake right now. The changes make perfect sense to me and align with the kernel manpages as far as I can tell, but you never know.

The repro docker script from #69 passes on this branch:

$ docker build --progress=none -t ktls-repro .
$ docker run --rm --cap-add=NET_ADMIN -it ktls-repro
ktls smoke test passed

Closes #69.

This uses unsafe Rust to create zero'ed structs
first, and then explicitly set the known options.
As a result, the hidden padding fields are
untouched so we can compile with musl.
@KnorpelSenf KnorpelSenf mentioned this pull request May 4, 2026
kvinwang added a commit to Dstack-TEE/dstack that referenced this pull request Jul 27, 2026
The gateway CVM app image is built for x86_64-unknown-linux-musl, and ktls 6.0.2
does not compile for it:

  error[E0063]: missing field `__pad1` in initializer of `cmsghdr`
  error: cannot construct `msghdr` with struct literal syntax due to private fields

The crate builds both structs with struct literal syntax. That is fine on glibc,
where they have exactly the members it names, but musl declares msg_iovlen and
msg_controllen as int/socklen_t followed by explicit padding, and libc models
that with private __pad1/__pad2 members a literal cannot name. So this is a
permanent property of musl's ABI rather than a libc regression, and 6.0.2 is the
latest published release -- there is no version to bump to.

rustls/ktls#70 fixes it by building both from std::mem::zeroed() field by field.
It has been open since 2026-05-04. Rather than point the dependency at the
contributor's fork -- a moving, non-crates.io source for the crate that installs
session keys into the kernel, in a build that otherwise pins everything down to
package versions and image digests -- the 6.0.2 release is vendored with only
that patch applied. Each hunk is marked, dev-dependencies are dropped, and
vendor/README.md records the provenance and the condition for deleting it again.

ktls was the only thing blocking the musl build (confirmed with --keep-going).

Verified by running both binaries against the same backend: a 100 MiB transfer
through the terminate path checksums correctly, kTLS actually engages
(ktls_offloaded=2, ktls_offload_failed=0) and TlsDecryptError stays at 0 for the
glibc and the static musl build alike. The patched code is on the close_notify
path, so compiling was not the interesting half.
kvinwang added a commit to Dstack-TEE/dstack that referenced this pull request Jul 27, 2026
The gateway CVM app image is built for x86_64-unknown-linux-musl, and ktls 6.0.2
does not compile for it:

  error[E0063]: missing field `__pad1` in initializer of `cmsghdr`
  error: cannot construct `msghdr` with struct literal syntax due to private fields

The crate builds both structs with struct literal syntax. That is fine on glibc,
where they have exactly the members it names, but musl declares msg_iovlen and
msg_controllen as int/socklen_t followed by explicit padding, and libc models
that with private __pad1/__pad2 members a literal cannot name. So this is a
permanent property of musl's ABI rather than a libc regression, and 6.0.2 is the
latest published release -- there is no version to bump to.

rustls/ktls#70 fixes it by building both from std::mem::zeroed() field by field.
It has been open since 2026-05-04. Rather than point the dependency at the
contributor's fork -- a moving, non-crates.io source for the crate that installs
session keys into the kernel, in a build that otherwise pins everything down to
package versions and image digests -- the 6.0.2 release is vendored with only
that patch applied. Each hunk is marked, dev-dependencies are dropped, and
vendor/README.md records the provenance and the condition for deleting it again.

ktls was the only thing blocking the musl build (confirmed with --keep-going).

Verified by running both binaries against the same backend: a 100 MiB transfer
through the terminate path checksums correctly, kTLS actually engages
(ktls_offloaded=2, ktls_offload_failed=0) and TlsDecryptError stays at 0 for the
glibc and the static musl build alike. The patched code is on the close_notify
path, so compiling was not the interesting half.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add musl support

1 participant