From: Dmitry V. Levin Date: Tue, 8 Dec 2015 17:38:12 +0000 (+0000) Subject: Fix select and _newselect syscall entries X-Git-Tag: v4.11~36 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=69b7307225874edc9902ad2409bc435158112ffb;p=strace Fix select and _newselect syscall entries Change syscall names to match kernel __NR_* constants. This reverts commit ddcf54969d253582ab2cfdcab8ede9cdae3fb171. * linux/arm/syscallent.h [82]: Rename "oldselect" to "select". [142]: Rename "select" to "_newselect". * linux/bfin/syscallent.h: Likewise. * linux/i386/syscallent.h: Likewise. * linux/m68k/syscallent.h: Likewise. * linux/microblaze/syscallent.h: Likewise. * linux/powerpc/syscallent.h [82]: Likewise. * linux/powerpc64/syscallent.h: Likewise. * linux/sh/syscallent.h: Likewise. * linux/sh64/syscallent.h: Likewise. * linux/hppa/syscallent.h [142]: Rename "select" to "_newselect". * linux/mips/syscallent-n32.h [6022]: Rename "select" to "_newselect". * linux/mips/syscallent-n64.h [5022]: Likewise. * linux/mips/syscallent-o32.h [4142]: Likewise. * linux/s390/syscallent.h [142]: Rename "select" to "_newselect". * linux/sparc/syscallent.h [230]: Rename "select" to "_newselect". * tests/oldselect.test: Rename oldselect to select. Convert from match_grep to match_diff. * tests/oldselect.expected: Likewise. * xselect.c: New file, based on select.c. * tests/_newselect.c: New file. * tests/select.c: Replace with a wrapper around xselect.c. * tests/select.test: Parametrize. * tests/_newselect.test: New test. * tests/Makefile.am (check_PROGRAMS): Add _newselect. (TESTS): Add _newselect.test. (EXTRA_DIST): Add xselect.c. * tests/.gitignore: Add _newselect. --- diff --git a/linux/arm/syscallent.h b/linux/arm/syscallent.h index 70a3a6a2..5538dfed 100644 --- a/linux/arm/syscallent.h +++ b/linux/arm/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/bfin/syscallent.h b/linux/bfin/syscallent.h index 6ce6c524..31bfbd9e 100644 --- a/linux/bfin/syscallent.h +++ b/linux/bfin/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/hppa/syscallent.h b/linux/hppa/syscallent.h index 02072019..1a4fa749 100644 --- a/linux/hppa/syscallent.h +++ b/linux/hppa/syscallent.h @@ -144,7 +144,7 @@ [139] = { 1, NF, SEN(setfsgid), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/i386/syscallent.h b/linux/i386/syscallent.h index 9886c4b8..4a7f52f3 100644 --- a/linux/i386/syscallent.h +++ b/linux/i386/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/m68k/syscallent.h b/linux/m68k/syscallent.h index 89616d16..ef675acd 100644 --- a/linux/m68k/syscallent.h +++ b/linux/m68k/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/microblaze/syscallent.h b/linux/microblaze/syscallent.h index 627c9048..c7cf2478 100644 --- a/linux/microblaze/syscallent.h +++ b/linux/microblaze/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/mips/syscallent-n32.h b/linux/mips/syscallent-n32.h index 2f90604a..346fec8b 100644 --- a/linux/mips/syscallent-n32.h +++ b/linux/mips/syscallent-n32.h @@ -22,7 +22,7 @@ [6019] = { 3, TD, SEN(writev), "writev" }, [6020] = { 2, TF, SEN(access), "access" }, [6021] = { 1, TD, SEN(pipe), "pipe" }, -[6022] = { 5, TD, SEN(select), "select" }, +[6022] = { 5, TD, SEN(select), "_newselect" }, [6023] = { 0, 0, SEN(sched_yield), "sched_yield" }, [6024] = { 5, TM|SI, SEN(mremap), "mremap" }, [6025] = { 3, TM, SEN(msync), "msync" }, diff --git a/linux/mips/syscallent-n64.h b/linux/mips/syscallent-n64.h index 2e387fb2..0fc5aa11 100644 --- a/linux/mips/syscallent-n64.h +++ b/linux/mips/syscallent-n64.h @@ -22,7 +22,7 @@ [5019] = { 3, TD, SEN(writev), "writev" }, [5020] = { 2, TF, SEN(access), "access" }, [5021] = { 1, TD, SEN(pipe), "pipe" }, -[5022] = { 5, TD, SEN(select), "select" }, +[5022] = { 5, TD, SEN(select), "_newselect" }, [5023] = { 0, 0, SEN(sched_yield), "sched_yield" }, [5024] = { 5, TM|SI, SEN(mremap), "mremap" }, [5025] = { 3, TM, SEN(msync), "msync" }, diff --git a/linux/mips/syscallent-o32.h b/linux/mips/syscallent-o32.h index 9671e49b..8347b9c8 100644 --- a/linux/mips/syscallent-o32.h +++ b/linux/mips/syscallent-o32.h @@ -142,7 +142,7 @@ [4139] = { 1, NF, SEN(setfsgid), "setfsgid" }, [4140] = { 5, TD, SEN(llseek), "_llseek" }, [4141] = { 3, TD, SEN(getdents), "getdents" }, -[4142] = { 5, TD, SEN(select), "select" }, +[4142] = { 5, TD, SEN(select), "_newselect" }, [4143] = { 2, TD, SEN(flock), "flock" }, [4144] = { 3, TM, SEN(msync), "msync" }, [4145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h index f59a1a1b..c88ba8e2 100644 --- a/linux/powerpc/syscallent.h +++ b/linux/powerpc/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/powerpc64/syscallent.h b/linux/powerpc64/syscallent.h index 6db3d30b..9c0219c9 100644 --- a/linux/powerpc64/syscallent.h +++ b/linux/powerpc64/syscallent.h @@ -108,7 +108,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/s390/syscallent.h b/linux/s390/syscallent.h index 8ce3537a..ad2827a9 100644 --- a/linux/s390/syscallent.h +++ b/linux/s390/syscallent.h @@ -170,7 +170,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/sh/syscallent.h b/linux/sh/syscallent.h index 26da8016..0a63d58b 100644 --- a/linux/sh/syscallent.h +++ b/linux/sh/syscallent.h @@ -110,7 +110,7 @@ [ 79] = { 2, 0, SEN(settimeofday), "settimeofday" }, [ 80] = { 2, 0, SEN(getgroups16), "getgroups" }, [ 81] = { 2, 0, SEN(setgroups16), "setgroups" }, -[ 82] = { 1, TD, SEN(oldselect), "oldselect" }, +[ 82] = { 1, TD, SEN(oldselect), "select" }, [ 83] = { 2, TF, SEN(symlink), "symlink" }, [ 84] = { 2, TF, SEN(oldlstat), "oldlstat" }, [ 85] = { 3, TF, SEN(readlink), "readlink" }, @@ -170,7 +170,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/sh64/syscallent.h b/linux/sh64/syscallent.h index 53f9f171..e2ec231d 100644 --- a/linux/sh64/syscallent.h +++ b/linux/sh64/syscallent.h @@ -168,7 +168,7 @@ [139] = { 1, NF, SEN(setfsgid16), "setfsgid" }, [140] = { 5, TD, SEN(llseek), "_llseek" }, [141] = { 3, TD, SEN(getdents), "getdents" }, -[142] = { 5, TD, SEN(select), "select" }, +[142] = { 5, TD, SEN(select), "_newselect" }, [143] = { 2, TD, SEN(flock), "flock" }, [144] = { 3, TM, SEN(msync), "msync" }, [145] = { 3, TD, SEN(readv), "readv" }, diff --git a/linux/sparc/syscallent.h b/linux/sparc/syscallent.h index 40dadef2..772ba2c1 100644 --- a/linux/sparc/syscallent.h +++ b/linux/sparc/syscallent.h @@ -228,7 +228,7 @@ [227] = { 5, 0, SEN(afs_syscall), "afs_syscall" }, [228] = { 1, NF, SEN(setfsuid16), "setfsuid" }, [229] = { 1, NF, SEN(setfsgid16), "setfsgid" }, -[230] = { 5, TD, SEN(select), "select" }, +[230] = { 5, TD, SEN(select), "_newselect" }, [231] = { 1, 0, SEN(time), "time" }, [232] = { 6, TD, SEN(splice), "splice" }, [233] = { 1, 0, SEN(stime), "stime" }, diff --git a/tests/.gitignore b/tests/.gitignore index 1a6cfbf0..714d82ba 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -5,6 +5,7 @@ *.tmp-* *.tmp.* *.trs +_newselect adjtimex aio bpf diff --git a/tests/Makefile.am b/tests/Makefile.am index 10492f0d..a13dc308 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -14,6 +14,7 @@ AM_CPPFLAGS = $(ARCH_MFLAGS) \ AM_LDFLAGS = $(ARCH_MFLAGS) check_PROGRAMS = \ + _newselect \ adjtimex \ aio \ bpf \ @@ -136,6 +137,7 @@ TESTS = \ strace-f.test \ qual_syscall.test \ \ + _newselect.test \ adjtimex.test \ aio.test \ bexecve.test \ @@ -288,6 +290,7 @@ EXTRA_DIST = init.sh run.sh match.awk \ unix-yy-connect.awk \ wait.expected \ xattr.expected \ + xselect.c \ xstatx.c \ $(TESTS) diff --git a/tests/_newselect.c b/tests/_newselect.c new file mode 100644 index 00000000..3722ccf3 --- /dev/null +++ b/tests/_newselect.c @@ -0,0 +1,12 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#undef TEST_SYSCALL_NAME +#ifdef __NR__newselect +# define TEST_SYSCALL_NAME _newselect +#endif + +#include "xselect.c" diff --git a/tests/_newselect.test b/tests/_newselect.test new file mode 100755 index 00000000..3371d4db --- /dev/null +++ b/tests/_newselect.test @@ -0,0 +1,5 @@ +#!/bin/sh + +# Check _newselect syscall decoding. + +. "${srcdir=.}/select.test" diff --git a/tests/oldselect.expected b/tests/oldselect.expected index 14049ab1..c0426f42 100644 --- a/tests/oldselect.expected +++ b/tests/oldselect.expected @@ -1 +1,2 @@ -oldselect\(2, \[1\], \[0\], NULL, \{0, 42\}\) += 0 \(Timeout\) +select(2, [1], [0], NULL, {0, 42}) = 0 (Timeout) ++++ exited with 0 +++ diff --git a/tests/oldselect.test b/tests/oldselect.test index edd3693e..35661ad4 100755 --- a/tests/oldselect.test +++ b/tests/oldselect.test @@ -1,11 +1,11 @@ #!/bin/sh -# Check oldselect syscall decoding. +# Check old select syscall decoding. . "${srcdir=.}/init.sh" run_prog -run_strace -e oldselect $args -match_grep +run_strace -a34 -eselect $args +match_diff exit 0 diff --git a/tests/select.c b/tests/select.c index 0f8f6cb8..95bc6326 100644 --- a/tests/select.c +++ b/tests/select.c @@ -1,125 +1,12 @@ -/* - * Copyright (c) 2015 Dmitry V. Levin - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif -/* - * Based on test by Dr. David Alan Gilbert - */ -#include -#include -#include #include -#undef NR_select - -#if defined __NR__newselect -# define NR_select __NR__newselect -#elif defined __NR_select -# define NR_select __NR_select +#undef TEST_SYSCALL_NAME +#if defined __NR_select && !defined __NR__newselect +# define TEST_SYSCALL_NAME select #endif -#ifdef NR_select - -static fd_set set[0x1000000 / sizeof(fd_set)]; - -int main(void) -{ - int fds[2]; - struct { - struct timeval tv; - int pad[2]; - } tm_in = { - .tv = { .tv_sec = 0xc0de1, .tv_usec = 0xc0de2 }, - .pad = { 0xdeadbeef, 0xbadc0ded } - }, tm = tm_in; - - if (pipe(fds)) - return 77; - - /* - * Start with a nice simple select. - */ - FD_ZERO(set); - FD_SET(fds[0], set); - FD_SET(fds[1], set); - if (syscall(NR_select, fds[1] + 1, set, set, set, NULL) != 1) - return 77; - printf("select(%d, [%d %d], [%d %d], [%d %d], NULL) = 1 ()\n", - fds[1] + 1, fds[0], fds[1], - fds[0], fds[1], fds[0], fds[1]); - - /* - * Another simple one, with a timeout. - */ - FD_SET(1, set); - FD_SET(2, set); - FD_SET(fds[0], set); - FD_SET(fds[1], set); - if (syscall(NR_select, fds[1] + 1, NULL, set, NULL, &tm.tv) != 3) - return 77; - printf("select(%d, NULL, [1 2 %d %d], NULL, {%Ld, %Ld})" - " = 3 (out [1 2 %d], left {%Ld, %Ld})\n", - fds[1] + 1, fds[0], fds[1], - (long long) tm_in.tv.tv_sec, (long long) tm_in.tv.tv_usec, - fds[1], - (long long) tm.tv.tv_sec, (long long) tm.tv.tv_usec); - - /* - * Now the crash case that trinity found, negative nfds - * but with a pointer to a large chunk of valid memory. - */ - FD_ZERO(set); - FD_SET(fds[1],set); - if (syscall(NR_select, -1, NULL, set, NULL, NULL) != -1) - return 77; - printf("select(-1, NULL, %p, NULL, NULL) " - "= -1 EINVAL (Invalid argument)\n", set); - - /* - * Another variant, with nfds exceeding FD_SETSIZE limit. - */ - FD_ZERO(set); - FD_SET(fds[0],set); - tm.tv.tv_sec = 0; - tm.tv.tv_usec = 123; - if (syscall(NR_select, FD_SETSIZE + 1, set, set + 1, NULL, &tm.tv)) - return 77; - printf("select(%d, [%d], [], NULL, {0, 123}) = 0 (Timeout)\n", - FD_SETSIZE + 1, fds[0]); - - puts("+++ exited with 0 +++"); - return 0; -} - -#else - -int -main(void) -{ - return 77; -} - -#endif +#include "xselect.c" diff --git a/tests/select.test b/tests/select.test index d9c76b28..78c25c72 100755 --- a/tests/select.test +++ b/tests/select.test @@ -5,8 +5,9 @@ . "${srcdir=.}/init.sh" run_prog > /dev/null +syscall=${ME_%.test} OUT="$LOG.out" -run_strace -a36 -eselect $args > "$OUT" +run_strace -a36 -e$syscall $args > "$OUT" match_diff "$LOG" "$OUT" rm -f "$OUT" diff --git a/tests/xselect.c b/tests/xselect.c new file mode 100644 index 00000000..916204e9 --- /dev/null +++ b/tests/xselect.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2015 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Based on test by Dr. David Alan Gilbert + */ + +#ifdef TEST_SYSCALL_NAME + +# include +# include +# include + +# define TEST_SYSCALL_NR nrify(TEST_SYSCALL_NAME) +# define nrify(arg) nrify_(arg) +# define nrify_(arg) __NR_ ## arg + +# define TEST_SYSCALL_STR stringify(TEST_SYSCALL_NAME) +# define stringify(arg) stringify_(arg) +# define stringify_(arg) #arg + +static fd_set set[0x1000000 / sizeof(fd_set)]; + +int main(void) +{ + int fds[2]; + struct { + struct timeval tv; + int pad[2]; + } tm_in = { + .tv = { .tv_sec = 0xc0de1, .tv_usec = 0xc0de2 }, + .pad = { 0xdeadbeef, 0xbadc0ded } + }, tm = tm_in; + + if (pipe(fds)) + return 77; + + /* + * Start with a nice simple select. + */ + FD_ZERO(set); + FD_SET(fds[0], set); + FD_SET(fds[1], set); + if (syscall(TEST_SYSCALL_NR, fds[1] + 1, set, set, set, NULL) != 1) + return 77; + printf("%s(%d, [%d %d], [%d %d], [%d %d], NULL) = 1 ()\n", + TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1], + fds[0], fds[1], fds[0], fds[1]); + + /* + * Another simple one, with a timeout. + */ + FD_SET(1, set); + FD_SET(2, set); + FD_SET(fds[0], set); + FD_SET(fds[1], set); + if (syscall(TEST_SYSCALL_NR, fds[1] + 1, NULL, set, NULL, &tm.tv) != 3) + return 77; + printf("%s(%d, NULL, [1 2 %d %d], NULL, {%Ld, %Ld})" + " = 3 (out [1 2 %d], left {%Ld, %Ld})\n", + TEST_SYSCALL_STR, fds[1] + 1, fds[0], fds[1], + (long long) tm_in.tv.tv_sec, (long long) tm_in.tv.tv_usec, + fds[1], + (long long) tm.tv.tv_sec, (long long) tm.tv.tv_usec); + + /* + * Now the crash case that trinity found, negative nfds + * but with a pointer to a large chunk of valid memory. + */ + FD_ZERO(set); + FD_SET(fds[1],set); + if (syscall(TEST_SYSCALL_NR, -1, NULL, set, NULL, NULL) != -1) + return 77; + printf("%s(-1, NULL, %p, NULL, NULL) = -1 EINVAL (%m)\n", + TEST_SYSCALL_STR, set); + + /* + * Another variant, with nfds exceeding FD_SETSIZE limit. + */ + FD_ZERO(set); + FD_SET(fds[0],set); + tm.tv.tv_sec = 0; + tm.tv.tv_usec = 123; + if (syscall(TEST_SYSCALL_NR, FD_SETSIZE + 1, set, set + 1, NULL, &tm.tv)) + return 77; + printf("%s(%d, [%d], [], NULL, {0, 123}) = 0 (Timeout)\n", + TEST_SYSCALL_STR, FD_SETSIZE + 1, fds[0]); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +int +main(void) +{ + return 77; +} + +#endif