diff options
author | Hans de Goede <hdegoede@redhat.com> | 2017-01-09 16:03:30 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2017-01-10 15:15:13 +0100 |
commit | 712cf8673d6e57442f41636e44020f5e1839c7f8 (patch) | |
tree | fea237684245bde82440d1578f3e7da7d6efd94e /unix | |
parent | 4ece7c5d810228f4d66ec123b5c7486c39f5fd86 (diff) | |
download | tigervnc-712cf8673d6e57442f41636e44020f5e1839c7f8.tar.gz tigervnc-712cf8673d6e57442f41636e44020f5e1839c7f8.zip |
Fix -inetd not working with xserver >= 1.19
xserver 1.19's OsInit will create a pollfd, followed by checking if fd 2 /
stderr is writable and if it is not, replacing fd 2 with /dev/null.
Since we close stderr in inetd mode to avoid xserver messages being send
to the client as vnc data, the pollfd becomes fd 2, only to be replaced
by /dev/null since a pollfd is not writable.
This commit fixes this by opening /dev/null directly after the close(2),
avoiding that the pollfd becomes fd 2.
Alan Coopersmith: Change to use dup2() for atomic switch of fd
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'unix')
-rw-r--r-- | unix/xserver/hw/vnc/xvnc.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/unix/xserver/hw/vnc/xvnc.c b/unix/xserver/hw/vnc/xvnc.c index c5b684de..ef30d69a 100644 --- a/unix/xserver/hw/vnc/xvnc.c +++ b/unix/xserver/hw/vnc/xvnc.c @@ -572,9 +572,17 @@ ddxProcessArgument(int argc, char *argv[], int i) if (strcmp(argv[i], "-inetd") == 0) { + int nullfd; + dup2(0,3); vncInetdSock = 3; - close(2); + + /* Avoid xserver >= 1.19's epoll-fd becoming fd 2 / stderr only to be + replaced by /dev/null by OsInit() because the pollfd is not + writable, breaking ospoll_wait(). */ + nullfd = open("/dev/null", O_WRONLY); + dup2(nullfd, 2); + close(nullfd); if (!displaySpecified) { int port = vncGetSocketPort(vncInetdSock); |