Stop sandboxing remote shells
ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
This commit is contained in:
+23
-8
@@ -512,12 +512,13 @@ impl ServerState {
|
||||
|
||||
/// Whether a session named `name` should be backed by a persistent holder.
|
||||
///
|
||||
/// With persistence enabled, every PTY session gets a detached holder. That
|
||||
/// includes implicit `term-<millis>-<pid>` sessions: a reconnecting client has
|
||||
/// the exact session name in its ticket cache, so it can reattach after a
|
||||
/// quick server restart without forcing users to name sessions manually.
|
||||
fn should_persist_session(&self, _name: &str) -> bool {
|
||||
self.config.persist_sessions
|
||||
/// With persistence enabled, explicitly named sessions get a detached
|
||||
/// holder. Implicit `term-<millis>-<pid>` sessions are one-off terminals
|
||||
/// created by `dosh host`; users cannot intentionally reattach to them by
|
||||
/// name, so persisting them only leaves stale holders that can be
|
||||
/// accidentally re-adopted after restarts.
|
||||
fn should_persist_session(&self, name: &str) -> bool {
|
||||
self.config.persist_sessions && !protocol::is_implicit_session_name(name)
|
||||
}
|
||||
|
||||
/// Spawn (or, in the persistent case, spawn-and-adopt) a PTY for a session.
|
||||
@@ -605,6 +606,20 @@ impl ServerState {
|
||||
if self.sessions.contains_key(&name) {
|
||||
continue;
|
||||
}
|
||||
if !self.should_persist_session(&name) {
|
||||
eprintln!(
|
||||
"discarding stale implicit persistent session {name} (shell pid {})",
|
||||
meta.shell_pid
|
||||
);
|
||||
persist::request_shutdown(&sessions_dir, &name, None);
|
||||
if meta.shell_pid > 0 {
|
||||
let _ = unsafe { libc::kill(meta.shell_pid, libc::SIGHUP) };
|
||||
let _ = unsafe { libc::kill(meta.shell_pid, libc::SIGTERM) };
|
||||
std::thread::sleep(Duration::from_millis(50));
|
||||
let _ = unsafe { libc::kill(meta.shell_pid, libc::SIGKILL) };
|
||||
}
|
||||
continue;
|
||||
}
|
||||
let (pty, control) = match self.adopt_persistent_pty(&name) {
|
||||
Ok(pair) => pair,
|
||||
Err(err) => {
|
||||
@@ -3841,7 +3856,7 @@ mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn persists_all_sessions_when_enabled() {
|
||||
fn persists_named_sessions_when_enabled() {
|
||||
let (pty_tx, _rx) = mpsc::unbounded_channel();
|
||||
let config = ServerConfig {
|
||||
persist_sessions: true,
|
||||
@@ -3851,7 +3866,7 @@ mod tests {
|
||||
let state = ServerState::new(config, [0u8; 32], pty_tx);
|
||||
assert!(state.should_persist_session("default")); // prewarmed
|
||||
assert!(state.should_persist_session("work")); // explicitly named
|
||||
assert!(state.should_persist_session("term-1781470634216-76685")); // implicit reconnect
|
||||
assert!(!state.should_persist_session("term-1781470634216-76685")); // one-off terminal
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -435,6 +435,10 @@ pub fn run_holder(
|
||||
let mut cmd = [0u8; 1];
|
||||
match stream.read(&mut cmd) {
|
||||
Ok(1) if cmd[0] == HOLDER_CMD_SHUTDOWN => {
|
||||
if shell_pid > 0 {
|
||||
let _ = unsafe { libc::kill(shell_pid, libc::SIGHUP) };
|
||||
let _ = unsafe { libc::kill(shell_pid, libc::SIGTERM) };
|
||||
}
|
||||
let _ = std::fs::remove_dir_all(runtime_dir);
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user