zsh-workers
 help / color / mirror / code / Atom feed
* SIGABRT/SIGIOT confusion under Linux
@ 2023-03-25 20:40 Nate Eldredge
  2023-03-26  8:28 ` PATCH: Handle SIGIOT as an alias to SIGABRT if they are the same signal number Mikael Magnusson
  0 siblings, 1 reply; 2+ messages in thread
From: Nate Eldredge @ 2023-03-25 20:40 UTC (permalink / raw)
  To: zsh-workers

On Linux, the obscure SIGIOT signal, which hasn't really been meaningful 
on any machine since the PDP-11, is an alias for the common SIGABRT 
(signal 6).  The system strsignal() function maps signal 6 to the expected 
description "Aborted".  However, since zsh does its own translation, and 
since the SIGABRT precedes SIGIOT in Linux's <signal.h>, the latter 
overwrites the former in zsh's signal string tables.  See 
Src/signames2.awk.

This has (at least) two unfortunate results:

1. When a command aborts by calling `abort()`, which raises SIGABRT, zsh 
emits the message "zsh: IOT instruction (core dumped)" which will surely 
mystify most users.

2. The `kill` builtin doesn't accept `-ABRT`.  If you wanted to send the 
abort signal to a process, you would have to know to do `kill -IOT pid` 
instead, or `kill -6 pid` if you have the numbers memorized.

Tested with zsh 5.9 as distributed with Ubuntu 22.10 on x86-64, but the 
latest zsh source in git seems to not have changed.

-- 
Nate Eldredge
nate@thatsmathematics.com



^ permalink raw reply	[flat|nested] 2+ messages in thread

* PATCH: Handle SIGIOT as an alias to SIGABRT if they are the same signal number
  2023-03-25 20:40 SIGABRT/SIGIOT confusion under Linux Nate Eldredge
@ 2023-03-26  8:28 ` Mikael Magnusson
  0 siblings, 0 replies; 2+ messages in thread
From: Mikael Magnusson @ 2023-03-26  8:28 UTC (permalink / raw)
  To: zsh-workers

There is already similar handling for SIGCLD/SIGCHLD and SIGIO/SIGPOLL
(see 20566 and 20572), so extend this to handle SIGIOT and SIGABRT the
same way.

---
 Src/jobs.c        | 5 +++++
 Src/signames2.awk | 9 +++++----
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/Src/jobs.c b/Src/jobs.c
index 2dfcefb33a..429ee2a326 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -2645,6 +2645,11 @@ static const struct {
     { "IO", SIGIO },
 #endif
 #endif
+#if defined(SIGABRT) && defined(SIGIOT)
+#if SIGABRT == SIGIOT
+    { "IOT", SIGIOT },
+#endif
+#endif
 #if !defined(SIGERR)
     /*
      * If SIGERR is not defined by the operating system, use it
diff --git a/Src/signames2.awk b/Src/signames2.awk
index 4d15681d58..4d1557cd8d 100644
--- a/Src/signames2.awk
+++ b/Src/signames2.awk
@@ -13,7 +13,8 @@
     signam = substr(tmp[1], 4, 20)
     signum = tmp[2]
     if (signam == "CHLD" && sig[signum] == "CLD")  sig[signum] = ""
-    if (signam == "POLL" && sig[signum] == "IO")  sig[signum] = ""
+    if (signam == "POLL" && sig[signum] == "IO")   sig[signum] = ""
+    if (signam == "ABRT" && sig[signum] == "IOT")  sig[signum] = ""
     if (sig[signum] == "") {
 	sig[signum] = signam
 	if (0 + max < 0 + signum && signum < 60)
@@ -33,9 +34,9 @@
 	if (signam == "IO")     { msg[signum] = "i/o ready" }
 	if (signam == "IOT")    { msg[signum] = "IOT instruction" }
 	if (signam == "KILL")   { msg[signum] = "killed" }
-	if (signam == "LOST")	{ msg[signum] = "resource lost" }
+	if (signam == "LOST")   { msg[signum] = "resource lost" }
 	if (signam == "PIPE")   { msg[signum] = "broken pipe" }
-	if (signam == "POLL")	{ msg[signum] = "pollable event occurred" }
+	if (signam == "POLL")   { msg[signum] = "pollable event occurred" }
 	if (signam == "PROF")   { msg[signum] = "profile signal" }
 	if (signam == "PWR")    { msg[signum] = "power fail" }
 	if (signam == "QUIT")   { msg[signum] = "quit" }
@@ -43,7 +44,7 @@
 	if (signam == "SYS")    { msg[signum] = "invalid system call" }
 	if (signam == "TERM")   { msg[signum] = "terminated" }
 	if (signam == "TRAP")   { msg[signum] = "trace trap" }
-	if (signam == "URG")	{ msg[signum] = "urgent condition" }
+	if (signam == "URG")    { msg[signum] = "urgent condition" }
 	if (signam == "USR1")   { msg[signum] = "user-defined signal 1" }
 	if (signam == "USR2")   { msg[signum] = "user-defined signal 2" }
 	if (signam == "VTALRM") { msg[signum] = "virtual time alarm" }
-- 
2.38.1



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-03-26  8:29 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-25 20:40 SIGABRT/SIGIOT confusion under Linux Nate Eldredge
2023-03-26  8:28 ` PATCH: Handle SIGIOT as an alias to SIGABRT if they are the same signal number Mikael Magnusson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).