--- Begin Message ---
Package: kbd
Version: 1.06-2
I ran this command as root:
strace -f -o /tmp/root/private/strace \
/usr/bin/openvt -f -c 30 -w -- tty </dev/tty0
The strace is below.
This bug is for the fact that openvt fails to notice that its dups are
failing, and blithely blunders on. All system call return values must
be checked; this will probably require a complete code review, not
just a keyhole approach to the particular instance of the bug shown
below.
Ian.
31443 execve("/usr/bin/openvt", ["/usr/bin/openvt", "-f", "-c", "30", "-w",
"--", "tty"], [/* 41 vars */]) = 0
31443 uname({sys="Linux", node="chiark", ...}) = 0
31443 brk(0) = 0x804ad8c
31443 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
31443 open("/etc/ld.so.cache", O_RDONLY) = 3
31443 fstat64(3, 0xbfffed54) = -1 ENOSYS (Function not implemented)
31443 fstat(3, {st_mode=S_IFREG|0644, st_size=34214, ...}) = 0
31443 old_mmap(NULL, 34214, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40014000
31443 close(3) = 0
31443 open("/lib/libc.so.6", O_RDONLY) = 3
31443 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\30\222"...,
1024) = 1024
31443 fstat(3, {st_mode=S_IFREG|0755, st_size=1153784, ...}) = 0
31443 old_mmap(NULL, 1166560, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) =
0x4001d000
31443 mprotect(0x40130000, 40160, PROT_NONE) = 0
31443 old_mmap(0x40130000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED,
3, 0x113000) = 0x40130000
31443 old_mmap(0x40136000, 15584, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40136000
31443 close(3) = 0
31443 munmap(0x40014000, 34214) = 0
31443 getuid32() = -1 ENOSYS (Function not implemented)
31443 getuid() = 0
31443 setuid(0) = 0
31443 open("/dev/tty", O_RDONLY) = 3
31443 ioctl(3, 0x4b33, 0xbffff8eb) = -1 EINVAL (Invalid argument)
31443 open("/dev/console", O_RDONLY) = 4
31443 ioctl(4, 0x4b33, 0xbffff8eb) = -1 EINVAL (Invalid argument)
31443 ioctl(0, 0x4b33, 0xbffff91b) = 0
31443 ioctl(0, 0x5603, 0xbffff9a4) = 0
31443 open("/dev/tty30", O_RDWR) = 5
31443 close(5) = 0
31443 access("/dev/tty30", R_OK|W_OK) = 0
31443 geteuid() = 0
31443 getuid() = 0
31443 getgid() = 100
31443 chown("/dev/tty30", 0, 100) = 0
31443 setuid(0) = 0
31443 brk(0) = 0x804ad8c
31443 brk(0x804adac) = 0x804adac
31443 brk(0x804b000) = 0x804b000
31443 fork() = 31444
31443 wait4(-1, <unfinished ...>
31444 setsid() = 31444
31444 close(0) = 0
31444 open("/dev/tty30", O_RDWR) = 0
31444 close(1) = 0
31444 close(2) = 0
31444 close(0) = 0
31444 dup(0) = -1 EBADF (Bad file descriptor)
31444 dup(0) = -1 EBADF (Bad file descriptor)
31444 execve("/u/ian/bin/linux/tty", ["tty"], [/* 41 vars */]) = -1 ENOENT (No
such file or directory)
31444 execve("/u/ian/bin/scripts/tty", ["tty"], [/* 41 vars */]) = -1 ENOENT
(No such file or directory)
31444 execve("/usr/local/bin/testing/tty", ["tty"], [/* 41 vars */]) = -1
ENOENT (No such file or directory)
31444 execve("/usr/local/bin/tty", ["tty"], [/* 41 vars */]) = -1 ENOENT (No
such file or directory)
31444 execve("/bin/tty", ["tty"], [/* 41 vars */]) = -1 ENOENT (No such file or
directory)
31444 execve("/usr/bin/tty", ["tty"], [/* 41 vars */]) = 0
31444 uname({sys="Linux", node="chiark", ...}) = 0
31444 brk(0) = 0x804b2a4
31444 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or
directory)
31444 open("/etc/ld.so.cache", O_RDONLY) = 0
31444 fstat64(0, 0xbfffed84) = -1 ENOSYS (Function not implemented)
31444 fstat(0, {st_mode=S_IFREG|0644, st_size=34214, ...}) = 0
31444 old_mmap(NULL, 34214, PROT_READ, MAP_PRIVATE, 0, 0) = 0x40014000
31444 close(0) = 0
31444 open("/lib/libc.so.6", O_RDONLY) = 0
31444 read(0, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\30\222"...,
1024) = 1024
31444 fstat(0, {st_mode=S_IFREG|0755, st_size=1153784, ...}) = 0
31444 old_mmap(NULL, 1166560, PROT_READ|PROT_EXEC, MAP_PRIVATE, 0, 0) =
0x4001d000
31444 mprotect(0x40130000, 40160, PROT_NONE) = 0
31444 old_mmap(0x40130000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED,
0, 0x113000) = 0x40130000
31444 old_mmap(0x40136000, 15584, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40136000
31444 close(0) = 0
31444 munmap(0x40014000, 34214) = 0
31444 brk(0) = 0x804b2a4
31444 brk(0x804b2cc) = 0x804b2cc
31444 brk(0x804c000) = 0x804c000
31444 ioctl(0, SNDCTL_TMR_TIMEBASE, 0xbffff7d8) = -1 EBADF (Bad file descriptor)
31444 fstat64(1, 0xbffff84c) = -1 ENOSYS (Function not implemented)
31444 fstat(1, 0xbffff7ac) = -1 EBADF (Bad file descriptor)
31444 old_mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0x40014000
31444 ioctl(0, SNDCTL_TMR_TIMEBASE, 0xbffff91c) = -1 EBADF (Bad file descriptor)
31444 write(1, "not a tty\n", 10) = -1 EBADF (Bad file descriptor)
31444 close(1) = -1 EBADF (Bad file descriptor)
31444 munmap(0x40014000, 8192) = 0
31444 write(2, "tty: ", 5) = -1 EBADF (Bad file descriptor)
31444 write(2, "write error", 11) = -1 EBADF (Bad file descriptor)
31444 write(2, ": Bad file descriptor", 21) = -1 EBADF (Bad file descriptor)
31444 write(2, "\n", 1) = -1 EBADF (Bad file descriptor)
31444 _exit(3) = ?
31443 <... wait4 resumed> NULL, 0, NULL) = 31444
31443 --- SIGCHLD (Child exited) ---
31443 _exit(0) = ?
--- End Message ---