From 5c8bd91f9fc5798f2070f2a28f5adf9fa2bc864d Mon Sep 17 00:00:00 2001 From: Casey Connolly Date: Sun, 22 Jun 2025 13:06:51 +0200 Subject: [PATCH] postmarketos-initramfs: prevent entering debug shell twice It is sometimes possible that we spawn multiple shells on the same TTY when boot fails and the user tries using some functions like mount_subpartitions which call fail_halt_boot() on failure. Add some global state to track this and avoid entering the debug shell if already entered. Signed-off-by: Casey Connolly --- main/postmarketos-initramfs/APKBUILD | 4 +- main/postmarketos-initramfs/init_functions.sh | 39 ++++++++++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/main/postmarketos-initramfs/APKBUILD b/main/postmarketos-initramfs/APKBUILD index d786c2c78c..c197afcf1d 100644 --- a/main/postmarketos-initramfs/APKBUILD +++ b/main/postmarketos-initramfs/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Casey Connolly # Co-Maintainer: Clayton Craft pkgname=postmarketos-initramfs -pkgver=3.8.4 +pkgver=3.8.5 pkgrel=0 pkgdesc="Base files for the postmarketOS initramfs / initramfs-extra" url="https://postmarketos.org" @@ -109,7 +109,7 @@ sha512sums=" c0233d22858a5901db64e1d2fe1f6d39a2e2cfd1b94a10932483f55fed9461e9b8aa2d73b154b9d99a7a8b49ee02abfbddfe917ce0c6d7576601ba2668589c01 00-initramfs-base.files d0f35562365756d93066ce45924d17fb347b54095179c3262daa2f073e12743505cd5d9372ad30485915ca754d95a8edba9a74314e7949e0b3cf6978a87d03a5 00-initramfs-extra-base.files 7ec5e9596b27f48d3abe51bc92d70d9708479b5e7df5fa9903d9e58f5945f2a7de5c390cc2d82842b899dfc9fa9bdb2b84b29cc1daf5d534861cf1324628d57b init.sh -8948bb1bb17cf707790e0dc91a51a1c1293b883deea08137bbb92b19584282173d5ba7bb4481daafe5d84ee300808c5e9b23fae1256b64f4c2c7ef192b7a97a7 init_functions.sh +89b5238b044aa3bee74d36d4a17c8af08d55e66531b528901e5948a813bb9be4a4f1383111c02d67198fd75d8d8d1ab9f3deffc63db1518642ab0ff4f91a00d5 init_functions.sh 7cf0b1e7511bf289a90ed6cf3190a78119be46e2d885ee3af2dd1fb048eaac7c0875bfd74cc576dd062d17c5fae23f7e721b86f8d71d2b3fb2917bcc184390c1 init_2nd.sh bb421896e7bebdc13822258d219795da79f3b17f4f0016f16e00cfc46c46beaf7b4873dd0418fc397a839570512a18030a6d8d452a0b54fd35b48be2de06be08 init_functions_2nd.sh 675e7d5bee39b2df7d322117f8dcaccc274d61beaf4d50ead19bbf2109446d64b1c0aa0c5b4f9846eb6c1c403418f28f6364eff4537ba41120fbfcbc484b7da7 mdev.conf diff --git a/main/postmarketos-initramfs/init_functions.sh b/main/postmarketos-initramfs/init_functions.sh index 253f2bf004..bbeb5735b9 100644 --- a/main/postmarketos-initramfs/init_functions.sh +++ b/main/postmarketos-initramfs/init_functions.sh @@ -13,6 +13,8 @@ CONFIGFS_ACM_FUNCTION="acm.usb0" CONFIGFS_MASS_STORAGE_FUNCTION="mass_storage.0" HOST_IP="${unudhcpd_host_ip:-172.16.42.1}" +IN_DEBUG_SHELL="" + deviceinfo_getty="${deviceinfo_getty:-}" deviceinfo_name="${deviceinfo_name:-}" deviceinfo_codename="${deviceinfo_codename:-}" @@ -1002,6 +1004,11 @@ setup_usb_storage_configfs() { } debug_shell() { + # We can't set the IN_DEBUG_SHELL variable before we might be running in a subshell + if [ "$IN_DEBUG_SHELL" = "y" ]; then + info "Already in debug shell" + return + fi echo "Entering debug shell" # if we have a UDC it's already been configured for USB networking local have_udc @@ -1051,6 +1058,7 @@ debug_shell() { cat <<-EOF > /etc/profile cat /README . /init_functions.sh + export IN_DEBUG_SHELL=y EOF cat <<-EOF > /sbin/pmos_getty @@ -1158,19 +1166,26 @@ debug_shell() { # Check if the user is pressing a key and either drop to a shell or halt boot as applicable check_keys() { - { - # If the user is pressing either the left control key or the volume down - # key then drop to a debug shell. - if iskey KEY_LEFTCTRL KEY_VOLUMEDOWN; then - debug_shell - # If instead they're pressing left shift or volume up, then fail boot - # and dump logs - elif iskey KEY_LEFTSHIFT KEY_VOLUMEUP; then - fail_halt_boot - fi + local action="" + # If the user is pressing either the left control key or the volume down + # key then drop to a debug shell. + if iskey KEY_LEFTCTRL KEY_VOLUMEDOWN; then + IN_DEBUG_SHELL="y" + action="debug_shell" + # If instead they're pressing left shift or volume up, then fail boot + # and dump logs + elif iskey KEY_LEFTSHIFT KEY_VOLUMEUP; then + action="fail_halt_boot" + fi + + # Perform the selected action in a subshell and poll for completion + if [ -n "$action" ]; then + { + eval "$action" touch /tmp/debug_shell_exited } & + fi while ! [ -e /tmp/debug_shell_exited ]; do sleep 1 @@ -1323,6 +1338,10 @@ export_logs() { } fail_halt_boot() { + if [ "$IN_DEBUG_SHELL" = "y" ]; then + info "Boot fail while already in debug shell" + return + fi export_logs debug_shell echo "Looping forever"