From 9db0797b22cbcf5687307329c6874d40ba5a6645 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 1 Dec 2015 00:59:26 +0000 Subject: [PATCH] tests: add lseek.test and llseek.test * tests/llseek.c: New file. * tests/lseek.c: Likewise. * tests/llseek.test: New test. * tests/lseek.test: Likewise. * tests/Makefile.am (check_PROGRAMS): Add llseek and lseek. (TESTS): Add llseek.test and lseek.test. * tests/.gitignore: Add llseek and lseek. --- tests/.gitignore | 2 ++ tests/Makefile.am | 4 +++ tests/llseek.c | 67 ++++++++++++++++++++++++++++++++++++++++++++ tests/llseek.test | 13 +++++++++ tests/lseek.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++ tests/lseek.test | 13 +++++++++ 6 files changed, 170 insertions(+) create mode 100644 tests/llseek.c create mode 100755 tests/llseek.test create mode 100644 tests/lseek.c create mode 100755 tests/lseek.test diff --git a/tests/.gitignore b/tests/.gitignore index eb2aeeb9..943c675d 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -24,6 +24,8 @@ ipc_msg ipc_msgbuf ipc_sem ipc_shm +llseek +lseek membarrier memfd_create mlock2 diff --git a/tests/Makefile.am b/tests/Makefile.am index 2ad8d400..fac6f5a0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -37,6 +37,8 @@ check_PROGRAMS = \ ipc_msgbuf \ ipc_sem \ ipc_shm \ + llseek \ + lseek \ membarrier \ memfd_create \ mlock2 \ @@ -144,6 +146,8 @@ TESTS = \ ipc_msgbuf.test \ ipc_shm.test \ ipc_sem.test \ + llseek.test \ + lseek.test \ mq.test \ pselect6.test \ readdir.test \ diff --git a/tests/llseek.c b/tests/llseek.c new file mode 100644 index 00000000..77dc4713 --- /dev/null +++ b/tests/llseek.c @@ -0,0 +1,67 @@ +/* + * 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 + +#include + +#ifdef __NR__llseek + +#include +#include +#include + +int +main(void) +{ + const unsigned long high = 0xdefaced; + const unsigned long low = 0xdeadbeef; + const unsigned long long offset = 0xdefaceddeadbeef; + unsigned long long result; + int rc = syscall(__NR__llseek, -1, high, low, &result, SEEK_SET); + + if (rc != -1 || EBADF != errno) + return 77; + + printf("_llseek(-1, %Lu, %p, SEEK_SET) = -1 EBADF (Bad file descriptor)\n", + offset, &result); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +int +main(void) +{ + return 77; +} + +#endif diff --git a/tests/llseek.test b/tests/llseek.test new file mode 100755 index 00000000..bb759510 --- /dev/null +++ b/tests/llseek.test @@ -0,0 +1,13 @@ +#!/bin/sh + +# Check _llseek syscall decoding. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -e_llseek $args > "$OUT" +match_diff "$LOG" "$OUT" +rm -f "$OUT" + +exit 0 diff --git a/tests/lseek.c b/tests/lseek.c new file mode 100644 index 00000000..5517e625 --- /dev/null +++ b/tests/lseek.c @@ -0,0 +1,71 @@ +/* + * 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 + +#include + +#ifdef __NR_lseek + +#include +#include +#include + +#include "kernel_types.h" + +int +main(void) +{ + const kernel_ulong_t offset = (kernel_ulong_t) 0xdefaced0badc0deULL; + int rc; + + if (sizeof(offset) > sizeof(long)) + rc = lseek(-1, offset, SEEK_SET); + else + rc = syscall(__NR_lseek, -1L, offset, SEEK_SET); + + if (rc != -1 || EBADF != errno) + return 77; + + printf("lseek(-1, %Lu, SEEK_SET) = -1 EBADF (Bad file descriptor)\n", + (unsigned long long) offset); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +int +main(void) +{ + return 77; +} + +#endif diff --git a/tests/lseek.test b/tests/lseek.test new file mode 100755 index 00000000..2d5b38dd --- /dev/null +++ b/tests/lseek.test @@ -0,0 +1,13 @@ +#!/bin/sh + +# Check lseek syscall decoding. + +. "${srcdir=.}/init.sh" + +run_prog > /dev/null +OUT="$LOG.out" +run_strace -a30 -elseek $args > "$OUT" +match_diff "$LOG" "$OUT" +rm -f "$OUT" + +exit 0 -- 2.40.0