diff --git a/src/kernel/emulation/linux/elfcalls_wrapper.c b/src/kernel/emulation/linux/elfcalls_wrapper.c index b3341a05b..cab862dfd 100644 --- a/src/kernel/emulation/linux/elfcalls_wrapper.c +++ b/src/kernel/emulation/linux/elfcalls_wrapper.c @@ -100,6 +100,6 @@ int __dserver_process_lifetime_pipe_refresh(void) { return elfcalls()->dserver_process_lifetime_pipe_refresh(); }; -void __dserver_close_process_lifetime_pipe(int* fds) { - return elfcalls()->dserver_close_process_lifetime_pipe(fds); +void __dserver_close_process_lifetime_pipe(int fd) { + return elfcalls()->dserver_close_process_lifetime_pipe(fd); }; diff --git a/src/kernel/emulation/linux/elfcalls_wrapper.h b/src/kernel/emulation/linux/elfcalls_wrapper.h index c2e1508dd..b120cad21 100644 --- a/src/kernel/emulation/linux/elfcalls_wrapper.h +++ b/src/kernel/emulation/linux/elfcalls_wrapper.h @@ -35,7 +35,7 @@ void __dserver_close_socket(int socket); int __dserver_get_process_lifetime_pipe(void); int __dserver_process_lifetime_pipe_refresh(void); -void __dserver_close_process_lifetime_pipe(int* fds); +void __dserver_close_process_lifetime_pipe(int fd); #ifdef __cplusplus } diff --git a/src/kernel/emulation/linux/mach/lkm.c b/src/kernel/emulation/linux/mach/lkm.c index 1323eaeb0..4784a73ad 100644 --- a/src/kernel/emulation/linux/mach/lkm.c +++ b/src/kernel/emulation/linux/mach/lkm.c @@ -57,6 +57,11 @@ void mach_driver_init(const char** applep) guard_entry_options_t options; options.close = _elfcalls->dserver_close_socket; guard_table_add(__dserver_per_thread_socket(), guard_flag_prevent_close | guard_flag_close_on_fork, &options); + int lifetime_pipe = __dserver_get_process_lifetime_pipe(); + if (lifetime_pipe != -1) { + options.close = _elfcalls->dserver_close_process_lifetime_pipe; + guard_table_add(lifetime_pipe, guard_flag_prevent_close | guard_flag_close_on_fork, &options); + } } #endif diff --git a/src/kernel/emulation/linux/process/fork.c b/src/kernel/emulation/linux/process/fork.c index 9085ff7cc..188f846ef 100644 --- a/src/kernel/emulation/linux/process/fork.c +++ b/src/kernel/emulation/linux/process/fork.c @@ -46,6 +46,13 @@ long sys_fork(void) options.close = __dserver_close_socket; guard_table_add(__dserver_per_thread_socket(), guard_flag_prevent_close | guard_flag_close_on_fork, &options); + // only guard the lifetime pipe if it's used. + if (newReadFd != -1) + { + options.close = __dserver_close_process_lifetime_pipe; + guard_table_add(__dserver_get_process_lifetime_pipe(), guard_flag_prevent_close | guard_flag_close_on_fork, &options); + } + int dummy_stack_variable; if (dserver_rpc_checkin(true, &dummy_stack_variable, newReadFd) < 0) { // we can't do ANYTHING if darlingserver fails to acknowledge us @@ -55,8 +62,7 @@ long sys_fork(void) if (wdfd >= 0) sys_fchdir(wdfd); - int pipe[2] = { newReadFd, -1 }; - __dserver_close_process_lifetime_pipe(pipe); + __dserver_close_process_lifetime_pipe(newReadFd); } return ret; diff --git a/src/startup/mldr/elfcalls/elfcalls.c b/src/startup/mldr/elfcalls/elfcalls.c index a85c77681..f33341658 100644 --- a/src/startup/mldr/elfcalls/elfcalls.c +++ b/src/startup/mldr/elfcalls/elfcalls.c @@ -65,7 +65,7 @@ static const void* __dserver_socket_address(void) { extern void __mldr_close_rpc_socket(int socket); extern int __mldr_create_process_lifetime_pipe(int* fds); -extern void __mldr_close_process_lifetime_pipe(int* fds); +extern void __mldr_close_process_lifetime_pipe(int fd); extern int __dserver_process_lifetime_pipe_fd; static int __dserver_get_process_lifetime_pipe() { @@ -73,9 +73,7 @@ static int __dserver_get_process_lifetime_pipe() { } static int __dserver_process_lifetime_pipe_refresh() { - // the read end has already been closed. - int pipe[2] = { -1, __dserver_process_lifetime_pipe_fd }; - __mldr_close_process_lifetime_pipe(pipe); + int pipe[2]; if (__mldr_create_process_lifetime_pipe(pipe) == -1) { fprintf(stderr, "Failed to create process lifetime pipe: %d (%s)\n", errno, strerror(errno)); diff --git a/src/startup/mldr/elfcalls/elfcalls.h b/src/startup/mldr/elfcalls/elfcalls.h index 6991c25d7..7275922bc 100644 --- a/src/startup/mldr/elfcalls/elfcalls.h +++ b/src/startup/mldr/elfcalls/elfcalls.h @@ -65,7 +65,7 @@ struct elf_calls // darlingserver process lifetime pipe info int (*dserver_get_process_lifetime_pipe)(void); int (*dserver_process_lifetime_pipe_refresh)(void); - void (*dserver_close_process_lifetime_pipe)(int* fds); + void (*dserver_close_process_lifetime_pipe)(int fd); }; #endif diff --git a/src/startup/mldr/mldr.c b/src/startup/mldr/mldr.c index 74245bd91..5ac619d5d 100644 --- a/src/startup/mldr/mldr.c +++ b/src/startup/mldr/mldr.c @@ -796,12 +796,10 @@ err_out: return -1; } -void __mldr_close_process_lifetime_pipe(int* fds) { - for (int i = 0; i < 2; ++i) { - if (fds[i] != -1) { - close(fds[i]); - socket_bitmap_put(&socket_bitmap, fds[i]); - } +void __mldr_close_process_lifetime_pipe(int fd) { + if (fd != -1) { + close(fd); + socket_bitmap_put(&socket_bitmap, fd); } } @@ -881,8 +879,7 @@ static void setup_space(struct load_results* lr, bool is_64_bit) { } // keep our write end while closing the unused read end. - lifetime_pipe[1] = -1; - __mldr_close_process_lifetime_pipe(lifetime_pipe); + __mldr_close_process_lifetime_pipe(lifetime_pipe[0]); if (!lr->root_path) { static char vchroot_buffer[4096];