]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tests: stty: adjust tests for arbitary speeds
authorPádraig Brady <P@draigBrady.com>
Tue, 17 Jun 2025 22:32:05 +0000 (23:32 +0100)
committerPádraig Brady <P@draigBrady.com>
Wed, 18 Jun 2025 13:21:30 +0000 (14:21 +0100)
* tests/stty/stty-invalid.sh: Adjust to what is now invalid.
* tests/stty/stty.sh: Add checks for valid speed variants.
* tests/stty/bad-speed.sh: New test to ensure unsupported speeds
are diagnosed.

tests/local.mk
tests/stty/bad-speed.sh [new file with mode: 0755]
tests/stty/stty-invalid.sh
tests/stty/stty.sh

index 642d225fa7b9d616f128829bc1ae432efb62897d..b68df41f76e0d4fc757e0b20861ed87be51952c5 100644 (file)
@@ -425,6 +425,7 @@ all_tests =                                 \
   tests/stat/stat-printf.pl                    \
   tests/stat/stat-slash.sh                     \
   tests/misc/stdbuf.sh                         \
+  tests/stty/bad-speed.sh                      \
   tests/stty/stty.sh                           \
   tests/stty/stty-invalid.sh                   \
   tests/stty/stty-pairs.sh                     \
diff --git a/tests/stty/bad-speed.sh b/tests/stty/bad-speed.sh
new file mode 100755 (executable)
index 0000000..d80d2e7
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh
+# Ensure we handle cfsetispeed failing
+# which we did not before coreutils v9.1
+
+# Copyright (C) 2025 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ stty
+require_gcc_shared_
+
+# Replace each cfsetispeed call with a call to these stubs.
+cat > k.c <<'EOF' || framework_failure_
+#include <stdio.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+
+int cfsetispeed(struct termios *termios_p, speed_t speed)
+{
+  /* Leave a marker so we can identify if the function was intercepted.  */
+  fclose(fopen("preloaded", "w"));
+
+  errno=EINVAL;
+  return -1;
+}
+EOF
+
+# Then compile/link it:
+gcc_shared_ k.c k.so \
+  || skip_ 'failed to build shared library'
+
+( export LD_PRELOAD=$LD_PRELOAD:./k.so
+  returns_ 1 stty ispeed 9600 ) || fail=1
+
+test -e preloaded || skip_ 'LD_PRELOAD interception failed'
+
+Exit $fail
index 4b87e2adf4c69e216f823fbfff583d37a7d0ff4c..a1442a82d0d173ff5546376136b30eeb71a82048 100755 (executable)
@@ -20,6 +20,7 @@
 print_ver_ stty
 require_controlling_input_terminal_
 require_trap_signame_
+getlimits_
 
 trap '' TTOU # Ignore SIGTTOU
 
@@ -50,8 +51,13 @@ if tty -s </dev/tty; then
   returns_ 1 stty eol -F/dev/tty eol || fail=1
 fi
 
-# coreutils <= 9.1 would not validate speeds to ispeed or ospeed
-returns_ 1 stty ispeed 420 || fail=1
+# coreutils >= 9.8 supports arbitrary speeds on some systems
+# so restrict tests here to invalid numbers
+# We simulate unsupported numbers in a separate "LD_PRELOAD" test.
+WRAP_9600="$(expr $ULONG_OFLOW - 9600)"
+for speed in 9600.. ++9600 -$WRAP_9600 --$WRAP_9600 0x2580 96E2; do
+  returns_ 1 stty ispeed "$speed" || fail=1
+done
 
 # Just in case either of the above mistakenly succeeds (and changes
 # the state of our tty), try to restore the initial state.
index dab4cd0e719881254c5e934d771d813d8ab63b30..c0f74947a37db105f74d51d2be8b1c52d42473b5 100755 (executable)
@@ -95,4 +95,14 @@ for W in $(seq 80 90); do
   test "$output_width" -le "$W" || fail=1
 done
 
+# Ensure we support varied numeric forms
+# with appropriate rounding
+if stty ispeed '9600'; then
+  stty ispeed '  +9600' || fail=1
+  stty ispeed '9600.49' || fail=1
+  stty ispeed '9600.50' || fail=1
+  stty ispeed '9599.51' || fail=1
+  stty ispeed '  9600.' || fail=1
+fi
+
 Exit $fail