Rust Coreutils 0.9.0 Release:
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.
GNU Test Suite Compatibility:
| 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.
Highlights:
-
Security Hardening (Zellic audit)
- A third-party security audit by Zellic reviewed the codebase; the findings - widely reported as 44 CVEs (see also the Ubuntu update and the corrode write-up Bugs Rust won't catch) - were concentrated in TOCTOU races and filesystem edge cases that Rust's type system does not prevent
- It's worth noting that many of these CVEs are not memory-safety issues but differences in behavior from GNU coreutils that the audit identified; aligning our semantics with GNU resolves them
- This release closes many of them: a new TOCTOU-resistant
uucore::safe_copymodule; TOCTOU fixes incp,mv, andchmodrecursive traversal;rmdot/dotdot path-parsing protection;nohup.outnow created with mode0600; andchrootnow resolves all ids before chrooting
-
Reducing
unsafe& migrating torustix- A sustained, project-wide push to shrink the
unsafesurface: dozens ofunsaferemovals across utilities, tests, fuzz targets anduucore(get_groups,make_fifo,build.rs, and more) - Migration from
nix/libctorustixacrossid,tr,timeout,sort,wc,tail,cp,who,factor, and core process/IO paths
- A sustained, project-wide push to shrink the
-
Performance
splice()/tee()/pipe()fast paths landed acrosscat,wc,head,tail,yes,cp,tee, andunexpand(e.g.unexpand+7.5%, fastercpfrom a pipe on Linux,teevia raw syscalls,yesusing theteesyscall)- Consolidated in a reworked
uucore::pipes/buf_copy
-
GNU Compatibility & Upstream Collaboration
- Reference bumped to GNU 9.11, which extended the suite with 25 new tests (the reason the failure count went up - see the note above; it is not a regression)
- We continue to contribute tests and bug reports upstream to GNU coreutils, and our compatibility work keeps surfacing edge cases on both sides
- New fixes across
numfmt,date,tr,cksum,factor,head,stat, andsort
-
numfmtOverhaul- Precision handling, rejection of scientific notation,
LC_NUMERICdecimal separator, zero-padding for negative numbers, IEC precision cap, large%fvalues,--to=autoexit code, and multi-byte--suffixwidth accounting
- Precision handling, rejection of scientific notation,
-
lsImprovementsls -lFsymlink target indicators, link-count column no longer inflated per-ACL-file, version-sorting and recursive-mode fixes, independent permissions-column width- Refactor letting crate users (e.g. nushell) call
lswithout writing everything to stdout
-
Cross-platform Reach
- WASI/wasm support for
ln,dd,mktemp, andtty.wasm; Cygwin CI and builds (date,stdbuf); Windowstty(incl. msys2 paths); OpenBSD triage improvements
- WASI/wasm support for
-
Internationalization
numfmtanddunow honorLC_NUMERICfor the decimal separator
-
Contributions: This release was made possible by 30 new contributors joining our community
Call to Action:
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
What's Changed
cat
- cat: avoid unnecessary allocation by @oech3 in #11675
- cat: do not splice() on FUSE by @oech3 in #11723
- cat: replace copy_exact() with write_all by @oech3 in #11800
- cat: remove collapsible_if by @oech3 in #11884
- cat: call pipe() once with multiple input by @oech3 in #11699
- cat: avoid unnecessary alloc on Linux by @oech3 in #11906
- cat: remove unsafe from test code by @oech3 in #12027
- cat: simplify match by @oech3 in #12178
- cat: remove line buffering by @oech3 in #12190
- cat: dedup print_unbuffered by @oech3 in #12214
- cat: remove splice.rs by @oech3 in #12404
chroot
cksum
- cksum: fix parsing error with tagged cheksum files by @frenchua in #11704
- cksum: get rid of
print!andprintln!to avoid panicking on write errors by @RenjiSann in #12099 - cksum: Fix --check filename escaping for 9.11 by @RenjiSann in #12156
- cksum: Introduce HashLength newtype to avoid byte/bit misuse by @RenjiSann in #12235
coreutils
- coreutils: --help args is same with --help by @oech3 in #11367
- coreutils: fix panic on linux < 6.4 when /proc is not mounted by @oech3 in #12104
cp
- cp: improve throughput with pipe input (Linux only) by @oech3 in #11798
- cp: fix fail-perm GNU test adaptation by @karanabe in #12119
- chore(cp): : move raw libc calls to rustix by @Alonely0 in #12112
date
- date: replace regex with hand-written format spec parser by @sylvestre in #11758
- date: use cfg unix by @oech3 in #11952
- date: width prefix in %N format specifier is ignored ( %3N, %6N always output full 9 nanosecond digits) #12001 by @Devel08 in #12010
- date: fix build for cygwin by @oech3 in #12309
- date: re-zone trailing TZ abbreviation input to local timezone by @0xSoftBoi in #12327
dd
- dd: remove collapsible_if by @oech3 in #11885
- dd: exit when bs/ibs/obs/cbs isn't positive by @iburaky2 in #11630
- dd: support wasm32-wasip1 by @pocopepe in #12258
- dd: fix OOM panic with skip=1 by @oech3 in #12399
df
dirname
- dirname: get rid of needless
Cowby @ChrisDenton in #11960
du
- du: fix error from
needless_borrowlint on FreeBSD by @cakebaker in #11791 - du: remove unnecessary implementation of
code()by @cakebaker in #11803 - du: make du -a -s error by @oech3 in #11917
- du: Allow command-line argument that appears more than once by @ajanicij in #11897
- refactor(du): simplify error handling by @xtqqczze in #11957
- du: propagate errors from --exclude-from instead of panicking by @rossilor95 in #11996
- du: honor LC_NUMERIC for decimal separator by @eyupcanakman in #12357
echo
env
- tests(env): increase signal delivery delay to fix flaky macOS CI by @sylvestre in #11829
expr
- expr: avoid panic on regex retry-limit by @eyupcanakman in #11833
factor
- factor: emit GNU 9.11 'is not a valid positive integer' for stdin input by @sylvestre in #12137
- factor: remove unsafe str::from_utf8_unchecked by @oech3 in #12142
fmt
head
- head: remove collapsible_if by @oech3 in #11883
- refactor(head): rename read functions to print for clarity by @xtqqczze in #11988
- head: remove print(ln) macros by @oech3 in #11974
- head: catch I/O error with -c 1 by @oech3 in #12030
- head: strip os error suffix from stdout write error message by @sylvestre in #12121
- head: fix -c0 and -n0 on directories to match GNU behavior by @sylvestre in #12217
- head/tail: use OPTION rather than FLAG by @fnadeau in #12301
id
- fix(id): refine feature checks for SELinux and SMACK support by @xtqqczze in #12047
- id: replace nix by rustix by @oech3 in #12164
install
- fix(install): follow symlink components in destination path with -D by @abendrothj in #11505
- install: update comments and tests after symlink follow behavior change by @Ecordonnier in #12475
join
- join: remove collapsible_if by @oech3 in #11901
- join: use
show_errorinstead ofeprintlnby @cakebaker in #11932
ln
- ln: Improve to LnError and make public fns for nushell by @dmatos2012 in #12009
- ln: add WASI support via symlink_path by @DePasqualeOrg in #11713
logname
- fix(logname): return error exit code when there is an error by @rodrigost23 in #9313
ls
- ls: drop #[allow(clippy::needless_bool)] by @oech3 in #11739
- ls: fix link-count column inflating per ACL file by @sylvestre in #11781
- refactor
uu_lsso that crate users can call thelswithout having to print everything to stdout by @fdncred in #9851 - ls: restore WASI ".." metadata fallback in collect_directory_entries by @sylvestre in #11930
- ls: use cfg unix by @oech3 in #11953
- ls: fix comparisons in version sorting and recursive mode by @Alonely0 in #12108
- ls: hide
pathsargument by @cakebaker in #12113 - fix(ls): respect sorting when grouping directories; disambiguate size sorting properly by @Alonely0 in #12109
- ls: use
lines()instead ofsplit('\n')in test by @cakebaker in #12154 - ls: track permissions column width independently by @sylvestre in #12411
- ls:
ls -lFsymlink target indicators by @joknarf in #11554 - ls: simplify symlink target indicator logic by @sylvestre in #12508
md5sum
- md5sum: remove some
stderr_is("")in the tests by @cakebaker in #12168
mkdir
- mkdir: acl and permission inheritance with -p by @j5awry in #11931
- mkdir: simplify umask shaping and add regression tests by @sylvestre in #12467
mknod
mktemp
- mktemp: build for wasip1 by @oech3 in #12319
- mktemp: fix hidden file creation with dot prefix by @gabrielhnf in #12311
- mktemp: ensure that "-q XX" shows error msg by @cakebaker in #12492
more
- refactor(more): avoid Box by @xtqqczze in #12090
- more: replace InputType enum with Input struct; cache file_size by @aaron-ang in #12225
- more: gate tty-only writes; extract clear_line/highlight_text by @aaron-ang in #12224
- more: replace nix::unistd with std::fs by @xtqqczze in #12268
mv
- mv: preserve ownership (uid/gid) on cross-device moves by @sylvestre in #11706
- mv: merge two "unix" blocks by @cakebaker in #11820
- mv: dedup libc by @oech3 in #12242
nl
- nl: continue if a file can't be opened by @cakebaker in #11983
nohup
- nohup: simplify cfg & use compile_error! by @oech3 in #11912
- nohup: reduce unsafe by @oech3 in #12111
- nohup: remove unsafe stub by @oech3 in #12125
- nohup: refactor
find_stdoutby @cakebaker in #12146
nproc
numfmt
- numfmt: apply prefix after scaling for --to-unit by @BipulLamsal in #11684
- numfmt: fix zero-padding placement for negative numbers by @Sim-hu in #11694
- numfmt:fix issue #11653 & correct test cases by @THEMIScale in #11695
- fix(numfmt):fix precision loss for large numbers in #11654 by @THEMIScale in #11716
- numfmt: precision is ignored #11667 by @Devel08 in #11683
- numfmt: fix --to=auto to return with exitcode=1 by @BipulLamsal in #11701
- numfmt: honor LC_NUMERIC for decimal separator by @pocopepe in #11941
- numfmt: fix #11935 --invalid=warn/ignore/fail ignores mode when rejecting scientific notation by @Devel08 in #11945
- numfmt: cap IEC precision at 3 decimals by @pocopepe in #11959
- numfmt: --format width accounting diverges from GNU for multi-byte --suffix #11937 fix by @Devel08 in #11992
- numfmt: fix rounding for small scaled values by @hayato0909 in #12032
- numfmt: reject %f values too large to format exactly by @pocopepe in #12012
od
- od: remove collapsible_if by @oech3 in #11900
- od: hex byte offset case fix by @max-amb in #12175
- od: remove unsafe, GNU stdin compat on wasi by @oech3 in #12205
- od: generalize RawReader by @oech3 in #12220
paste
pathchk
pinky
pr
realpath
rm
rmdir
shred
- shred: fix --remove=unlink with relative paths by @gabrielhnf in #12516
sort
- fix(sort): always install SIGINT handler to ensure temp dir cleanup by @mattsu2020 in #11889
- fix(sort): explicitly clean up temp directory in TmpDirWrapper::Drop by @mattsu2020 in #11888
- Add sort_bench_merge benchmark for sort -m (merge) performance by @nonontb in #12022
- sort: Fix inconsistent sort orderg under i18n-collator with equal sorting keys. by @ksgk1 in #12013
- sort: add benchmark for locale UTF-8 sorting by @sylvestre in #12185
- sort: replace nix feature resource with rustix by @xtqqczze in #12275
- sort: remove nix from dep by @oech3 in #12378
- fix(sort): reject leading '+' in numeric (-n) sort by @leno23 in #12350
- sort: fix incorrect sort ordering/output corruption with long line inputs + add a test by @karlicoss in #12471
split
stat
- stat: warn once when QUOTING_STYLE env has an unknown value by @sylvestre in #12136
- stat: fix %N quoting of filenames containing control characters by @fullwoodenshovel in #12330
stdbuf
- stdbuf: support cross-platform building by @YumeYuka in #11609
- stdbuf: build on Windows (depending on cygwin dll) by @oech3 in #12329
stty
- stty: add two missing baud rates by @cakebaker in #11865
- stty: add support for tabs/-tabs combination settings by @sylvestre in #11735
sum
sync
- refactor(sync): DRY do_sync_with function by @hlsxx in #12033
- refactor(sync): remove unnecessary files move by @hlsxx in #12485
tail
- tail: replace unsafe libc::kill by rustix by @mattsu2020 in #11725
- tail: remove collapsible_if by @oech3 in #11890
- tail: fix panic on write error in bounded_tail by @rossilor95 in #11886
- tail: improve throughput for -c +0 by splice() by @oech3 in #11962
- tail: remove ?Sized by @oech3 in #12014
- test(tail): fix flaky test_follow_name_multiple on macOS by @naoNao89 in #9636
- tail: improve throughput for -c N file by @oech3 in #11979
- tail: reuse existing pipe when stdout is already a pipe by @dragutreis in #12463
tee
- tee: fix input with sleep by @oech3 in #11686
- tee: add short-read regression test by @kevinburke in #11784
- tee: remove unused returned usize by @oech3 in #11830
- tee: avoid 2 Err(e) at match by @oech3 in #11878
- tee: drop cfg for unsupported target by @oech3 in #11875
- tee: remove collapsible_if by @oech3 in #11876
- tee: move fn copy to MultiWriter & simplify by @oech3 in #11899
- tee: remove duplicated flush() by @oech3 in #11909
- tee: reduce line of code by @oech3 in #11892
- tee: merge logic of flush into write by @xtqqczze in #11893
- tee: remove dummy definition & unused return by @oech3 in #11923
- tee: drop unnecessary impl by @oech3 in #11933
- tee: restore alloc guard for small input by @oech3 in #11942
- tee: remove a var by @oech3 in #11947
- tee: remove unsafe from test code by @oech3 in #12025
- tee: move aborted to MultiWriter by @oech3 in #12078
- tee: add benchmark by @oech3 in #12134
- tee: drop libc from Cargo.toml by @oech3 in #12232
- tee: improve throughput by raw syscall by @oech3 in #12131
- tee: don't print EINTR by @oech3 in #12461
- tee: simplify code by @oech3 in #12493
- tee: restrict to NamedReader by @oech3 in #12510
timeout
- timeout: replace nix with rustix by @gabrielhnf in #12440
touch
- touch: add regression test for pre-epoch date on 32-bit by @sylvestre in #11817
tr
- tr: fix complemented class truncation ordering by @can1357 in #11406
- tr: drop '[:...:]' wrapper from invalid character class error by @sylvestre in #12122
- tr: replace nix by rustix by @oech3 in #12266
tty
- tty: Build for Windows by @oech3 in #12077
- tty: Build tty.wasm by @oech3 in #12079
- tty: support printing msys2 tty path by @ChrisDenton in #12083
unexpand
- unexpand: remove Box dyn - perf +7.5% by @oech3 in #11806
- unexpand: rename
uflagtoutf8by @cakebaker in #11826
uniq
uptime
wc
- wc: replace unsafe sysconf by rustix by @oech3 in #11707
- wc: introduce IS_POSIXLY_CORRECT static by @xtqqczze in #11853
- wc: avoid pipe() if input is pipe by @oech3 in #11636
- wc: Fix fallback when pipe() or splice() failed by @oech3 in #11990
- wc: remove else by @oech3 in #12165
- wc: reduce some nest by @oech3 in #12382
- wc: remove splice_exact by @oech3 in #12316
- wc: reduce lines of code by @oech3 in #12420
- wc: remove a nest by loop{} by @oech3 in #12502
who
- Fixed panic in who > /dev/full by @AntoxaBarin in #11767
- who: remove unsafe by @oech3 in #12074
yes
- yes: simplify logic for buffer creation by @oech3 in #11727
- yes: replace match by ok_or_else by @oech3 in #11740
- yes: use tee syscall as fast-path by @oech3 in #11458
- yes: avoid kernel side length validation by @oech3 in #12115
- yes: remove cfg & move ownership of buffer to fn exec by @oech3 in #12095
- yes: move import to the other imports by @cakebaker in #12153
- yes: remove unnecessary cfg by @oech3 in #12159
- yes: fix wrong assumption for stdout by @oech3 in #12249
- yes: reduce lines by cfg by @oech3 in #12295
- yes: don't mix buffered write and zero-copy by @oech3 in #12294
- yes: avoid ambiguous PAGE_SIZE by @oech3 in #12370
- yes: fix confusing 1.. and comment by @oech3 in #12424
- yes: dedup tee() by @oech3 in #12456
uucore
- fix(uucore): fix build failure by @xtqqczze in #11729
- uucore: simplify splice() by @oech3 in #11745
- uucore: replace nix of buf_copy by rustix by @oech3 in #11765
- uucore: replace nix of FS related parts by rustix by @oech3 in #11771
- uucore: enable
processfeature ofrustixby @cakebaker in #11792 - fix(uucore): use is_dir() instead of exists() for locale path resolution by @mattsu2020 in #11851
- cp, uucore: remove unused returned u64 by @oech3 in #11837
- uucore: remove returned and unused usize by @oech3 in #11920
- uucore: simplify fallback when splice failed by @oech3 in #11921
- uucore: splice fast-path for head -c & preliminary for dd, tail, split by @oech3 in #11844
- uucore: dedup code of unbounded splice with broker by @oech3 in #11928
- pipes.rs: add debug_assert! for RAM usage by @oech3 in #11994
- uucore, cat: move unbounded splice code by @oech3 in #12008
- safe_traversal.rs: remove 1 unsafe by @oech3 in #12029
- fix(fs): replace incorrect error handling with last_os_error by @xtqqczze in #12057
- refactor(buf_copy): remove unused code by @xtqqczze in #12081
- uucore: do not use Linux specific fn at tests by @oech3 in #12128
- uucore: fix cfg attributes causing dead code warnings by @xtqqczze in #12192
- pipes.rs: don't mix raw write and buffered write by @oech3 in #12195
- uucore: remove dead code by @xtqqczze in #12223
- uucore/build.rs: remove unsafe by @oech3 in #12237
- uucore: remove unsafe get_groups by @oech3 in #12270
- uucore/build.rs: small refactoring by @cakebaker in #12250
- uucore: remove unsafe make_fifo by @oech3 in #12243
- yes, uucore::pipes: merge pipe_with_size to pipe and catch fcntl err by @oech3 in #12285
- process: replace getuid with rustix::process::getuid by @Franklin-Qi in #12094
- buf_copy.rs: don't test a trivial io::copy wrapper by @oech3 in #12344
- od, uucore: Allow reusing RawReader by @oech3 in #12385
- uucore: upgrade md-5, sha1, sha2, sha3, digest to latest versions by @gabrielhnf in #12367
- pipes.rs: simplify trait and match by @oech3 in #12397
- buf_copy/linux.rs: drop unused trait by @oech3 in #12345
- pipes.rs: simplify dev_null & remove crate name from comment by @oech3 in #12408
- pipes.rs: simplify by io::copy & doc the case it cannot be used by @oech3 in #12415
- pipes.rs: remove fcntl overhead from splice_unbounded by @oech3 in #12422
- pipes.rs: avoid usage of bool by @oech3 in #12444
- pipes.rs: add missing count on fallback by @oech3 in #12451
- pipes.rs: deduplicate many cfg's by @oech3 in #12436
- pipes.rs: dedup code by including fallback to splice_exact by @oech3 in #12472
- pipes.rs: replace bool by Result<(),()> by @oech3 in #12454
- buf_copy: remove thin wrapper & useless conversion by @oech3 in #12487
- pipes.rs: alias std::io::Result<Result<(), ()>> by @oech3 in #12483
- simplify uucore::pipes::send_n_bytes by @oech3 in #12491
Security
- deps: bump rand to 0.10.1 to fix RUSTSEC-2026-0097 by @sylvestre in #11756
- tail: fix TOCTOU race in follow retry logic by @sylvestre in #11711
- rm: fix path parsing for dot/dotdot protection by @naoNao89 in #11005
- uucore: add safe_copy module with TOCTOU-resistant copy primitives by @sylvestre in #12130
- uucore/safe_copy: use rustix Mode flags to avoid mode_t width mismatch by @sylvestre in #12140
- chmod: fix TOCTOU race in recursive traversal by @mattsu2020 in #11918
- cp: address the remaining toctou issues by @sylvestre in #12135
- mv: fix the remaining TOCTOU by @sylvestre in #12170
- chroot: resolve all ids before chroot by @victor-prokhorov in #11211
- nohup: create nohup.out with mode 0600 by @c-tonneslan in #12339
Code Quality & Cleanup
- Deduplicate block size logic by @sylvestre in #11678
- tests: tail: skip test_follow_name_multiple on macOS by @sylvestre in #11709
- Add 'tests/tail/tail-n0f' to ignore list by @sylvestre in #11710
- forbid scientific notation in numfmt #11655 by @Devel08 in #11721
- deny.toml: add
redox_syscallto skip list by @cakebaker in #11749 - fuzz: fix clippy::collapsible_if by @oech3 in #11764
- fuzz: bump
randto0.10.1by @cakebaker in #11313 - remove seekable from local cspell conf and use it by @oech3 in #11773
- tests/cut: ignore stdin write error on fast-exit delimiter test by @sylvestre in #11782
- chore: run cargo shear by @xtqqczze in #11838
- Remove authors from Cargo metadata (per RFC 3052) by @xtqqczze in #11832
- chore: remove unused entries from spelling wordlist by @xtqqczze in #11850
- clippy: fix rust 1.95 lints by @xtqqczze in #11861
- locale.rs: fix a cfg with collapsible_if by @oech3 in #11856
- panic.rs: remove collapsible_if by @oech3 in #11857
- tests: timeout: increase delay on macOS for forward_sigint_to_child by @sylvestre in #11874
- panic.rs: use var_os by @xtqqczze in #11880
- clippy: warn for large_stack_arrays lint by @xtqqczze in #11868
- reduce cfg by target_vendor by @oech3 in #11910
- tests: timeout: increase delay on macOS for forward_sigint_to_child by @sylvestre in #11881
- refactor: avoid unidiomatic use of and_then by @xtqqczze in #11919
- refactor: rename write functions to print for consistency by @xtqqczze in #11929
- workspace.wordlist.txt: drop unsafe vmsplice by @oech3 in #11946
- fix: macro should use snake_case by @xtqqczze in #11967
- cat, splice.rs: replace if with match, add comment by @oech3 in #12019
- test_nice.rs: remove unsafe by @oech3 in #12040
- test_ls.rs: remove unsafe by @oech3 in #12044
- test_tail.rs: remove unsafe by @oech3 in #12048
- clippy: fix items_after_statements lint by @xtqqczze in #12031
- test_nohup.rs: remove unsafe by @oech3 in #12052
- test_test.rs: remove unsafe by @oech3 in #12055
- fix: refine feature checks for SELinux and SMACK support by @xtqqczze in #12056
- refactor: rustix::io::Errno for CatError by @xtqqczze in #12082
- refactor: rename print methods to write for consistency by @xtqqczze in #12087
- tests: patch GNU numfmt 'neg-arg-not-option' to accept clap-style error by @sylvestre in #12123
- Cargo.toml: unpin
notifyby @cakebaker in #11978 - test_tail.rs: increase delay by @oech3 in #12155
- reduce usage of nix::unistd::geteuid by @oech3 in #12163
- ignore-intermittent.txt: add tests/tail/retry by @oech3 in #12169
- fuzz: replace unsafe libc::dup by rustix::io::dup by @blixygetir in #12148
- cargo: clarify lto setting by @xtqqczze in #12199
- toml: avoid defining tables out-of-order by @xtqqczze in #12198
- test_chmod.rs: remove unsafe by @oech3 in #12213
- fuzz: remove unsafe by @oech3 in #12218
- uutests: remove 1 unsafe by @oech3 in #12227
- remove unused import by @oech3 in #12230
- tests: replace .no_stdout().no_stderr() chains with .no_output() by @sylvestre in #12241
- replace nix getgroups by rustix by @oech3 in #12269
- deny.toml: remove
redox_syscallfrom skip list by @cakebaker in #12351 - tests_ls.rs: remove nix by @oech3 in #12379
- ignore-intermittent.txt: add 3 tests by @oech3 in #12368
- tests_sort.rs: remove nix by @oech3 in #12380
- tests_tail.rs: remove nix by @oech3 in #12381
- fix(tests): refine feature checks for SELinux by @xtqqczze in #12372
- refactor: replace rustix::pipe with std::io::pipe by @xtqqczze in #12356
- fix(selinux): add missing os checks by @xtqqczze in #12406
- deny.toml: remove
cpufeaturesandblock-bufferfrom skip list by @cakebaker in #12390 - chore: remove duplicate words in six comments by @mvanhorn in #12477
- GNUmakefile: avoid bootstrap issue with mkdir by @oech3 in #12521
CI & Build
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #11685
- Publish a comment in case of significant size change by @sylvestre in #11757
- GnuTests: mask an equivalent df test by @oech3 in #11766
- CI/GnuComment: enhance PR commenting logic to update existing comments by @xtqqczze in #11763
- CI/GnuComment: add safeguards by @xtqqczze in #11793
- fix: replace apt with apt-get in scripts by @xtqqczze in #11808
- ci: group openbsd log sections for easier failure triage by @sylvestre in #11819
- gitignore: remove .vscode directory from ignored files by @xtqqczze in #11839
- Revert "fix: replace apt with apt-get in scripts" by @cakebaker in #11835
- CI/SizeComment: enhance PR commenting logic to update existing comments by @xtqqczze in #11795
- GnuTests: bump GNU version to 9.11 by @oech3 in #11922
- ci: disable credential persistence in checkout steps by @xtqqczze in #11951
- fix(ci): correct formatting of comment body by @xtqqczze in #11966
- fix(renovate): do not update pinned dependencies by @xtqqczze in #11965
- Revert "fix(renovate): do not update pinned dependencies" by @cakebaker in #11977
- ci: add timeout for benchmark job by @cakebaker in #12219
- vscode: update rust-analyzer check command to use clippy by @xtqqczze in #12197
- CI: add tests/misc/io-errors to intermittent by @xtqqczze in #12278
- Add CI for cygwin except for date by @oech3 in #12304
- build: exclude chcon and runcon from util_map for non-Linux targets by @xtqqczze in #12375
- ci: update macOS job features in code quality workflow by @xtqqczze in #12386
- ci: specify bash shell for background jobs by @xtqqczze in #10491
- make.yml: try to fix Cygwin CI by @oech3 in #12496
- ci: add workflow to check TOML files by @xtqqczze in #12206
Documentation
- 0.8.0 release notes by @sylvestre in #11691
- wc drop outdated info from BENCHMARKING.md by @oech3 in #11720
- docs: remove hashsum from compiles_table.csv by @venoosoo in #11732
- yes: add BENCHMARKING.md by @oech3 in #12097
- README.md: update compatibility by @oech3 in #12302
- docs: remove authors field from book.toml by @xtqqczze in #11849
- uucore::pipes::splice_exact: improve document by @oech3 in #12414
- docs: update clippy section in DEVELOPMENT.md by @xtqqczze in #12369
- Improve documents for splice modules by @oech3 in #12455
- docs: add fuzz pointer, AI policy, playground link, and Ubuntu note by @sylvestre in #12437
- installation.md: improve AUR docs by @oech3 in #12513
Platform Support
- fix: sort and remove duplicates from feat_wasm feature by @xtqqczze in #11737
- tests: add WASI integration test support via wasmtime by @DePasqualeOrg in #11717
- cat, windows.rs: simplify bool by @oech3 in #12093
- fix: unused import on redox by @xtqqczze in #12332
Dependency Updates
- chore(deps): update rust crate zip to v8.5.1 by @renovate[bot] in #11696
- chore(deps): update rust crate selinux to v0.6.1 by @renovate[bot] in #11702
- chore(deps): update rust crate ctor to 0.9.0 by @renovate[bot] in #11733
- chore(deps): update actions/github-script action to v9 by @renovate[bot] in #11741
- chore(deps): update rust crates by @xtqqczze in #11730
- chore(deps): update rust crate clap_complete to v4.6.1 by @renovate[bot] in #11753
- chore(deps): update vampire/setup-wsl action to v6.1.0 by @renovate[bot] in #11754
- deps: unpin selinux rust crate by @xtqqczze in #11759
- chore(deps): update softprops/action-gh-release action to v3 by @renovate[bot] in #11769
- chore(deps): update rust crate similar to v3.1.0 by @renovate[bot] in #11768
- chore(deps): update rust crate ctor to 0.10.0 by @renovate[bot] in #11786
- deps: remove unused rust crate fluent-bundle by @xtqqczze in #11776
- chore(deps): update rust crate clap_complete to v4.6.2 by @renovate[bot] in #11797
- chore(deps): update rust crate rayon to v1.12.0 by @renovate[bot] in #11799
- chore(deps): update rust crate clap to v4.6.1 by @renovate[bot] in #11845
- chore(deps): update rust crate divan to v4.5.0 by @renovate[bot] in #11877
- chore(deps): update astral-sh/ruff-action action to v4 by @renovate[bot] in #11863
- chore(deps): update mozilla-actions/sccache-action action to v0.0.10 by @renovate[bot] in #11954
- chore(deps): update rust crate ctor to v0.10.1 by @renovate[bot] in #11955
- chore(deps): update rust crate jiff to v0.2.24 by @renovate[bot] in #11964
- chore(deps): update rust crate data-encoding to v2.11.0 by @renovate[bot] in #11982
- chore(deps): update rust crate data-encoding-macro to v0.1.20 by @renovate[bot] in #11981
- chore(deps): update rust crate blake3 to v1.8.5 by @renovate[bot] in #11989
- chore(deps): update rust crate sha3 to 0.10.9 by @xtqqczze in #11999
- chore(deps): update rust crate zip to v8.6.0 by @renovate[bot] in #12000
- chore(deps): update rust crate onig to v6.5.3 by @renovate[bot] in #12017
- chore(deps): update rust crate clap_complete to v4.6.3 by @renovate[bot] in #12039
- chore(deps): update rand crate to v0.8.6 by @xtqqczze in #12043
- chore(deps): update dawidd6/action-download-artifact action to v21 by @renovate[bot] in #12054
- chore(deps): update rust crate selinux to v0.6.2 by @renovate[bot] in #12066
- chore(deps): update rust crate divan to v4.6.0 by @renovate[bot] in #12070
- chore(deps): update rust crate ctor to 0.11.0 by @renovate[bot] in #12067
- chore(deps): update rust crate string-interner to 0.20.0 by @xtqqczze in #12103
- chore(deps): update rust crate ctor to 0.12.0 by @renovate[bot] in #12101
- chore(deps): update rust crate kqueue-sys to v1.1.0 by @xtqqczze in #12141
- chore(deps): update rust crate crc-catalog to 2.5.0 by @xtqqczze in #12151
- chore(deps): update rust crate exacl to 0.13.0 by @renovate[bot] in #12158
- Bump
ctor& adapt to change by @cakebaker in #12132 - chore(deps): update rust crate ctor to v1.0.2 by @renovate[bot] in #12179
- chore(deps): update rust crate ctor to v1.0.3 by @renovate[bot] in #12187
- chore(deps): update rust crate ctor to v1.0.4 by @renovate[bot] in #12203
- chore(deps): update rust crate clap_complete to v4.6.4 by @renovate[bot] in #12216
- bump nix and libc by @oech3 in #12233
- chore(deps): update rust crate ctor to v1.0.5 by @renovate[bot] in #12239
- chore(deps): update rust crate clap_complete to v4.6.5 by @renovate[bot] in #12245
- chore(deps): update rust crate filetime to v0.2.29 by @renovate[bot] in #12201
- chore(deps): update rust crate ctor to v1.0.6 by @renovate[bot] in #12347
- chore(deps): update rust crate digest to v0.11.3 by @renovate[bot] in #12388
- deps: remove unnecessary
packagefields by @xtqqczze in #11968 - chore(deps): update rust crate divan to v4.7.0 by @renovate[bot] in #12441
- chore(deps): update rust crate similar to v3.1.1 by @renovate[bot] in #12457
- chore(deps): update rust crate jiff to v0.2.25 by @renovate[bot] in #12473
- chore(deps): update rust crate jiff to v0.2.26 by @renovate[bot] in #12476
- chore(deps): update rust crate jiff to v0.2.27 by @renovate[bot] in #12482
- chore(deps): update rust crate memchr to v2.8.1 by @renovate[bot] in #12488
- chore(deps): update rust crate ctor to v1.0.7 by @renovate[bot] in #12509
- chore(deps): update rust crate jiff to v0.2.28 by @renovate[bot] in #12511
Version Management
- prepare release 0.9.0 by @sylvestre in #12494
New Contributors
- @pre-commit-ci[bot] made their first contribution in #11685
- @BipulLamsal made their first contribution in #11684
- @Sim-hu made their first contribution in #11694
- @THEMIScale made their first contribution in #11695
- @Devel08 made their first contribution in #11721
- @DePasqualeOrg made their first contribution in #11717
- @AntoxaBarin made their first contribution in #11767
- @fdncred made their first contribution in #9851
- @rossilor95 made their first contribution in #11886
- @frenchua made their first contribution in #11704
- @pocopepe made their first contribution in #11941
- @ChrisDenton made their first contribution in #11960
- @nonontb made their first contribution in #12022
- @hayato0909 made their first contribution in #12032
- @fogti made their first contribution in #12073
- @ksgk1 made their first contribution in #12013
- @blixygetir made their first contribution in #12148
- @fnadeau made their first contribution in #12301
- @0xSoftBoi made their first contribution in #12327
- @rodrigost23 made their first contribution in #9313
- @Franklin-Qi made their first contribution in #12094
- @gabrielhnf made their first contribution in #12367
- @leno23 made their first contribution in #12350
- @c-tonneslan made their first contribution in #12339
- @j5awry made their first contribution in #11931
- @mvanhorn made their first contribution in #12477
- @dragutreis made their first contribution in #12463
- @karlicoss made their first contribution in #12471
- @joknarf made their first contribution in #11554
- @fullwoodenshovel made their first contribution in #12330
Full Changelog: 0.8.0...0.9.0