From 39e3be6d747510a933e7abca8f900a9be2df682c Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Fri, 18 Sep 2015 21:54:52 +0000 Subject: [PATCH] tests: add one more case to select.test * tests/select.c (main): Check how timeout is printed on exiting syscall. --- tests/select.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/tests/select.c b/tests/select.c index db87704e..0f8f6cb8 100644 --- a/tests/select.c +++ b/tests/select.c @@ -1,3 +1,30 @@ +/* + * 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 */ @@ -24,10 +51,10 @@ int main(void) struct { struct timeval tv; int pad[2]; - } tm = { - .tv = { .tv_usec = 123 }, + } tm_in = { + .tv = { .tv_sec = 0xc0de1, .tv_usec = 0xc0de2 }, .pad = { 0xdeadbeef, 0xbadc0ded } - }; + }, tm = tm_in; if (pipe(fds)) return 77; @@ -44,6 +71,22 @@ int main(void) 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. @@ -60,6 +103,8 @@ int main(void) */ 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", -- 2.40.0