Skip to content

Commit dfa434a

Browse files
authored
cli: fix tunnels not working on Windows (#211499)
I made a change this past iteration to use `CREATE_BREAKAWAY_FROM_JOB` in order to allow the code-server process to outlive SSH connections run from the exec server. However, it appears that this _can_ break things if it's run from a job that doesn't have the JOB_OBJECT_LIMIT_BREAKAWAY_OK flag set. I'm not a winapi expert, so this is a simple though perhaps inefficient change to probe whether we can do this via an echo command before starting the server.
1 parent 42d35ef commit dfa434a

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

cli/src/tunnels/code_server.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ impl<'a> ServerBuilder<'a> {
479479
.arg("--enable-remote-auto-shutdown")
480480
.arg(format!("--port={}", port));
481481

482-
let child = self.spawn_server_process(cmd)?;
482+
let child = self.spawn_server_process(cmd).await?;
483483
let log_file = self.get_logfile()?;
484484
let plog = self.logger.prefixed(&log::new_code_server_prefix());
485485

@@ -553,7 +553,7 @@ impl<'a> ServerBuilder<'a> {
553553
.arg("--enable-remote-auto-shutdown")
554554
.arg(format!("--socket-path={}", socket.display()));
555555

556-
let child = self.spawn_server_process(cmd)?;
556+
let child = self.spawn_server_process(cmd).await?;
557557
let log_file = self.get_logfile()?;
558558
let plog = self.logger.prefixed(&log::new_code_server_prefix());
559559

@@ -594,13 +594,13 @@ impl<'a> ServerBuilder<'a> {
594594
let mut cmd = self.get_base_command();
595595
cmd.args(args);
596596

597-
let child = self.spawn_server_process(cmd)?;
597+
let child = self.spawn_server_process(cmd).await?;
598598
let plog = self.logger.prefixed(&log::new_code_server_prefix());
599599

600600
Ok(monitor_server::<M, R>(child, None, plog, true))
601601
}
602602

603-
fn spawn_server_process(&self, mut cmd: Command) -> Result<Child, AnyError> {
603+
async fn spawn_server_process(&self, mut cmd: Command) -> Result<Child, AnyError> {
604604
info!(self.logger, "Starting server...");
605605

606606
debug!(self.logger, "Starting server with command... {:?}", cmd);
@@ -615,7 +615,10 @@ impl<'a> ServerBuilder<'a> {
615615
let cmd = cmd.creation_flags(
616616
winapi::um::winbase::CREATE_NO_WINDOW
617617
| winapi::um::winbase::CREATE_NEW_PROCESS_GROUP
618-
| winapi::um::winbase::CREATE_BREAKAWAY_FROM_JOB,
618+
| get_should_use_breakaway_from_job()
619+
.await
620+
.then_some(winapi::um::winbase::CREATE_BREAKAWAY_FROM_JOB)
621+
.unwrap_or_default(),
619622
);
620623

621624
let child = cmd
@@ -874,3 +877,13 @@ pub async fn download_cli_into_cache(
874877
}
875878
}
876879
}
880+
881+
#[cfg(target_os = "windows")]
882+
async fn get_should_use_breakaway_from_job() -> bool {
883+
let mut cmd = Command::new("cmd");
884+
cmd.creation_flags(
885+
winapi::um::winbase::CREATE_NO_WINDOW | winapi::um::winbase::CREATE_BREAKAWAY_FROM_JOB,
886+
);
887+
888+
cmd.args(["/C", "echo ok"]).output().await.is_ok()
889+
}

0 commit comments

Comments
 (0)