[Bug 284513] Default bourne shell /bin/sh ignores or destroys terminal echoctl flag
[email protected] Sat, 01 Feb 2025 21:37:43 +0000
| Newsgroups | gmane.os.freebsd.devel.standards |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=284513
Bug ID: 284513
Summary: Default bourne shell /bin/sh ignores or destroys
terminal echoctl flag
Product: Base System
Version: 14.2-RELEASE
Hardware: Any
OS: Any
Status: New
Severity: Affects Only Me
Priority: ---
Component: standards
Assignee: [email protected]
Reporter: [email protected]
One of the key ideas in the UNIX world is that we should not astonish the user.
This has taken a few years to finally just call it a bug.
The default FreeBSD bourne shell /bin/sh seems to ignore the terminal
config flag echoctl and does not give the user any visual feedback to
confirm that CTRL-C was issued. When one types anything on the input
line for the default FreeBSD /bin/sh and then you enter CTRL-c it is
silent.
Which is to say that the chars "^C" do not appear. This is wrong
behavior for normal terminal processing.
Here I create a new account and then login via a serial terminal :
hydra# uname -apKU
FreeBSD hydra 14.2-RELEASE FreeBSD 14.2-RELEASE
releng/14.2-n269506-c8918d6c7412 GENERIC amd64 amd64 1402000 1402000
hydra#
hydra# pw useradd -n debug -m -c 'Some DEBUG User' -d /home/debug -e '' \
> -g devl -M 0700 \
> -s /bin/sh -u 16042
hydra#
hydra# passwd debug
Changing local password for debug
New Password:
Retype New Password:
hydra#
* * * using a proper 1200 baud serial connection * * *
Then login with a serial terminal connection :
FreeBSD/amd64 (hydra) (ttyu0)
login: debug
Password:
FreeBSD 14.2-RELEASE (GENERIC) releng/14.2-n269506-c8918d6c7412
Welcome to FreeBSD!
Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories: https://www.FreeBSD.org/security/
FreeBSD Handbook: https://www.FreeBSD.org/handbook/
FreeBSD FAQ: https://www.FreeBSD.org/faq/
Questions List: https://www.FreeBSD.org/lists/questions/
FreeBSD Forums: https://forums.FreeBSD.org/
Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with: pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.
Show the version of FreeBSD installed: freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages: man man
FreeBSD directory layout: man hier
To change this login announcement, see motd(5).
"man security" gives very good advice on how to tune the security of your
FreeBSD system.
debug@hydra:~ $
debug@hydra:~ $ uname -apKU
FreeBSD hydra 14.2-RELEASE FreeBSD 14.2-RELEASE
releng/14.2-n269506-c8918d6c7412 GENERIC amd64 amd64 1402000 1402000
debug@hydra:~ $
debug@hydra:~ $ echo $SHELL
/bin/sh
debug@hydra:~ $ ls -la
total 45
drwx------ 2 debug devl 9 Feb 1 20:12 .
drwxr-xr-x 13 root devl 13 Feb 1 20:12 ..
-rw-r--r-- 1 debug devl 950 Feb 1 20:12 .cshrc
-rw-r--r-- 1 debug devl 311 Feb 1 20:12 .login
-rw-r--r-- 1 debug devl 79 Feb 1 20:12 .login_conf
-rw------- 1 debug devl 289 Feb 1 20:12 .mail_aliases
-rw-r--r-- 1 debug devl 255 Feb 1 20:12 .mailrc
-rw-r--r-- 1 debug devl 966 Feb 1 20:12 .profile
-rw-r--r-- 1 debug devl 1003 Feb 1 20:12 .shrc
debug@hydra:~ $
debug@hydra:~ $ stty -a
speed 1200 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
brkint -inpck -ignpar -parmrk iutf8
oflags: opost onlcr -ocrnl tab3 -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf rtsdtr
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U;
lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
debug@hydra:~ $
debug@hydra:~ $ ls -lapb
debug@hydra:~ $ That was a CTRL-c and it does not appear as ^C <-- bug !!
debug@hydra:~ $
Here I am astonished. Where is the CTRL-C ? Perhaps I can type :
debug@hydra:~ $ rm -rf /*
How can you tell if that was ever entered or what? The echoctl was ignored.
Even worse the default shell destroys the state of the terminal flag echoctl.
debug@hydra:~ $ stty -echoctl
debug@hydra:~ $ ls -lapb
debug@hydra:~ $ the echoctl is destroyed or ignored !
debug@hydra:~ $ stty -a
speed 1200 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
brkint -inpck -ignpar -parmrk iutf8
oflags: opost onlcr -ocrnl tab3 -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf rtsdtr
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U;
lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
debug@hydra:~ $ exit
FreeBSD/amd64 (hydra) (ttyu0)
login:
OKay so that is the poor behavior of the default FreeBSD /bin/sh bourne
shell which seems to handle CTRL chars poorly. Certainly CTRL-C.
If I build a GNU BASH shell with minimal options. In fact, the configuration
is ruthlessly harsh wherein it has no line editing and no processing of
trivial control chars for things like the arrow keys on a keyboard. These
are taken for granted by most users in the past three or four decades.
Same machine where I now create another user to demonstrate correct behavior :
hydra# pw useradd -n debug2 -m -c 'Another DEBUG User' -d /home/debug2 \
> -e '' -g devl -M 0700 \
> -s /usr/local/shell/bash -u 16041
hydra# passwd debug2
Changing local password for debug2
New Password:
Retype New Password:
hydra#
Then login as that user on a serial terminal connection.
FreeBSD/amd64 (hydra) (ttyu0)
login: debug2
Password:
FreeBSD 14.2-RELEASE (GENERIC) releng/14.2-n269506-c8918d6c7412
Welcome to FreeBSD!
Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories: https://www.FreeBSD.org/security/
FreeBSD Handbook: https://www.FreeBSD.org/handbook/
FreeBSD FAQ: https://www.FreeBSD.org/faq/
Questions List: https://www.FreeBSD.org/lists/questions/
FreeBSD Forums: https://forums.FreeBSD.org/
Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with: pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.
Show the version of FreeBSD installed: freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages: man man
FreeBSD directory layout: man hier
To change this login announcement, see motd(5).
$
$ echo $SHELL
/usr/local/shell/bash
$
$ stty -a
speed 1200 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel -ignbrk
brkint -inpck -ignpar -parmrk iutf8
oflags: opost onlcr -ocrnl tab3 -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf rtsdtr
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U;
lnext = ^V; min = 1; quit = ^\; reprint = ^R; start = ^Q;
status = ^T; stop = ^S; susp = ^Z; time = 0; werase = ^W;
$
$ ls -la ^C
$
$ That was a CTRL-c and it works ! also we see ^C chars on the line ^C
$
* * * now we flip the flag for echoctl * *
$ stty -echoctl
$
$ That disables the output of CTRL chars like this -->
$
$ that is an invisible CTRL-c and that is correct for -echoctl terminal flag
$
$ stty echoctl
$
$ Now we see the CTRL-c again ^C
$ that is correct behavior .... fully reasonable and no surprise to the user ^C
$
$ $SHELL --version
GNU bash, version 5.2.37(2)-release (x86_64-unknown-freebsd14.2)
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ exit
logout
FreeBSD/amd64 (hydra) (ttyu0)
login:
Why the serial terminal config? Simply to remove any possible network
layer from the problem. There is no telnet here. No SSHd daemon. This
is a correct login to one of the machines serial ports.
To be more clear here the GNU BASH shell that I tested with is merely
a test case and the configuration was very harsh :
$ ./configure --prefix=/home/dclarke/local --enable-threads=posix \
> --enable-xpg-echo-default --enable-minimal-config \
> --enable-strict-posix-default
That is all. Nothing more.
That shell needs almost next to nothing :
$ echo $SHELL
/home/dclarke/local/bin/bash
$
$ readelf -delV /home/dclarke/local/bin/bash | grep -E 'NEED|NAME|PATH'
0x0000000000000001 NEEDED Shared library: [libintl.so.8]
0x0000000000000001 NEEDED Shared library: [libiconv.so.2]
0x0000000000000001 NEEDED Shared library: [libdl.so.1]
0x0000000000000001 NEEDED Shared library: [libc.so.7]
0x000000006ffffffe VERNEED 0x402238
0x000000006fffffff VERNEEDNUM 2
$
This is the exact shell used by the debug2 user :
$ openssl dgst -sha256 -r $SHELL /usr/local/shell/bash
4e9ce6b33a9e909ab8d6df746898c8148a388f82eb333b7d577df9b2fa97a0d0
*/home/dclarke/local/bin/bash
4e9ce6b33a9e909ab8d6df746898c8148a388f82eb333b7d577df9b2fa97a0d0
*/usr/local/shell/bash
$
The FreeBSD default bourne shell needs to respect the terminal echoctl flag
correctly and output a "^C" char sequence correctly. There should be some
reasonable feedback to let the user know what happened.
It is wrong to astonish the user.
--
Dennis Clarke
RISC-V/SPARC/PPC/ARM/CISC
UNIX and Linux spoken
ps: some discussions were had with others and I think there is agreement
that this is a bug :
https://lists.gnu.org/archive/html/bug-ncurses/2025-02/msg00001.html
--
You are receiving this mail because:
You are the assignee for the bug.