@@ -3873,9 +3873,6 @@ parent_pid = int(sys.argv[1])
38733873lock_path, wait_text, status_path = sys.argv[2:]
38743874wait_seconds = int(wait_text)
38753875
3876- if not hasattr(os, "pidfd_open") or not hasattr(signal, "pidfd_send_signal"):
3877- sys.exit(1)
3878-
38793876libc_name = ctypes.util.find_library("c") or "libc.so.6"
38803877try:
38813878 libc = ctypes.CDLL(libc_name, use_errno=True)
@@ -3978,49 +3975,16 @@ launcher_lock_helper_is_active() {
39783975}
39793976
39803977stop_launcher_lock_helper() {
3981- python3 - \
3982- "$LAUNCHER_LOCK_HELPER_PID" \
3983- "$LAUNCHER_LOCK_HELPER_START_TIME" \
3984- "${BASHPID:-$$}" <<'PY'
3985- import os
3986- import select
3987- import signal
3988- import sys
3989-
3990- pid = int(sys.argv[1])
3991- expected_start_time = sys.argv[2]
3992- expected_parent = int(sys.argv[3])
3978+ local actual_start_time
3979+ local cmdline
39933980
3994- if not hasattr(os, "pidfd_open") or not hasattr(signal, "pidfd_send_signal"):
3995- sys.exit(1)
3996- try:
3997- pidfd = os.pidfd_open(pid, 0)
3998- with open(f"/proc/{pid}/stat", "r", encoding="utf-8") as handle:
3999- fields = handle.read().rsplit(") ", 1)[1].split()
4000- if fields[19] != expected_start_time or int(fields[1]) != expected_parent:
4001- os.close(pidfd)
4002- sys.exit(1)
4003- poller = select.poll()
4004- poller.register(pidfd, select.POLLIN)
4005- exited = False
4006- for requested_signal, wait_ms in (
4007- (signal.SIGUSR1, 500),
4008- (signal.SIGTERM, 500),
4009- (signal.SIGKILL, 500),
4010- ):
4011- try:
4012- signal.pidfd_send_signal(pidfd, requested_signal)
4013- except ProcessLookupError:
4014- exited = True
4015- break
4016- if poller.poll(wait_ms):
4017- exited = True
4018- break
4019- os.close(pidfd)
4020- sys.exit(0 if exited else 1)
4021- except (OSError, IndexError, ValueError):
4022- sys.exit(1)
4023- PY
3981+ [[ "$LAUNCHER_LOCK_HELPER_PID" =~ ^[0-9]+$ ]] || return 1
3982+ actual_start_time="$(pid_start_time "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || true)"
3983+ [ -n "$actual_start_time" ] && [ "$actual_start_time" = "$LAUNCHER_LOCK_HELPER_START_TIME" ] || return 1
3984+ pid_parent_matches "$LAUNCHER_LOCK_HELPER_PID" "${BASHPID:-$$}" || return 1
3985+ cmdline="$(pid_cmdline "$LAUNCHER_LOCK_HELPER_PID")"
3986+ [[ "$cmdline" == *" $APP_STATE_DIR/launcher.lock "*" $LAUNCHER_LOCK_STATUS_PATH"* ]] || return 1
3987+ kill -TERM "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || ! kill -0 "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null
40243988}
40253989
40263990release_launcher_lock() {
@@ -4030,7 +3994,7 @@ release_launcher_lock() {
40303994 if stop_launcher_lock_helper; then
40313995 wait "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || true
40323996 else
4033- echo "WARN: launcher lock helper did not exit after bounded pidfd signals " >&2
3997+ echo "WARN: launcher lock helper did not exit after a verified release signal " >&2
40343998 fi
40353999 fi
40364000 LAUNCHER_LOCK_HELPER_PID=""
0 commit comments