Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
fca1cd3
Fix client config production test fixture
lawrencecchen Aug 6, 2026
37e5739
Merge remote-tracking branch 'origin/main' into fix-client-config-env…
lawrencecchen Aug 6, 2026
7b87d1e
Merge remote-tracking branch 'origin/main' into fix-client-config-env…
lawrencecchen Aug 6, 2026
129fd3c
test: report surviving SSH cleanup descendants
lawrencecchen Aug 6, 2026
e7e3ba5
fix: terminate SSH descendants after grace deadline
lawrencecchen Aug 6, 2026
e6f2439
Merge SSH cleanup fix into CI stabilization
lawrencecchen Aug 6, 2026
7de195d
test: run SSH deadline cleanup under zsh
lawrencecchen Aug 6, 2026
a970e8a
fix: make SSH deadline cleanup cross-shell safe
lawrencecchen Aug 6, 2026
8e8d008
Merge SSH cleanup review fixes
lawrencecchen Aug 6, 2026
681c4fd
test: report surviving SSH cleanup descendants
lawrencecchen Aug 6, 2026
e13c6f0
test: run SSH deadline cleanup under zsh
lawrencecchen Aug 6, 2026
c5da32c
fix: own SSH authentication cleanup snapshots
lawrencecchen Aug 6, 2026
1b8a737
test: reject shared-group TERM escapes
lawrencecchen Aug 6, 2026
ca5761a
fix: isolate graceful SSH cleanup groups
lawrencecchen Aug 6, 2026
82e5ff5
fix: revalidate SSH cleanup signals
lawrencecchen Aug 6, 2026
8abbb1e
fix: bound SSH identity scans
lawrencecchen Aug 6, 2026
4d61d68
fix: own SSH authentication process groups
lawrencecchen Aug 6, 2026
d26473a
fix: reap SSH authentication group anchors
lawrencecchen Aug 6, 2026
32e74bf
fix: secure SSH authentication cleanup state
lawrencecchen Aug 6, 2026
437675b
fix: close SSH authentication publication race
lawrencecchen Aug 6, 2026
59e8e4c
test: cover escaped SSH authentication groups
lawrencecchen Aug 6, 2026
307fb10
fix: contain escaped SSH authentication groups
lawrencecchen Aug 6, 2026
7be6d89
test: cover SSH cleanup snapshot failure
lawrencecchen Aug 6, 2026
270febb
fix: recover interrupted SSH authentication cleanup
lawrencecchen Aug 6, 2026
7dc1040
test: cover SSH cleanup deadline and final state removal
lawrencecchen Aug 6, 2026
51acb68
fix: bound SSH cleanup and remove final state
lawrencecchen Aug 6, 2026
f737501
test: cover duplicate SSH cleanup snapshots
lawrencecchen Aug 6, 2026
120a88f
fix: deduplicate frozen SSH process records
lawrencecchen Aug 6, 2026
5cc27f8
test: require deadline cleanup to reap descendants
lawrencecchen Aug 6, 2026
7b79c16
fix: reap frozen SSH cleanup descendants
lawrencecchen Aug 6, 2026
b7cb0bc
test: cover retryable SSH cleanup ownership
lawrencecchen Aug 6, 2026
76c470f
fix: retain SSH cleanup ownership until reaped
lawrencecchen Aug 6, 2026
ec8ea5e
test: cover completed SSH cleanup ownership
lawrencecchen Aug 6, 2026
b507e90
fix: finalize owned SSH groups after completion
lawrencecchen Aug 6, 2026
aaa166e
test: detach SSH cleanup recovery launcher
lawrencecchen Aug 6, 2026
86647cb
fix: preserve SSH reaper caller group
lawrencecchen Aug 6, 2026
b303e1f
test: cover durable safe SSH recovery
lawrencecchen Aug 6, 2026
9cb66f1
fix: retain durable safe SSH recovery
lawrencecchen Aug 6, 2026
163f8bf
test: make SSH deadline check deterministic
lawrencecchen Aug 6, 2026
5a37ab3
Merge remote-tracking branch 'origin/main' into fix-client-config-env…
lawrencecchen Aug 6, 2026
29ba0a6
Merge remote-tracking branch 'origin/fix-ssh-process-group-owner' int…
lawrencecchen Aug 6, 2026
7e83bd4
test: cover SSH cleanup review gaps
lawrencecchen Aug 6, 2026
bb10140
fix: harden SSH authentication reaper ownership
lawrencecchen Aug 6, 2026
18a778e
test: inject SSH executable into attach startup
lawrencecchen Aug 6, 2026
d5a9a78
test: assert SSH process death and exact attach verb
lawrencecchen Aug 6, 2026
77c88a6
test: cover abrupt SSH ownership recovery
lawrencecchen Aug 6, 2026
8b60176
fix: recover abruptly orphaned SSH auth groups
lawrencecchen Aug 6, 2026
ac871de
test: cover SSH recovery sweep fairness
lawrencecchen Aug 6, 2026
2f49a48
fix: rotate bounded SSH recovery sweeps
lawrencecchen Aug 6, 2026
be506ce
test: cover expired SSH orphan reclamation
lawrencecchen Aug 6, 2026
5d1bac5
fix: reclaim expired SSH orphan state
lawrencecchen Aug 6, 2026
0f29546
test: cover bounded SSH cleanup and recovery
lawrencecchen Aug 6, 2026
1085a6e
fix: bound SSH recovery and process cleanup
lawrencecchen Aug 6, 2026
14bee51
test: cover SSH recovery queue draining
lawrencecchen Aug 6, 2026
afe2066
fix: drain SSH recovery during retries
lawrencecchen Aug 6, 2026
62edf7c
test: cover standalone SSH attach ownership helpers
lawrencecchen Aug 6, 2026
397e6a0
fix: make SSH retry ownership self-contained
lawrencecchen Aug 6, 2026
4b6ec85
test: require in-process SSH cleanup signals
lawrencecchen Aug 6, 2026
07649a4
fix: signal SSH cleanup in process
lawrencecchen Aug 6, 2026
530e442
test: cover concurrent SSH reaper lock publication
lawrencecchen Aug 6, 2026
60a4be1
fix: publish SSH reaper ownership atomically
lawrencecchen Aug 6, 2026
e2bc301
test: require one-pass SSH cleanup transaction
lawrencecchen Aug 6, 2026
e7fb24f
fix: terminate SSH process trees in one transaction
lawrencecchen Aug 6, 2026
718fc58
test: cover abandoned stopped SSH publishers
lawrencecchen Aug 6, 2026
49244ef
fix: lease stopped SSH cleanup ownership
lawrencecchen Aug 6, 2026
1a76959
test: cover failed SSH recovery completion claims
lawrencecchen Aug 6, 2026
8247ef6
fix: bound SSH recovery claim ownership
lawrencecchen Aug 6, 2026
2608aae
test: cover SSH cancellation during publication
lawrencecchen Aug 6, 2026
33ce6e3
fix: reap SSH trees before ownership publication
lawrencecchen Aug 6, 2026
2c8dc41
test: cover SSH cleanup ownership safety
lawrencecchen Aug 7, 2026
a7f244c
fix: validate SSH cleanup ownership
lawrencecchen Aug 7, 2026
31589c6
test: cover SSH recovery ownership gaps
lawrencecchen Aug 7, 2026
01dc02d
test: cover durable SSH resume identity
lawrencecchen Aug 7, 2026
9e6129a
fix: revalidate SSH recovery ownership
lawrencecchen Aug 7, 2026
94818f6
test: cover SSH cleanup crash windows
lawrencecchen Aug 7, 2026
24f0f2c
test: preserve failed SSH stop recovery
lawrencecchen Aug 7, 2026
883cef7
fix: preserve SSH cleanup handoff state
lawrencecchen Aug 7, 2026
b19c3df
test: require macOS 14 recovery locking
lawrencecchen Aug 7, 2026
558b315
fix: support macOS 14 recovery locking
lawrencecchen Aug 7, 2026
d6e94c6
fix: deduplicate SSH cleanup ordering
lawrencecchen Aug 7, 2026
e1f3368
test: preserve reparented SSH reaper ownership
lawrencecchen Aug 7, 2026
f249597
fix: keep durable SSH ownership stable
lawrencecchen Aug 7, 2026
fc1627d
test: require rollback after cleanup deadline
lawrencecchen Aug 7, 2026
8c4ba06
test: journal groups before suspending
lawrencecchen Aug 7, 2026
7153cdc
test: bound SSH stop journals
lawrencecchen Aug 7, 2026
abbdfb2
fix: guarantee bounded SSH cleanup rollback
lawrencecchen Aug 7, 2026
410ef17
test: serialize SSH cleanup transactions
lawrencecchen Aug 7, 2026
d93464a
test: preserve cleanup worker identity
lawrencecchen Aug 7, 2026
a22fd0f
fix: serialize SSH cleanup ownership
lawrencecchen Aug 7, 2026
e59fb18
test: require durable SSH group identities
lawrencecchen Aug 7, 2026
d94efb3
fix: revalidate SSH group rollback identities
lawrencecchen Aug 7, 2026
464f84f
test: resume reparented SSH groups
lawrencecchen Aug 7, 2026
3aa4643
fix: resume reparented SSH groups
lawrencecchen Aug 7, 2026
fd9b2f6
test: require cleanup ownership before cancel
lawrencecchen Aug 7, 2026
f26ac1a
fix: own SSH cancellation before publication
lawrencecchen Aug 7, 2026
917a8c9
test: resume reparented SSH processes
lawrencecchen Aug 7, 2026
2d2fda2
fix: resume reparented SSH processes
lawrencecchen Aug 7, 2026
d630fa9
test: bind SSH reapers to ownership generation
lawrencecchen Aug 7, 2026
8d396b7
fix: bind SSH reapers to ownership generation
lawrencecchen Aug 7, 2026
7c46729
test: reap unpublished SSH anchors
lawrencecchen Aug 7, 2026
78b752d
fix: bind unpublished SSH anchor lifetime
lawrencecchen Aug 7, 2026
eece0d3
test: bound SSH rollback snapshots
lawrencecchen Aug 7, 2026
fa73117
fix: bound SSH cleanup rollback
lawrencecchen Aug 7, 2026
785bf6c
test: require progressive SSH cleanup batches
lawrencecchen Aug 7, 2026
1f72696
fix: make SSH cleanup transactions progressive
lawrencecchen Aug 7, 2026
3b2a032
test: isolate SSH recovery state
lawrencecchen Aug 7, 2026
1fe5b07
test: preserve unpublished SSH rollback journal
lawrencecchen Aug 7, 2026
d9e944f
test: recover unpublished SSH rollback journals
lawrencecchen Aug 7, 2026
c608c86
fix: preserve unpublished SSH rollback state
lawrencecchen Aug 7, 2026
7e80c01
test: cover SSH group freeze and anchor crashes
lawrencecchen Aug 7, 2026
4505f90
fix: close SSH authentication lifecycle gaps
lawrencecchen Aug 7, 2026
e0eb5c1
test: preserve pre-stopped authentication state
lawrencecchen Aug 7, 2026
7e3aea4
fix: preserve pre-stopped authentication state
lawrencecchen Aug 7, 2026
5a99f69
test: cover SSH anchor exit and PID reuse
lawrencecchen Aug 7, 2026
dde6bea
fix: harden SSH cleanup process identities
lawrencecchen Aug 7, 2026
09890be
test: reject inherited SSH anchor guard
lawrencecchen Aug 7, 2026
c607513
fix: close SSH anchor guard before auth
lawrencecchen Aug 7, 2026
34bbab9
test: retain incomplete SSH ownership recovery
lawrencecchen Aug 7, 2026
0d509de
fix: preserve incomplete SSH ownership recovery
lawrencecchen Aug 7, 2026
d978fcb
test: cap SSH recovery workers across startups
lawrencecchen Aug 7, 2026
e62d561
fix: share SSH recovery worker capacity
lawrencecchen Aug 7, 2026
b54c88e
test: expose oversized SSH startup commands
lawrencecchen Aug 7, 2026
79edb6f
fix: keep SSH startup payload within argv limit
lawrencecchen Aug 7, 2026
e1ce39e
Merge remote-tracking branch 'origin/main' into fix-client-config-env…
lawrencecchen Aug 7, 2026
a705ee1
test: require per-user SSH recovery fallback
lawrencecchen Aug 7, 2026
1911d39
fix: scope SSH recovery fallback per user
lawrencecchen Aug 7, 2026
b7b389f
test: observe CLI exit without global queue
lawrencecchen Aug 7, 2026
ad4a3ec
test: isolate SSH process exit observation
lawrencecchen Aug 7, 2026
98fc4dc
test: require nonblocking SSH recovery scheduling
lawrencecchen Aug 7, 2026
c9ba478
fix: move SSH recovery off startup path
lawrencecchen Aug 7, 2026
4e72fc4
Merge remote-tracking branch 'origin/main' into fix-client-config-env…
lawrencecchen Aug 7, 2026
1b7e239
test: bound aggregate SSH cleanup work
lawrencecchen Aug 7, 2026
a662aba
fix: bound aggregate SSH cleanup work
lawrencecchen Aug 7, 2026
d6632e1
fix: hand off SSH recovery ownership by lock
lawrencecchen Aug 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions CLI/CMUXCLI+SSHStartupScripts.swift
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,9 @@ extension CMUXCLI {
let trimmedOneTimeCommand = oneTimeCommand?.trimmingCharacters(in: .whitespacesAndNewlines)
let hasOneTimeCommand = trimmedOneTimeCommand?.isEmpty == false
let authRetryPolicy = SSHForegroundAuthenticationRetryPolicy()
let authGroupCleanupBody = authRetryPolicy.authenticationGroupDirectoryCleanupShellBody(
terminatesPublishedGroup: hasOneTimeCommand
)
let backoffBuilder = SSHRetryBackoffScriptBuilder(context: .startup)
var scriptLines: [String] = []
if !shellFeaturesBootstrap.isEmpty {
Expand Down Expand Up @@ -337,8 +340,10 @@ extension CMUXCLI {
}
if let trimmedOneTimeCommand, !trimmedOneTimeCommand.isEmpty {
scriptLines += ["cmux_ssh_foreground_auth() {", trimmedOneTimeCommand, "}"]
scriptLines.append(authRetryPolicy.processTreeTerminationShellFunction())
}
// A prior foreground-auth cleanup can outlive the session that created
// it, so every SSH startup owns one bounded recovery pass.
scriptLines.append(authRetryPolicy.processTreeTerminationShellFunction())
let reconnectConfiguration = retryPTYAttachStatus ? [
"cmux_ssh_reconnect_limit=\"${CMUX_SSH_RECONNECT_LIMIT:-}\"",
"case \"$cmux_ssh_reconnect_limit\" in '') cmux_ssh_reconnect_limit='∞'; cmux_ssh_reconnect_unbounded=1 ;; *[!0-9]*) cmux_ssh_reconnect_limit=20; cmux_ssh_reconnect_unbounded=0 ;; *) cmux_ssh_reconnect_unbounded=0 ;; esac",
Expand All @@ -365,24 +370,27 @@ extension CMUXCLI {
"cmux_ssh_auth_retry_limit=\(authRetryPolicy.maximumConsecutiveTransientFailures); cmux_ssh_auth_retry=0",
// Initial transient foreground-auth failures are a reconnect phase, so boot-time outages share this loop.
"cmux_ssh_reauth_required=\(hasOneTimeCommand ? 1 : 0)",
"CMUX_SSH_CHILD_PID=; CMUX_SSH_AUTH_PID=; CMUX_SSH_PENDING_SIGNAL=; CMUX_SSH_PENDING_SIGNAL_NAME=",
"CMUX_SSH_CHILD_PID=; CMUX_SSH_AUTH_PID=; CMUX_SSH_AUTH_GROUP_DIR=; CMUX_SSH_PENDING_SIGNAL=; CMUX_SSH_PENDING_SIGNAL_NAME=",
"export CMUX_SSH_AUTH_GROUP_DIR",
] + backoffBuilder.stateInitializationLines + [
"cmux_ssh_note() { if [ -t 2 ]; then printf \"$@\" >&2 || true; fi; }",
"cmux_ssh_register_attempt() { \(lifecycleLaunching); }",
"cmux_ssh_begin_attempt() { CMUX_SSH_ATTEMPT_ID=$(/usr/bin/uuidgen | /usr/bin/tr '[:upper:]' '[:lower:]') || return 1; export CMUX_SSH_ATTEMPT_ID; cmux_ssh_attempt_registration_retry=0; while ! cmux_ssh_register_attempt; do cmux_ssh_attempt_registration_retry=$((cmux_ssh_attempt_registration_retry + 1)); if [ \"$cmux_ssh_attempt_registration_retry\" -ge 3 ]; then return 1; fi; /bin/sleep 0.1; done; }",
"cmux_ssh_session_end() { if [ \"${CMUX_SSH_SESSION_ENDED:-0}\" = 1 ]; then return; fi; CMUX_SSH_SESSION_ENDED=1; cmux_ssh_cleanup_password; \(lifecycleCleanup); }",
"cmux_ssh_retire_for_signal() { cmux_ssh_signal_status=\"$1\"; CMUX_SSH_SESSION_ENDED=1; cmux_ssh_cleanup_password; \(lifecycleRetirement); trap - EXIT HUP INT TERM; exit \"$cmux_ssh_signal_status\"; }",
"cmux_ssh_signal_exit() { cmux_ssh_signal_status=\"$1\"; cmux_ssh_signal_name=\"$2\"; if [ -n \"${CMUX_SSH_AUTH_PID:-}\" ]; then cmux_ssh_terminate_auth_process_tree \"$CMUX_SSH_AUTH_PID\" \"$CMUX_SSH_STARTUP_PID\"; wait \"$CMUX_SSH_AUTH_PID\" 2>/dev/null || true; CMUX_SSH_AUTH_PID=; \(backoffBuilder.signalHandlerBranches) elif [ -z \"${CMUX_SSH_CHILD_PID:-}\" ]; then CMUX_SSH_PENDING_SIGNAL=\"$cmux_ssh_signal_status\"; CMUX_SSH_PENDING_SIGNAL_NAME=\"$cmux_ssh_signal_name\"; return; fi; cmux_ssh_retire_for_signal \"$cmux_ssh_signal_status\"; }",
"cmux_ssh_remove_auth_group_dir() { \(authGroupCleanupBody) }",
"cmux_ssh_session_end() { if [ \"${CMUX_SSH_SESSION_ENDED:-0}\" = 1 ]; then return; fi; CMUX_SSH_SESSION_ENDED=1; cmux_ssh_remove_auth_group_dir; cmux_ssh_cleanup_password; \(lifecycleCleanup); }",
"cmux_ssh_retire_for_signal() { cmux_ssh_signal_status=\"$1\"; CMUX_SSH_SESSION_ENDED=1; cmux_ssh_remove_auth_group_dir; cmux_ssh_cleanup_password; \(lifecycleRetirement); trap - EXIT HUP INT TERM; exit \"$cmux_ssh_signal_status\"; }",
"cmux_ssh_signal_exit() { cmux_ssh_signal_status=\"$1\"; cmux_ssh_signal_name=\"$2\"; if [ -n \"${CMUX_SSH_AUTH_PID:-}\" ]; then cmux_ssh_terminate_auth_process_tree \"$CMUX_SSH_AUTH_PID\" \"$CMUX_SSH_STARTUP_PID\"; wait \"$CMUX_SSH_AUTH_PID\" 2>/dev/null || true; CMUX_SSH_AUTH_PID=; cmux_ssh_remove_auth_group_dir; \(backoffBuilder.signalHandlerBranches) elif [ -z \"${CMUX_SSH_CHILD_PID:-}\" ]; then CMUX_SSH_PENDING_SIGNAL=\"$cmux_ssh_signal_status\"; CMUX_SSH_PENDING_SIGNAL_NAME=\"$cmux_ssh_signal_name\"; return; fi; cmux_ssh_retire_for_signal \"$cmux_ssh_signal_status\"; }",
"trap 'cmux_ssh_session_end' EXIT",
"trap 'cmux_ssh_signal_exit 129 HUP' HUP",
"trap 'cmux_ssh_signal_exit 130 INT' INT",
"trap 'cmux_ssh_signal_exit 143 TERM' TERM",
"cmux_ssh_schedule_failed_auth_group_recovery",
"while :; do",
" if [ -n \"${CMUX_SSH_PENDING_SIGNAL:-}\" ]; then cmux_ssh_retire_for_signal \"$CMUX_SSH_PENDING_SIGNAL\"; fi",
]
if hasOneTimeCommand {
scriptLines.append(" if [ \"$cmux_ssh_reauth_required\" -eq 1 ]; then")
scriptLines += [" ( cmux_ssh_foreground_auth ) <&0 &", " CMUX_SSH_AUTH_PID=$!; if [ -n \"${CMUX_SSH_PENDING_SIGNAL:-}\" ]; then cmux_ssh_signal_exit \"$CMUX_SSH_PENDING_SIGNAL\" \"${CMUX_SSH_PENDING_SIGNAL_NAME:-TERM}\"; fi; wait \"$CMUX_SSH_AUTH_PID\"; cmux_ssh_status=$?; CMUX_SSH_AUTH_PID=; case \"$cmux_ssh_status\" in 129|130|143) cmux_ssh_retire_for_signal \"$cmux_ssh_status\" ;; esac; if [ -n \"${CMUX_SSH_PENDING_SIGNAL:-}\" ]; then cmux_ssh_session_end; trap - EXIT HUP INT TERM; exit \"$CMUX_SSH_PENDING_SIGNAL\"; fi", " if [ \"$cmux_ssh_status\" -eq 0 ]; then cmux_ssh_reauth_required=0; cmux_ssh_auth_retry=0; else case \"$cmux_ssh_status\" in 254) cmux_ssh_auth_retry=$((cmux_ssh_auth_retry + 1)); if [ \"$cmux_ssh_auth_retry\" -ge \"$cmux_ssh_auth_retry_limit\" ]; then cmux_ssh_status=255; break; fi ;; \(authRetryPolicy.unclassifiedFailureExitStatus)) cmux_ssh_status=255; break ;; *) break ;; esac; fi", " fi", " if [ \"$cmux_ssh_reauth_required\" -eq 0 ]; then"]
scriptLines += [" CMUX_SSH_AUTH_GROUP_DIR=$(cmux_ssh_auth_create_group_dir) || { cmux_ssh_status=255; break; }; export CMUX_SSH_AUTH_GROUP_DIR", " ( cmux_ssh_foreground_auth ) <&0 &", " CMUX_SSH_AUTH_PID=$!; if [ -n \"${CMUX_SSH_PENDING_SIGNAL:-}\" ]; then cmux_ssh_signal_exit \"$CMUX_SSH_PENDING_SIGNAL\" \"${CMUX_SSH_PENDING_SIGNAL_NAME:-TERM}\"; fi; wait \"$CMUX_SSH_AUTH_PID\"; cmux_ssh_status=$?; CMUX_SSH_AUTH_PID=; case \"$cmux_ssh_status\" in 129|130|143) cmux_ssh_retire_for_signal \"$cmux_ssh_status\" ;; esac; cmux_ssh_remove_auth_group_dir; if [ -n \"${CMUX_SSH_PENDING_SIGNAL:-}\" ]; then cmux_ssh_session_end; trap - EXIT HUP INT TERM; exit \"$CMUX_SSH_PENDING_SIGNAL\"; fi", " if [ \"$cmux_ssh_status\" -eq 0 ]; then cmux_ssh_reauth_required=0; cmux_ssh_auth_retry=0; else case \"$cmux_ssh_status\" in 254) cmux_ssh_auth_retry=$((cmux_ssh_auth_retry + 1)); if [ \"$cmux_ssh_auth_retry\" -ge \"$cmux_ssh_auth_retry_limit\" ]; then cmux_ssh_status=255; break; fi ;; \(authRetryPolicy.unclassifiedFailureExitStatus)) cmux_ssh_status=255; break ;; *) break ;; esac; fi", " fi", " if [ \"$cmux_ssh_reauth_required\" -eq 0 ]; then"]
}
if let trimmedControlPathPreflight, !trimmedControlPathPreflight.isEmpty,
!hasOneTimeCommand {
Expand Down Expand Up @@ -473,15 +481,16 @@ extension CMUXCLI {
let encodedLiteral = shellQuote(encodedScript)
let wrapper = [
"cmux_tmp=$(mktemp \"${TMPDIR:-/tmp}/\(tempPrefix).XXXXXX\") || exit 1",
"cmux_payload=\(encodedLiteral)",
"cmux_cleanup() { rm -f -- \"$cmux_tmp\" 2>/dev/null || true; }",
"trap 'cmux_cleanup' EXIT HUP INT TERM",
"(printf %s \(encodedLiteral) | base64 -d 2>/dev/null || printf %s \(encodedLiteral) | base64 -D 2>/dev/null) > \"$cmux_tmp\" || exit 1",
"(printf %s \"$cmux_payload\" | base64 -d 2>/dev/null || printf %s \"$cmux_payload\" | base64 -D 2>/dev/null) > \"$cmux_tmp\" || exit 1",
"chmod 700 \"$cmux_tmp\" >/dev/null 2>&1 || true",
"/bin/sh \"$cmux_tmp\"",
"cmux_status=$?",
"trap - EXIT HUP INT TERM",
"cmux_cleanup",
"unset cmux_tmp cmux_status",
"unset cmux_tmp cmux_payload cmux_status",
"unset -f cmux_cleanup 2>/dev/null || true",
"exit $cmux_status",
].joined(separator: "\n")
Expand Down
Loading