docs/src/release-notes/0.9.0.md
We are excited to announce the release of Rust Coreutils 0.9.0 - a release focused on safety and security. This cycle was shaped by a third-party security audit, driving extensive TOCTOU hardening and a sustained, project-wide effort to shrink the amount of unsafe code by removing it outright and migrating low-level syscalls from nix/libc to rustix. On top of that, we landed major zero-copy I/O performance work (splice/tee/pipe), broadened WebAssembly, Cygwin and Windows support, and continued contributing tests and bug reports upstream to GNU coreutils.
| Result | 0.8.0 | 0.9.0 | Change 0.8.0 to 0.9.0 | % Total 0.8.0 | % Total 0.9.0 | % Change 0.8.0 to 0.9.0 |
|---|---|---|---|---|---|---|
| Pass | 630 | 625 | -5 | 94.74% | 90.58% | -4.16% |
| Skip | 14 | 8 | -6 | 2.11% | 1.16% | -0.95% |
| Fail | 21 | 56 | +35 | 3.16% | 8.12% | +4.96% |
| Error | 0 | 1 | +1 | 0% | 0.14% | +0.14% |
| Total | 665 | 690 | +25 (new tests) |
Note: The rise in failing tests is due to the upstream GNU test suite being extended, not to regressions on our side. We updated our GNU reference from 9.10 to 9.11 (PR #11922), which added 25 new tests (665 → 690). Many of these newly-introduced tests are not yet passing, which accounts for the jump from 21 to 56 failures; no previously-passing functionality regressed, and work is ongoing to address the new tests.
Security Hardening (Zellic audit)
uucore::safe_copy module; TOCTOU fixes in cp, mv, and chmod recursive traversal; rm dot/dotdot path-parsing protection; nohup.out now created with mode 0600; and chroot now resolves all ids before chrootingReducing unsafe & migrating to rustix
unsafe surface: dozens of unsafe removals across utilities, tests, fuzz targets and uucore (get_groups, make_fifo, build.rs, and more)nix/libc to rustix across id, tr, timeout, sort, wc, tail, cp, who, factor, and core process/IO pathsPerformance
splice()/tee()/pipe() fast paths landed across cat, wc, head, tail, yes, cp, tee, and unexpand (e.g. unexpand +7.5%, faster cp from a pipe on Linux, tee via raw syscalls, yes using the tee syscall)uucore::pipes / buf_copyGNU Compatibility & Upstream Collaboration
numfmt, date, tr, cksum, factor, head, stat, and sortnumfmt Overhaul
LC_NUMERIC decimal separator, zero-padding for negative numbers, IEC precision cap, large %f values, --to=auto exit code, and multi-byte --suffix width accountingls Improvements
ls -lF symlink target indicators, link-count column no longer inflated per-ACL-file, version-sorting and recursive-mode fixes, independent permissions-column widthls without writing everything to stdoutCross-platform Reach
ln, dd, mktemp, and tty.wasm; Cygwin CI and builds (date, stdbuf); Windows tty (incl. msys2 paths); OpenBSD triage improvementsInternationalization
numfmt and du now honor LC_NUMERIC for the decimal separatorContributions: This release was made possible by 30 new contributors joining our community
Try it in your browser - Online Playground powered by WebAssembly Help us translate - Contribute to Rust Coreutils on Weblate Sponsor us on GitHub to accelerate development: github.com/sponsors/uutils
print! and println! to avoid panicking on write errors by @RenjiSann in https://github.com/uutils/coreutils/pull/12099Cow by @ChrisDenton in https://github.com/uutils/coreutils/pull/11960needless_borrow lint on FreeBSD by @cakebaker in https://github.com/uutils/coreutils/pull/11791code() by @cakebaker in https://github.com/uutils/coreutils/pull/11803show_error instead of eprintln by @cakebaker in https://github.com/uutils/coreutils/pull/11932uu_ls so that crate users can call the ls without having to print everything to stdout by @fdncred in https://github.com/uutils/coreutils/pull/9851paths argument by @cakebaker in https://github.com/uutils/coreutils/pull/12113lines() instead of split('\n') in test by @cakebaker in https://github.com/uutils/coreutils/pull/12154ls -lF symlink target indicators by @joknarf in https://github.com/uutils/coreutils/pull/11554stderr_is("") in the tests by @cakebaker in https://github.com/uutils/coreutils/pull/12168find_stdout by @cakebaker in https://github.com/uutils/coreutils/pull/12146uflag to utf8 by @cakebaker in https://github.com/uutils/coreutils/pull/11826process feature of rustix by @cakebaker in https://github.com/uutils/coreutils/pull/11792redox_syscall to skip list by @cakebaker in https://github.com/uutils/coreutils/pull/11749rand to 0.10.1 by @cakebaker in https://github.com/uutils/coreutils/pull/11313notify by @cakebaker in https://github.com/uutils/coreutils/pull/11978redox_syscall from skip list by @cakebaker in https://github.com/uutils/coreutils/pull/12351cpufeatures and block-buffer from skip list by @cakebaker in https://github.com/uutils/coreutils/pull/12390ctor & adapt to change by @cakebaker in https://github.com/uutils/coreutils/pull/12132package fields by @xtqqczze in https://github.com/uutils/coreutils/pull/11968Full Changelog: https://github.com/uutils/coreutils/compare/0.8.0...0.9.0