** Description changed: - [ Impact ] - In Ubuntu devel (stonking), rust-coreutils provides tr. When parsing SET2 in tr, repeat constructs of the form [c*] where c is a hyphen '-' (for example '[-*]') fail with: - tr: range-endpoints of '[-*' are in reverse collating sequence order + tr: range-endpoints of '[-*' are in reverse collating sequence order GNU tr accepts this syntax. This incompatibility causes basez to fail to build from source (FTBFS) during ./configure, where line 27 runs: - PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' '[-*]'` + PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' '[-*]'` Because tr aborts, PKGNAME is empty and the build stops with: - Makefile:35: *** PKGNAME is missing. Stop. + Makefile:35: *** PKGNAME is missing. Stop. - [ Fix ] + Root Cause: + In src/uu/tr/src/operation.rs (Sequence::parse_set), the parser alternatives used alt((Self::parse_char_range, Self::parse_char_star, ...)). Because parse_char_range ran before bracketed constructs, it matched '[' as start char, '-' as range delimiter, and '*' as end char. Since '[' (ASCII 91) is greater than '*' (ASCII 42), parse_char_range failed with BadSequence::BackwardsRange and stopped alt from trying parse_char_star. - In src/uu/tr/src/operation.rs (Sequence::parse_set), the parser - alternatives used alt((Self::parse_char_range, Self::parse_char_star, - ...)). Because parse_char_range ran before bracketed constructs, it - matched '[' as start char, '-' as range delimiter, and '*' as end char. - Since '[' (ASCII 91) is greater than '*' (ASCII 42), parse_char_range - failed with BadSequence::BackwardsRange and stopped alt from trying - parse_char_star. + Fix: + Moving parse_char_range after the bracketed constructs (parse_char_star, parse_char_repeat, parse_class, parse_char_equal) fixes the issue. Bracketed constructs are now recognized before character ranges. Regression test test_repeat_hyphen added to tests/by-util/test_tr.rs. - Moving parse_char_range after the bracketed constructs (parse_char_star, - parse_char_repeat, parse_class, parse_char_equal) fixes the issue. - Bracketed constructs are now recognized before character ranges. - Regression test test_repeat_hyphen added to tests/by-util/test_tr.rs. - - [ Test Plan ] - - 1. Run repeat construct with hyphen: - echo "Base Z" | /usr/bin/tr -s '[:blank:]' '[-*]' - Expected stdout: "Base-Z" - Expected exit code: 0 - - 2. Run repeat construct with count: - echo "Base Z" | /usr/bin/tr -s '[:blank:]' '[-*5]' - Expected stdout: "Base-Z" - Expected exit code: 0 - - 3. Verify standard character ranges still work: - echo "abc" | /usr/bin/tr 'a-c' 'x-z' - Expected stdout: "xyz" - Expected exit code: 0 - - 4. Verify full tr integration test suite: - cargo test --package coreutils --test tests test_tr:: - Expected result: 174 passed, 0 failed. - - [ Where problems could occur ] - - The change adjusts the priority of parser alternatives in - Sequence::parse_set. Bracketed constructs ([c*], [c*n], [:class:], - [=c=]) require bracket delimiters and are more specific than unbracketed - ranges. If a malformed bracketed expression is parsed, it now reports a - syntax error rather than falling back to character range parsing. - Standard character ranges (such as a-z) are unaffected. - - [ Other Info ] - + Upstream & Development Status: - Upstream Pull Request: https://github.com/uutils/coreutils/pull/15031 (Merged) - - Target series: Ubuntu devel (stonking, 26.10). - - Target package version: rust-coreutils 0.12.0-1ubuntu3. - - Test suite: full test_tr test suite passes (174 passed, 0 failed, 0 regressions). + - Target: Ubuntu 26.10 (stonking development series) + - Proposed Package: rust-coreutils 0.12.0-1ubuntu3 + - Verification: Full test_tr test suite passes (174 passed, 0 failed, 0 regressions). --- [ Original Report ] - - uutils tr rejects a "[c*]" repeat construct in SET2 when the repeated - character is '-'. GNU tr accepts it. This makes basez fail to build from - source in stonking. + uutils tr rejects a "[c*]" repeat construct in SET2 when the repeated character is '-'. GNU tr accepts it. This makes basez fail to build from source in stonking. == Reproducer == - echo "Base Z" | tr -s '[:blank:]' '[-*]' + echo "Base Z" | tr -s '[:blank:]' '[-*]' GNU coreutils: prints "Base-Z" rust-coreutils 0.12.0-1ubuntu1 (from the build log below): - tr: range-endpoints of '[-*' are in reverse collating sequence order + tr: range-endpoints of '[-*' are in reverse collating sequence order In POSIX/GNU tr, "[c*]" in SET2 means "repeat c until SET2 is as long as SET1", so '[-*]' means "replace with '-'". uutils seems to parse "[-*" as a range from '[' to '*' before it recognises the repeat construct. uutils handles "[c*]" with ordinary characters, so the problem seems specific to '-' (and possibly other characters that are special in range syntax). Note: the uutils output above comes from the build log; this was not re- run directly against a uutils binary. == Impact == basez 1.6.2-3build1 fails to build on all architectures in stonking (and failed in resolute): https://launchpad.net/ubuntu/+source/basez/1.6.2-3build1/+build/32793382 Its configure script (line 27) does: - PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s - '[:blank:]' '[-*]'` + PKGNAME=`echo "$APPNAME" |tr '[:upper:]' '[:lower:]' |tr -s '[:blank:]' + '[-*]'` With uutils tr, PKGNAME ends up empty and the build stops: - tr: range-endpoints of '[-*' are in reverse collating sequence order - ... - Makefile:35: *** PKGNAME is missing. Stop. + tr: range-endpoints of '[-*' are in reverse collating sequence order + ... + Makefile:35: *** PKGNAME is missing. Stop. The build environment has coreutils-from-uutils 2ubuntu1 and rust- coreutils 0.12.0-1ubuntu1. Debian (GNU coreutils) is not affected. Other packages that use '[-*]' (or similar repeats of a range-special character) in tr calls are likely affected too. == Workaround == In basez, replacing '[-*]' with '-' gives the same result with both implementations. The tr incompatibility should still be fixed in uutils; I did not find an existing upstream issue for it.
-- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/2169227 Title: tr: '[-*]' repeat construct in SET2 rejected as reversed range (breaks basez FTBFS) To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/basez/+bug/2169227/+subscriptions -- ubuntu-bugs mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs
