@@ -3894,9 +3894,6 @@ parent_pid = int(sys.argv[1])
38943894lock_path, wait_text, status_path = sys.argv[2:]
38953895wait_seconds = int(wait_text)
38963896
3897- if not hasattr(os, "pidfd_open") or not hasattr(signal, "pidfd_send_signal"):
3898- sys.exit(1)
3899-
39003897libc_name = ctypes.util.find_library("c") or "libc.so.6"
39013898try:
39023899 libc = ctypes.CDLL(libc_name, use_errno=True)
@@ -3999,49 +3996,16 @@ launcher_lock_helper_is_active() {
39993996}
40003997
40013998stop_launcher_lock_helper() {
4002- python3 - \
4003- "$LAUNCHER_LOCK_HELPER_PID" \
4004- "$LAUNCHER_LOCK_HELPER_START_TIME" \
4005- "${BASHPID:-$$}" <<'PY'
4006- import os
4007- import select
4008- import signal
4009- import sys
4010-
4011- pid = int(sys.argv[1])
4012- expected_start_time = sys.argv[2]
4013- expected_parent = int(sys.argv[3])
3999+ local actual_start_time
4000+ local cmdline
40144001
4015- if not hasattr(os, "pidfd_open") or not hasattr(signal, "pidfd_send_signal"):
4016- sys.exit(1)
4017- try:
4018- pidfd = os.pidfd_open(pid, 0)
4019- with open(f"/proc/{pid}/stat", "r", encoding="utf-8") as handle:
4020- fields = handle.read().rsplit(") ", 1)[1].split()
4021- if fields[19] != expected_start_time or int(fields[1]) != expected_parent:
4022- os.close(pidfd)
4023- sys.exit(1)
4024- poller = select.poll()
4025- poller.register(pidfd, select.POLLIN)
4026- exited = False
4027- for requested_signal, wait_ms in (
4028- (signal.SIGUSR1, 500),
4029- (signal.SIGTERM, 500),
4030- (signal.SIGKILL, 500),
4031- ):
4032- try:
4033- signal.pidfd_send_signal(pidfd, requested_signal)
4034- except ProcessLookupError:
4035- exited = True
4036- break
4037- if poller.poll(wait_ms):
4038- exited = True
4039- break
4040- os.close(pidfd)
4041- sys.exit(0 if exited else 1)
4042- except (OSError, IndexError, ValueError):
4043- sys.exit(1)
4044- PY
4002+ [[ "$LAUNCHER_LOCK_HELPER_PID" =~ ^[0-9]+$ ]] || return 1
4003+ actual_start_time="$(pid_start_time "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || true)"
4004+ [ -n "$actual_start_time" ] && [ "$actual_start_time" = "$LAUNCHER_LOCK_HELPER_START_TIME" ] || return 1
4005+ pid_parent_matches "$LAUNCHER_LOCK_HELPER_PID" "${BASHPID:-$$}" || return 1
4006+ cmdline="$(pid_cmdline "$LAUNCHER_LOCK_HELPER_PID")"
4007+ [[ "$cmdline" == *" $APP_STATE_DIR/launcher.lock "*" $LAUNCHER_LOCK_STATUS_PATH"* ]] || return 1
4008+ kill -TERM "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || ! kill -0 "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null
40454009}
40464010
40474011release_launcher_lock() {
@@ -4051,7 +4015,7 @@ release_launcher_lock() {
40514015 if stop_launcher_lock_helper; then
40524016 wait "$LAUNCHER_LOCK_HELPER_PID" 2>/dev/null || true
40534017 else
4054- echo "WARN: launcher lock helper did not exit after bounded pidfd signals " >&2
4018+ echo "WARN: launcher lock helper did not exit after a verified release signal " >&2
40554019 fi
40564020 fi
40574021 LAUNCHER_LOCK_HELPER_PID=""
0 commit comments