[git commit] ash: disable sleep as builtin, closes 15619

Denys Vlasenko vda.linux at googlemail.com
Mon Jul 10 08:53:23 UTC 2023


commit: https://git.busybox.net/busybox/commit/?id=5e0411a7fb510b9aecda0a850c76bdd62c50efa4
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Has a few annoying problems:
* sleepcmd() -> sleep_main(), the parsing of bad arguments exits the shell.
* sleep_for_duration() in sleep_main() has to be interruptible for
  ^C traps to work, which may be a problem for other users
  of sleep_for_duration().
* BUT, if sleep_for_duration() is interruptible, then SIGCHLD interrupts it
  as well (try "/bin/sleep 1 & sleep 10").
* sleep_main() must not allocate anything as ^C in ash longjmp's.
  (currently, allocations are only on error paths, in message printing).

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h |  2 ++
 shell/ash.c     | 22 +++++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 18336da23..640fa3988 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1513,6 +1513,8 @@ int hush_main(int argc, char** argv) IF_SHELL_HUSH(MAIN_EXTERNALLY_VISIBLE);
 /* If shell needs them, they exist even if not enabled as applets */
 int echo_main(int argc, char** argv) IF_ECHO(MAIN_EXTERNALLY_VISIBLE);
 int sleep_main(int argc, char **argv) IF_SLEEP(MAIN_EXTERNALLY_VISIBLE);
+/* See disabled "config ASH_SLEEP" in ash.c */
+#define ENABLE_ASH_SLEEP 0
 int printf_main(int argc, char **argv) IF_PRINTF(MAIN_EXTERNALLY_VISIBLE);
 int test_main(int argc, char **argv)
 #if ENABLE_TEST || ENABLE_TEST1 || ENABLE_TEST2
diff --git a/shell/ash.c b/shell/ash.c
index e91566994..e154cc6cc 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -134,11 +134,23 @@
 //config:	default y
 //config:	depends on SHELL_ASH
 //config:
-//config:config ASH_SLEEP
-//config:	bool "sleep builtin"
-//config:	default y
-//config:	depends on SHELL_ASH
-//config:
+//
+////config:config ASH_SLEEP
+////config:	bool "sleep builtin"
+////config:	default y
+////config:	depends on SHELL_ASH
+////config:
+//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+//Disabled for now. Has a few annoying problems:
+// * sleepcmd() -> sleep_main(), the parsing of bad arguments exits the shell.
+// * sleep_for_duration() in sleep_main() has to be interruptible for
+//   ^C traps to work, which may be a problem for other users
+//   of sleep_for_duration().
+// * BUT, if sleep_for_duration() is interruptible, then SIGCHLD interrupts it
+//   as well (try "/bin/sleep 1 & sleep 10").
+// * sleep_main() must not allocate anything as ^C in ash longjmp's.
+//   (currently, allocations are only on error paths, in message printing).
+//
 //config:config ASH_HELP
 //config:	bool "help builtin"
 //config:	default y


More information about the busybox-cvs mailing list