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 \
--- /dev/null
+#!/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
print_ver_ stty
require_controlling_input_terminal_
require_trap_signame_
+getlimits_
trap '' TTOU # Ignore SIGTTOU
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.
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