Using pserver, commands appear to complete successfully, but the connection hangs at the exit point.
I've been using cvs 1.11.1p1 with xinetd 2.3.3 perfectly until now. The
problem appeared when I upgraded to 1.11.2. I haven't touched the xinetd
config:
service cvspserver
{
socket_type = stream
protocol = tcp
wait = no
user = cvsuser
server = /usr/local/bin/cvs
server_args = -f --allow-root=/home/cvsroot pserver
disable = no
}
I upgraded to xinetd 2.3.4 but that didn't solve the problem. Other
xinetd services are working fine.
Someone suggested I strace the cvs process and use lsof to see what it
is accessing.
The strace output is attached. The blank line near the bottom shows
where it is hanging. When I pressed ^C on the client side, it resumed.
Here is the lsof output at the problem point. It appears to be locking
on a read from the socket.
$ sudo /tmp/lsof | grep -i cvs
xinetd 2199 root 9u IPv4 1198383 TCP
*:cvspserver (LISTEN)
strace 2399 cvsuser cwd DIR 3,5 4096 2 /
strace 2399 cvsuser rtd DIR 3,5 4096 2 /
strace 2399 cvsuser txt REG 3,5 175463 98275
/usr/local/bin/strace
strace 2399 cvsuser mem REG 3,5 424492 290313
/lib/ld-2.2.4.so
strace 2399 cvsuser mem REG 3,5 5006920 290312
/lib/libc-2.2.4.so
strace 2399 cvsuser 0u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
strace 2399 cvsuser 1u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
strace 2399 cvsuser 2u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
strace 2399 cvsuser 3r FIFO 0,6 1198377 pipe
strace 2399 cvsuser 4w FIFO 0,6 1198377 pipe
strace 2399 cvsuser 5w REG 3,5 10474 241943
/tmp/strace.out
cvs 2400 cvsuser cwd DIR 3,5 4096 98553
/tmp/cvs-serv2400
cvs 2400 cvsuser rtd DIR 3,5 4096 2 /
cvs 2400 cvsuser txt REG 3,5 1571028 98342
/usr/local/bin/cvs
cvs 2400 cvsuser mem REG 3,5 424492 290313
/lib/ld-2.2.4.so
cvs 2400 cvsuser mem REG 3,5 73338 290319
/lib/libcrypt-2.2.4.so
cvs 2400 cvsuser mem REG 3,5 5006920 290312
/lib/libc-2.2.4.so
cvs 2400 cvsuser mem REG 3,5 233130 290324
/lib/libnss_files-2.2.4.so
cvs 2400 cvsuser 0u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
cvs 2400 cvsuser 1u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
cvs 2400 cvsuser 2u IPv4 1200226 TCP
bouncer:cvspserver->gecko:32777 (ESTABLISHED)
cvs 2400 cvsuser 3r FIFO 0,6 1198377 pipe
cvs 2400 cvsuser 4w FIFO 0,6 1198377 pipe
This is what it looks like from the client side:
$ cvs version
Client: Concurrent Versions System (CVS) 1.11.1p1 (client/server)
Server: Concurrent Versions System (CVS) 1.11.2 (client/server)
(hangs here)
^C
cvs [version aborted]: received interrupt signal
$
The problem exists regardless of the cvs command I use. These examples
where for "cvs version". cvs works perfectly if run locally on the
server, so it seems to be a xinetd/pserver problem.
Zach.
execve("/usr/local/bin/cvs", ["/usr/local/bin/cvs", "-f",
"--allow-root=/home/cvsroot", "pserver"], [/* 19 vars */]) = 0
brk(0) = 0x80d7f54
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0644, st_size=10653, ...}) = 0
old_mmap(NULL, 10653, PROT_READ, MAP_PRIVATE, 5, 0) = 0x40016000
close(5) = 0
open("/lib/libcrypt.so.1", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\20"..., 1024) = 1024
fstat64(5, {st_mode=S_IFREG|0755, st_size=73338, ...}) = 0
old_mmap(NULL, 183932, PROT_READ|PROT_EXEC, MAP_PRIVATE, 5, 0) = 0x40019000
mprotect(0x4001e000, 163452, PROT_NONE) = 0
old_mmap(0x4001e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 5, 0x4000) =
0x4001e000
old_mmap(0x4001f000, 159356, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4001f000
close(5) = 0
open("/lib/libc.so.6", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\310\331"..., 1024) = 1024
fstat64(5, {st_mode=S_IFREG|0755, st_size=5006920, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40046000
old_mmap(NULL, 1202372, PROT_READ|PROT_EXEC, MAP_PRIVATE, 5, 0) = 0x40047000
mprotect(0x40162000, 43204, PROT_NONE) = 0
old_mmap(0x40162000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 5, 0x11a000)
= 0x40162000
old_mmap(0x40169000, 14532, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS,
-1, 0) = 0x40169000
close(5) = 0
munmap(0x40016000, 10653) = 0
brk(0) = 0x80d7f54
brk(0x80d7f7c) = 0x80d7f7c
brk(0x80d8000) = 0x80d8000
brk(0x80d9000) = 0x80d9000
open("/etc/localtime", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0644, st_size=870, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40016000
read(5, "TZif\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\5\0"..., 4096) = 870
close(5) = 0
munmap(0x40016000, 4096) = 0
setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
fstat64(0, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40016000
read(0, "BEGIN AUTH REQUEST\n/home/cvsroot"..., 4096) = 63
open("/home/cvsroot/CVSROOT/config", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0664, st_size=527, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
read(5, "# Set this to \"no\" if pserver sh"..., 4096) = 527
read(5, "", 4096) = 0
close(5) = 0
munmap(0x40017000, 4096) = 0
open("/home/cvsroot/CVSROOT/passwd", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0664, st_size=41, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
read(5, "zach:RA18mrdm2obtI:cvsuser\nanon:"..., 4096) = 41
close(5) = 0
munmap(0x40017000, 4096) = 0
socket(PF_UNIX, SOCK_STREAM, 0) = 5
connect(5, {sin_family=AF_UNIX, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No
such file or directory)
close(5) = 0
open("/etc/nsswitch.conf", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0644, st_size=238, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
read(5, "# Begin /etc/nsswitch.conf\n\npass"..., 4096) = 238
read(5, "", 4096) = 0
close(5) = 0
munmap(0x40017000, 4096) = 0
open("/etc/ld.so.cache", O_RDONLY) = 5
fstat64(5, {st_mode=S_IFREG|0644, st_size=10653, ...}) = 0
old_mmap(NULL, 10653, PROT_READ, MAP_PRIVATE, 5, 0) = 0x4016d000
close(5) = 0
open("/lib/libnss_files.so.2", O_RDONLY) = 5
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\"\0"..., 1024) = 1024
fstat64(5, {st_mode=S_IFREG|0755, st_size=233130, ...}) = 0
old_mmap(NULL, 38244, PROT_READ|PROT_EXEC, MAP_PRIVATE, 5, 0) = 0x40170000
mprotect(0x40179000, 1380, PROT_NONE) = 0
old_mmap(0x40179000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 5, 0x8000) =
0x40179000
close(5) = 0
munmap(0x4016d000, 10653) = 0
brk(0x80da000) = 0x80da000
open("/etc/passwd", O_RDONLY) = 5
fcntl64(5, F_GETFD) = 0
fcntl64(5, F_SETFD, FD_CLOEXEC) = 0
fstat64(5, {st_mode=S_IFREG|0644, st_size=342, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
read(5, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 342
close(5) = 0
munmap(0x40017000, 4096) = 0
open("/etc/group", O_RDONLY) = 5
fcntl64(5, F_GETFD) = 0
fcntl64(5, F_SETFD, FD_CLOEXEC) = 0
fstat64(5, {st_mode=S_IFREG|0644, st_size=249, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
_llseek(5, 0, [0], SEEK_CUR) = 0
read(5, "root:x:0:\nbin:x:1:\nsys:x:2:\nkmem"..., 4096) = 249
read(5, "", 4096) = 0
close(5) = 0
munmap(0x40017000, 4096) = 0
setgroups32(0x1, 0x80d8f90) = -1 EPERM (Operation not permitted)
setgid32(0x3ef) = 0
setuid32(0x3ee) = 0
umask(0) = 022
fstat64(1, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0x40017000
write(1, "I LOVE YOU\n", 11) = 11
brk(0x80dd000) = 0x80dd000
rt_sigprocmask(SIG_BLOCK, [ABRT], [], 8) = 0
rt_sigaction(SIGABRT, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [HUP], [], 8) = 0
rt_sigaction(SIGHUP, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
rt_sigaction(SIGINT, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [QUIT], [], 8) = 0
rt_sigaction(SIGQUIT, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [PIPE], [], 8) = 0
rt_sigaction(SIGPIPE, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0
rt_sigaction(SIGTERM, {0x80aa6fc, [], 0x4000000}, {SIG_DFL}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
uname({sys="Linux", node="bouncer", ...}) = 0
getpid() = 2219
mkdir("/tmp", 0777) = -1 EEXIST (File exists)
mkdir("/tmp/cvs-serv2219", 0777) = 0
chmod("/tmp/cvs-serv2219", 0700) = 0
chdir("/tmp/cvs-serv2219") = 0
rt_sigprocmask(SIG_BLOCK, [ABRT], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [HUP], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [QUIT], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [PIPE], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
brk(0x80ef000) = 0x80ef000
read(0, "Root /home/cvsroot\nValid-respons"..., 4096) = 376
access("/home/cvsroot/CVSROOT", R_OK|X_OK) = 0
write(1, "Valid-requests Root Valid-respon"..., 544) = 544
read(0, "UseUnchanged\n", 4096) = 13
read(0, "Gzip-stream 3\nx^*K-*\316\314\317\343\2\0\0\0\377\377", 4096) = 30
brk(0x8100000) = 0x8100000
brk(0x8111000) = 0x8111000
brk(0x8122000) = 0x8122000
brk(0x8133000) = 0x8133000
brk(0x813c000) = 0x813c000
pipe([5, 6]) = 0
pipe([7, 8]) = 0
pipe([9, 10]) = 0
pipe([11, 12]) = 0
fcntl64(11, F_GETFL) = 0 (flags O_RDONLY)
fcntl64(11, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl64(12, F_GETFL) = 0x1 (flags O_WRONLY)
fcntl64(12, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
open("/dev/null", O_RDONLY) = 13
write(1, "x^\2\0\0\0\377\377", 8) = 8
fork() = 2220
--- SIGCHLD (Child exited) ---
fcntl64(1, F_GETFL) = 0x2 (flags O_RDWR)
fcntl64(1, F_SETFL, O_RDWR|O_NONBLOCK) = 0
fcntl64(5, F_GETFL) = 0 (flags O_RDONLY)
fcntl64(5, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl64(7, F_GETFL) = 0 (flags O_RDONLY)
fcntl64(7, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
fcntl64(9, F_GETFL) = 0 (flags O_RDONLY)
fcntl64(9, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
close(6) = 0
close(8) = 0
close(10) = 0
close(11) = 0
close(13) = 0
select(10, [5 7 9], [], NULL, NULL) = 3 (in [5 7 9])
read(9, "", 4096) = 0
close(9) = 0
read(5, "Concurrent Versions System (CVS)"..., 4096) = 56
read(7, "", 4096) = 0
close(7) = 0
select(10, [5], [], NULL, NULL) = 1 (in [5])
read(5, "", 4096) = 0
close(5) = 0
close(12) = 0
wait4(2220, [WIFEXITED(s) && WEXITSTATUS(s) == 0], 0, NULL) = 2220
fcntl64(1, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl64(1, F_SETFL, O_RDWR) = 0
write(1, "\362Up\316\317K.-*J\315+Q\10K-*\316\314\317+V\10\256,."..., 63) = 63
write(1, "\312\317\346\2\0\0\0\377\377", 9) = 9
read(0, "\3\0\17=\3\21", 4096) = 6
fstat64(0, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
read(0,
"", 4096) = 0
shutdown(0, 0 /* receive */) = 0
close(0) = 0
munmap(0x40016000, 4096) = 0
chdir("/tmp") = 0
stat64("/tmp/cvs-serv2219", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
rmdir("/tmp/cvs-serv2219") = 0
brk(0x810e000) = 0x810e000
brk(0x80ee000) = 0x80ee000
write(1, "\3\0\204\271\23\361", 6) = 6
munmap(0x40017000, 4096) = 0
_exit(0) = ?
signature.asc
Description: This is a digitally signed message part
