[Bug 2138315] Re: comm does not work as expected with process substitution
Launchpad Bug Tracker
2138315 at bugs.launchpad.net
Wed Feb 11 00:17:14 UTC 2026
This bug was fixed in the package rust-coreutils - 0.6.0-0ubuntu1
---------------
rust-coreutils (0.6.0-0ubuntu1) resolute; urgency=medium
* New usptream version (LP: #2139697)
* Fixes:
- comm does not work as expected with process substitution (LP: #2138315)
- git: FTBFS in Resolute (LP: #2138217)
- tee with multiple --append fails in rust corutils (LP: #2134578)
- echo 1 | sort | head -n0: sort: write failed: 'standard output':
Broken pipe (LP: #2133156)
- env: Rust unwrap with UTF-8 symbols in environment variables
(LP: #2132941)
- "du" is double-counting hard links when multiple arguments specified
(LP: #2132245)
- dd: O_DIRECT partial block writes fail (LP: #2132150)
- date does not support localized output (LP: #2130859)
- SSH sessions blocked on unavailable automounts by default in Ubuntu 25.10
(LP: #2130843)
- rust-coreutils 'shred' refuses to write to a device (LP: #2130396)
- rust-coreutils stats handling breaks wireguard's wg-quick (LP: #2127851)
- rust-coreutils:dd: Broken pipe (LP: #2125943)
- /usr/bin/sort: -k option does not behave as GNU's sort (LP: #2125504)
- uutils wc crashed with SIGABRT on logout (LP: #2122166)
- who, pinky are empty - need to talk to logind (LP: #2117771)
* Drop applied patches:
- use-mem-zeroed.diff: The timespec C-binding struct has been replaced
by the safe abstraction nix::sys::time::TimeSpec. Padding should now
be handled internally for 32-bit architectures.
* Refresh patches:
- Tweak-release-build-profile.patch
- build-stty.patch
- dd-ensure-full-writes.patch
- fix-prefix.diff
- glibc-2.42.patch
- require-utilities-to-be-invoked-using-matching-path.patch
- use-l10n-translations-in-makefile.patch
- workspace-exclude.patch
* Add patch:
- prevent-stty-termios2-on-ppc64el.patch: The termios2 header is not
always available or exposed on ppc64el systems. Use the standard termios
interface instead to avoid build failures on such systems.
* Skip failing tests:
(s390x)
- test_env::test_simulation_of_terminal_for_stdout_only
- test_nohup::test_nohup_stderr_to_stdout
- test_nohup::test_nohup_with_pseudo_terminal_emulation_on_stdin_stdout_stderr_get_replaced
- test_touch::test_touch_changes_time_of_file_in_stdout
(amd64v3)
- test_dd::test_stdin_stdout_skip_w_multiplier
* Re-enable previously failing tests:
- test_chown::test_chown_only_group_id_nonexistent_group
- test_chown::test_chown_only_user_id_nonexistent_user
- test_expr::test_long_input
- test_factor::test_parallel
- test_install::test_install_and_strip
- test_install::test_install_and_strip_with_program
- test_ls::test_device_number
- test_ls::test_localized_possible_values
- test_od::test_od_options_after_filename
- test_od::test_suppress_duplicates
- test_sort::
+ test_argument_suggestion
+ test_clap_localization_help_message
+ test_clap_localization_invalid_value
+ test_clap_localization_unknown_argument
+ test_error_colors_disabled
+ test_error_colors_enabled
+ test_french_translations
+ test_help_colors_disabled
+ test_help_colors_enabled
- test_stat::
+ test_mount_point_basic
+ test_mount_point_combined_with_other_specifiers
+ test_multi_files
+ test_normal_format
+ test_printf
+ test_symlinks
+ test_terse_fs_format
- test_error_messages_french_translation
- test_french_colored_error_messages
- test_help_messages_french_translation
- util_invalid_name_invalid_command
-- Simon Johnsson <simon.johnsson at canonical.com> Tue, 03 Feb 2026
17:53:04 +0100
** Changed in: rust-coreutils (Ubuntu)
Status: In Progress => Fix Released
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to rust-coreutils in Ubuntu.
https://bugs.launchpad.net/bugs/2138315
Title:
comm does not work as expected with process substitution
Status in rust-coreutils:
Fix Released
Status in rust-coreutils package in Ubuntu:
Fix Released
Bug description:
comm does not work as expected with process substitution
Command "comm" from rust-coreutils works differently depending on
whether it is invoked with files or process substitutions. With the
"comm" from gnu-coreutils, there is no differences.
Summary:
Using Rust 'comm', for some file A and B, each containing sorted
elements, the result of 'comm A B' is different of that of 'comm <(cat
A) <(cat B)' whereas we would expect an identical result.
Obviously, in real life, we wouldn't use 'cat' but rather 'sort', as
in 'comm <(sort A) <(sort B), but I prefer to use 'cat' to show that
the problem is indeed in 'comm' and not in 'sort'.
Environment:
$ comm --version
comm (uutils coreutils) 0.2.2
$ sort --version
sort (uutils coreutils) 0.2.2
Steps to reproduce:
1. create a file A containing only the string 00000, and a second file
B containing all integers between 1 and 10000, 5 characters wide,
padded on the left with zeros, one per line :
$ echo 00000 > A
$ seq --format '%05.0f' 10000 > B
Both files are obviously sorted, but let's check anyway:
$ sort --check A && sort --check B && echo OK
OK
2. Search all lines from file A that are not in file B using "comm",
expected result is a single line containing 00000 :
$ comm -23 A B
00000
of course we have the same result with GNU comm :
$ gnucomm -23 A B
00000
3. Repeat the previous step, replacing the raw files with process
substitutions. The expected result is still 00000 on a single line.
$ comm -23 <(cat A) <(cat B) && echo OK
00000
comm: file 2 is not in sorted order
comm: input is not in sorted order
Output is correct but exit status is no longer 0, and comm complains
with input orderning, which is obviously false.
Using GNU comm, everything is fine with process substitutions :
$ gnucomm -23 <(cat A) <(cat B) && echo OK
00000
OK
4. The value of 10,000 previously used was selected at random. The
minimum value at which the behavior changes can be easily determined.
$ for ((i=1;i<=10000;i++)) do comm -23 <(echo 00000) <(seq --format '%05.0f' $i) || break ; done > /dev/null
comm: file 2 is not in sorted order
comm: input is not in sorted order
$ echo $i
1366
So we have correct operation up to 1365 :
$ comm -23 <(echo 00000) <(seq --format '%05.0f' 1365) && echo OK
00000
OK
but from 1366 onwards, the behavior changes :
$ comm -23 <(echo 00000) <(seq --format '%05.0f' 1366) && OK
00000
comm: file 2 is not in sorted order
comm: input is not in sorted order
Of course, there should be no difference, as the GNU version of comm
does.
More environment details :
$ lsb_release -rd
Description: Ubuntu 25.10
Release: 25.10
$ lsb_release -rd
Description: Ubuntu 25.10
Release: 25.10
$ apt-cache policy rust-coreutils gnu-coreutils
rust-coreutils:
Installé : 0.2.2-0ubuntu2.1
Candidat : 0.2.2-0ubuntu2.1
Table de version :
*** 0.2.2-0ubuntu2.1 500
500 http://archive.ubuntu.com/ubuntu questing-updates/main amd64 Packages
500 http://archive.ubuntu.com/ubuntu questing-security/main amd64 Packages
100 /var/lib/dpkg/status
0.2.2-0ubuntu2 500
500 http://archive.ubuntu.com/ubuntu questing/main amd64 Packages
gnu-coreutils:
Installé : 9.5-1ubuntu4
Candidat : 9.5-1ubuntu4
Table de version :
*** 9.5-1ubuntu4 500
500 http://archive.ubuntu.com/ubuntu questing/main amd64 Packages
100 /var/lib/dpkg/status
To manage notifications about this bug go to:
https://bugs.launchpad.net/rust-coreutils/+bug/2138315/+subscriptions
More information about the foundations-bugs
mailing list