Package: rsh-redone-server Version: 81-2 Severity: normal Tags: patch
rsh -n localhost 'sleep 100 < /dev/null > /dev/null 2>&1 &' should return immediately, not after 100s. With rshd from rshd-redone-server, it doesn't. This is because rshd forgets to close the fd that has been used to setup the second connection for stderr after it has been dup'ed to 2. $ rsh -n localhost 'sleep 100 < /dev/null > /dev/null 2>&1 &' & [2] 18405 $ lsof -c sleep COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sleep 18407 chazelas cwd DIR 8,3 36864 16613378 /home/chazelas sleep 18407 chazelas rtd DIR 8,3 4096 2 / sleep 18407 chazelas txt REG 8,3 23504 7848172 /bin/sleep sleep 18407 chazelas mem REG 8,3 4071824 15286302 /usr/lib/locale/locale-archive sleep 18407 chazelas mem REG 8,3 1360292 11194941 /lib/i686/cmov/libc-2.7.so sleep 18407 chazelas mem REG 8,3 109152 24053305 /lib/ld-2.7.so sleep 18407 chazelas 0r CHR 1,3 91 /dev/null sleep 18407 chazelas 1w CHR 1,3 91 /dev/null sleep 18407 chazelas 2w CHR 1,3 91 /dev/null sleep 18407 chazelas 3u IPv4 114413 TCP localhost:1021->localhost:1022 (ESTABLISHED) patch: --- rshd.c~ 2008-05-06 20:49:46.000000000 +0100 +++ rshd.c 2008-05-06 20:38:06.000000000 +0100 @@ -224,6 +224,8 @@ int main(int argc, char **argv) { syslog(LOG_ERR, "dup2() failed: %m"); return 1; } + if(esock != 2) + close(esock); } /* Read usernames and terminal info */ -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Kernel: Linux 2.6.25-rc8 (PREEMPT) Locale: LANG=en_GB.ISO-8859-15, LC_CTYPE=en_US.ISO-8859-15 (charmap=ISO-8859-15) Shell: /bin/sh linked to /bin/bash Versions of packages rsh-redone-server depends on: ii libc6 2.7-10 GNU C Library: Shared libraries ii libpam0g 0.99.7.1-6 Pluggable Authentication Modules l ii xinetd [inet-superserver] 1:2.3.14-7 replacement for inetd with many en rsh-redone-server recommends no packages. -- no debconf information
--- rshd.c~ 2008-05-06 20:49:46.000000000 +0100 +++ rshd.c 2008-05-06 20:38:06.000000000 +0100 @@ -224,6 +224,8 @@ int main(int argc, char **argv) { syslog(LOG_ERR, "dup2() failed: %m"); return 1; } + if(esock != 2) + close(esock); } /* Read usernames and terminal info */