js: Use Shell.util_spawn_async functions to launch external processes

As explained in previous commits, it's not safe to use JS code in child
function callbacks, so let's use the safer version of it.

Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6698
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3293>
This commit is contained in:
Marco Trevisan (Treviño) 2024-05-01 01:14:43 +02:00 committed by Marge Bot
parent 781010be66
commit 26e8fb90fb
3 changed files with 8 additions and 28 deletions

View File

@ -115,16 +115,9 @@ class IBusManager extends Signals.EventEmitter {
const env = launchContext.get_environment(); const env = launchContext.get_environment();
// Use DO_NOT_REAP_CHILD to avoid adouble-fork internally // Use DO_NOT_REAP_CHILD to avoid adouble-fork internally
// since ibus-daemon refuses to start with init as its parent. // since ibus-daemon refuses to start with init as its parent.
const [success_, pid] = GLib.spawn_async( const pid = Shell.util_spawn_async(
null, cmdLine, env, null, cmdLine, env,
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD);
() => {
try {
global.context.restore_rlimit_nofile();
} catch (err) {
}
}
);
GLib.child_watch_add( GLib.child_watch_add(
GLib.PRIORITY_DEFAULT, GLib.PRIORITY_DEFAULT,
pid, pid,

View File

@ -118,19 +118,12 @@ export function spawnApp(argv) {
* this will throw an error. * this will throw an error.
*/ */
export function trySpawn(argv) { export function trySpawn(argv) {
let success_, pid; let pid;
try { try {
const launchContext = global.create_app_launch_context(0, -1); const launchContext = global.create_app_launch_context(0, -1);
[success_, pid] = GLib.spawn_async( pid = Shell.util_spawn_async(
null, argv, launchContext.get_environment(), null, argv, launchContext.get_environment(),
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD, GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD);
() => {
try {
global.context.restore_rlimit_nofile();
} catch (err) {
}
}
);
} catch (err) { } catch (err) {
/* Rewrite the error in case of ENOENT */ /* Rewrite the error in case of ENOENT */
if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) { if (err.matches(GLib.SpawnError, GLib.SpawnError.NOENT)) {

View File

@ -456,18 +456,12 @@ class VPNRequestHandler extends Signals.EventEmitter {
try { try {
const launchContext = global.create_app_launch_context(0, -1); const launchContext = global.create_app_launch_context(0, -1);
let [success_, pid, stdin, stdout, stderr] = let [pid, stdin, stdout, stderr] =
GLib.spawn_async_with_pipes( Shell.util_spawn_async_with_pipes(
null, /* pwd */ null, /* pwd */
argv, argv,
launchContext.get_environment(), launchContext.get_environment(),
GLib.SpawnFlags.DO_NOT_REAP_CHILD, GLib.SpawnFlags.DO_NOT_REAP_CHILD);
() => {
try {
global.context.restore_rlimit_nofile();
} catch (err) {
}
});
this._childPid = pid; this._childPid = pid;
this._stdin = new GioUnix.OutputStream({fd: stdin, close_fd: true}); this._stdin = new GioUnix.OutputStream({fd: stdin, close_fd: true});