Skip to content

Commit 155b155

Browse files
authored
vscode-server crashes, if there is no network interface with a valid mac address present (microsoft#176368)
1 parent f0a25d6 commit 155b155

File tree

1 file changed

+34
-18
lines changed

1 file changed

+34
-18
lines changed

src/vs/server/node/remoteExtensionHostAgentServer.ts

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -666,14 +666,10 @@ export async function createServer(address: string | net.AddressInfo | null, arg
666666
console.warn(connectionToken.message);
667667
process.exit(1);
668668
}
669-
const disposables = new DisposableStore();
670-
const { socketServer, instantiationService } = await setupServerServices(connectionToken, args, REMOTE_DATA_FOLDER, disposables);
671669

672-
// Set the unexpected error handler after the services have been initialized, to avoid having
673-
// the telemetry service overwrite our handler
674-
let didLogAboutSIGPIPE = false;
675-
instantiationService.invokeFunction((accessor) => {
676-
const logService = accessor.get(ILogService);
670+
// setting up error handlers, first with console.error, then, once available, using the log service
671+
672+
function initUnexpectedErrorHandler(handler: (err: any) => void) {
677673
setUnexpectedErrorHandler(err => {
678674
// See https://github.com/microsoft/vscode-remote-release/issues/6481
679675
// In some circumstances, console.error will throw an asynchronous error. This asynchronous error
@@ -682,18 +678,38 @@ export async function createServer(address: string | net.AddressInfo | null, arg
682678
if (isSigPipeError(err) && err.stack && /unexpectedErrorHandler/.test(err.stack)) {
683679
return;
684680
}
685-
logService.error(err);
686-
});
687-
process.on('SIGPIPE', () => {
688-
// See https://github.com/microsoft/vscode-remote-release/issues/6543
689-
// We would normally install a SIGPIPE listener in bootstrap.js
690-
// But in certain situations, the console itself can be in a broken pipe state
691-
// so logging SIGPIPE to the console will cause an infinite async loop
692-
if (!didLogAboutSIGPIPE) {
693-
didLogAboutSIGPIPE = true;
694-
onUnexpectedError(new Error(`Unexpected SIGPIPE`));
695-
}
681+
handler(err);
696682
});
683+
}
684+
685+
const unloggedErrors: any[] = [];
686+
initUnexpectedErrorHandler((error: any) => {
687+
unloggedErrors.push(error);
688+
console.error(error);
689+
});
690+
let didLogAboutSIGPIPE = false;
691+
process.on('SIGPIPE', () => {
692+
// See https://github.com/microsoft/vscode-remote-release/issues/6543
693+
// We would normally install a SIGPIPE listener in bootstrap.js
694+
// But in certain situations, the console itself can be in a broken pipe state
695+
// so logging SIGPIPE to the console will cause an infinite async loop
696+
if (!didLogAboutSIGPIPE) {
697+
didLogAboutSIGPIPE = true;
698+
onUnexpectedError(new Error(`Unexpected SIGPIPE`));
699+
}
700+
});
701+
702+
const disposables = new DisposableStore();
703+
const { socketServer, instantiationService } = await setupServerServices(connectionToken, args, REMOTE_DATA_FOLDER, disposables);
704+
705+
// Set the unexpected error handler after the services have been initialized, to avoid having
706+
// the telemetry service overwrite our handler
707+
instantiationService.invokeFunction((accessor) => {
708+
const logService = accessor.get(ILogService);
709+
unloggedErrors.forEach(error => logService.error(error));
710+
unloggedErrors.length = 0;
711+
712+
initUnexpectedErrorHandler((error: any) => logService.error(error));
697713
});
698714

699715
//

0 commit comments

Comments
 (0)