diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2012-08-07 20:15:24 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2012-08-07 20:15:24 +0000 |
commit | f90090613ea760cfa6c769306a1253537568d6cf (patch) | |
tree | ea45fa4d149377d41946aff01950e867f02ad1fe /xserver | |
parent | 52e1fcdc64dac2c49f01fc607b2d96cd1710a515 (diff) |
In non-privilege sepration mode, avoid accidentally sending
a SIGUSR1 signal to init(8).
It can happen that xdm dies before the X server that it started.
In that case X's is reparented by init...
This is handled correctly when privilege separation is not compiled
but got overlooked in the privilege separation case.
Diffstat (limited to 'xserver')
-rw-r--r-- | xserver/os/connection.c | 3 | ||||
-rw-r--r-- | xserver/os/privsep.c | 21 |
2 files changed, 16 insertions, 8 deletions
diff --git a/xserver/os/connection.c b/xserver/os/connection.c index 4b54483d6..f5a94a750 100644 --- a/xserver/os/connection.c +++ b/xserver/os/connection.c @@ -343,6 +343,9 @@ InitParentProcess(void) RunFromSmartParent = TRUE; OsSignal(SIGUSR1, handler); ParentProcess = getppid(); +#ifdef X_PRIVSEP + priv_init_parent_process(ParentProcess); +#endif #endif } diff --git a/xserver/os/privsep.c b/xserver/os/privsep.c index 645c50dd6..2da3078be 100644 --- a/xserver/os/privsep.c +++ b/xserver/os/privsep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: privsep.c,v 1.21 2012/08/07 20:13:18 matthieu Exp $ */ +/* $OpenBSD: privsep.c,v 1.22 2012/08/07 20:15:23 matthieu Exp $ */ /* * Copyright 2001 Niels Provos <provos@citi.umich.edu> * All rights reserved. @@ -239,8 +239,6 @@ priv_init(uid_t uid, gid_t gid) priv_cmd_t cmd; struct okdev *dev; - parent_pid = getppid(); - /* Create sockets */ if (socketpair(AF_LOCAL, SOCK_STREAM, PF_UNSPEC, socks) == -1) { return -1; @@ -290,7 +288,8 @@ priv_init(uid_t uid, gid_t gid) close(fd); break; case PRIV_SIG_PARENT: - kill(parent_pid, SIGUSR1); + if (parent_pid > 1) + kill(parent_pid, SIGUSR1); break; default: errx(1, "%s: unknown command %d", __func__, cmd.cmd); @@ -322,8 +321,14 @@ priv_open_device(const char *path) } } +void +priv_init_parent_process(pid_t ppid) +{ + parent_pid = ppid; +} + /* send signal to parent process */ -int +void priv_signal_parent(void) { priv_cmd_t cmd; @@ -335,9 +340,9 @@ priv_signal_parent(void) } cmd.cmd = PRIV_SIG_PARENT; write(priv_fd, &cmd, sizeof(cmd)); - return 0; - } else - return kill(getppid(), SIGUSR1); + } else + if (parent_pid > 1) + kill(parent_pid, SIGUSR1); } #ifdef TEST |