From: Dmitry V. Levin Date: Mon, 6 Jun 2016 21:26:08 +0000 (+0000) Subject: tests: check decoding of setrlimit, getrlimit, and ugetrlimit syscalls X-Git-Tag: v4.13~169 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e085d0b462c8e502b3831d297ed9ffab79e3d5b;p=strace tests: check decoding of setrlimit, getrlimit, and ugetrlimit syscalls * tests/getrlimit.c: New file. * tests/setrlimit.c: Likewise. * tests/ugetrlimit.c: Likewise. * tests/xgetrlimit.c: Likewise. * tests/getrlimit.test: New test. * tests/setrlimit.test: Likewise. * tests/ugetrlimit.test: Likewise. * tests/.gitignore: Add getrlimit, setrlimit, and ugetrlimit. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add getrlimit.test, setrlimit.test, and ugetrlimit.test. (EXTRA_DIST): Add xgetrlimit.c. --- diff --git a/tests/.gitignore b/tests/.gitignore index e20bb772..455b046c 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -84,6 +84,7 @@ getresgid getresgid32 getresuid getresuid32 +getrlimit getrusage getsid getuid @@ -223,6 +224,7 @@ setresuid setresuid32 setreuid setreuid32 +setrlimit setuid setuid32 shmxt @@ -254,6 +256,7 @@ times times-fail truncate truncate64 +ugetrlimit uio umask umount diff --git a/tests/Makefile.am b/tests/Makefile.am index 529bbe09..dcc93230 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -139,6 +139,7 @@ check_PROGRAMS = \ getresgid32 \ getresuid \ getresuid32 \ + getrlimit \ getrusage \ getsid \ getuid \ @@ -276,6 +277,7 @@ check_PROGRAMS = \ setresuid32 \ setreuid \ setreuid32 \ + setrlimit \ setuid \ setuid32 \ shmxt \ @@ -307,6 +309,7 @@ check_PROGRAMS = \ times-fail \ truncate \ truncate64 \ + ugetrlimit \ uio \ umask \ umount \ @@ -442,6 +445,7 @@ DECODER_TESTS = \ getresgid32.test \ getresuid.test \ getresuid32.test \ + getrlimit.test \ getrusage.test \ getsid.test \ getuid.test \ @@ -572,6 +576,7 @@ DECODER_TESTS = \ setresuid32.test \ setreuid.test \ setreuid32.test \ + setrlimit.test \ setuid.test \ setuid32.test \ shmxt.test \ @@ -602,6 +607,7 @@ DECODER_TESTS = \ times.test \ truncate.test \ truncate64.test \ + ugetrlimit.test \ uio.test \ umask.test \ umount.test \ @@ -707,6 +713,7 @@ EXTRA_DIST = init.sh run.sh match.awk \ umovestr.expected \ wait.expected \ xchownx.c \ + xgetrlimit.c \ xselect.c \ xstatfs.c \ xstatfs64.c \ diff --git a/tests/getrlimit.c b/tests/getrlimit.c new file mode 100644 index 00000000..9fb668dc --- /dev/null +++ b/tests/getrlimit.c @@ -0,0 +1,14 @@ +#include "tests.h" +#include + +#ifdef __NR_getrlimit + +# define NR_GETRLIMIT __NR_getrlimit +# define STR_GETRLIMIT "getrlimit" +# include "xgetrlimit.c" + +#else + +SKIP_MAIN_UNDEFINED("__NR_getrlimit") + +#endif diff --git a/tests/getrlimit.test b/tests/getrlimit.test new file mode 100755 index 00000000..6fd88aed --- /dev/null +++ b/tests/getrlimit.test @@ -0,0 +1,5 @@ +#!/bin/sh + +# Check decoding of getrlimit syscall. + +. "${srcdir=.}/setrlimit.test" diff --git a/tests/setrlimit.c b/tests/setrlimit.c new file mode 100644 index 00000000..b5a14c63 --- /dev/null +++ b/tests/setrlimit.c @@ -0,0 +1,76 @@ +/* + * Check decoding of setrlimit syscall. + * + * Copyright (c) 2016 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. + */ + +#include "tests.h" +#include + +#ifdef __NR_setrlimit + +# include "xgetrlimit.c" + +int +main(void) +{ + kernel_ulong_t *const rlimit = tail_alloc(sizeof(*rlimit) * 2); + const struct xlat *xlat; + + for (xlat = resources; xlat->str; ++xlat) { + unsigned long res = 0xfacefeed00000000 | xlat->val; + long rc = syscall(__NR_setrlimit, res, 0); + printf("setrlimit(%s, NULL) = %ld %s (%m)\n", + xlat->str, rc, errno2name()); + + struct rlimit libc_rlim = {}; + if (getrlimit((int) res, &libc_rlim)) + continue; + rlimit[0] = libc_rlim.rlim_cur; + rlimit[1] = libc_rlim.rlim_max; + + rc = syscall(__NR_setrlimit, res, rlimit); + int saved_errno = errno; + printf("setrlimit(%s, {rlim_cur=%s, rlim_max=%s})", + xlat->str, + sprint_rlim(rlimit[0]), sprint_rlim(rlimit[1])); + if (rc) { + errno = saved_errno; + printf(" = %ld %s (%m)\n", rc, errno2name()); + } else { + printf(" = 0\n"); + } + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_setrlimit") + +#endif diff --git a/tests/setrlimit.test b/tests/setrlimit.test new file mode 100755 index 00000000..79206089 --- /dev/null +++ b/tests/setrlimit.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of getrlimit/ugetrlimit/setrlimit syscall. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a27 diff --git a/tests/ugetrlimit.c b/tests/ugetrlimit.c new file mode 100644 index 00000000..dc24bb80 --- /dev/null +++ b/tests/ugetrlimit.c @@ -0,0 +1,14 @@ +#include "tests.h" +#include + +#ifdef __NR_ugetrlimit + +# define NR_GETRLIMIT __NR_ugetrlimit +# define STR_GETRLIMIT "ugetrlimit" +# include "xgetrlimit.c" + +#else + +SKIP_MAIN_UNDEFINED("__NR_ugetrlimit") + +#endif diff --git a/tests/ugetrlimit.test b/tests/ugetrlimit.test new file mode 100755 index 00000000..f4648ff1 --- /dev/null +++ b/tests/ugetrlimit.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of ugetrlimit syscall. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a28 diff --git a/tests/xgetrlimit.c b/tests/xgetrlimit.c new file mode 100644 index 00000000..5e9d7bdc --- /dev/null +++ b/tests/xgetrlimit.c @@ -0,0 +1,92 @@ +/* + * Check decoding of getrlimit/ugetrlimit syscall. + * + * Copyright (c) 2016 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. + */ + +#include +#include +#include +#include +#include + +#include "kernel_types.h" +#include "xlat.h" +#include "xlat/resources.h" + +const char * +sprint_rlim(kernel_ulong_t lim) +{ + if (sizeof(lim) == sizeof(uint64_t)) { + if (lim == -1ULL) + return "RLIM64_INFINITY"; + } else { + if (lim == -1U) + return "RLIM_INFINITY"; + } + + static char buf[2][sizeof(lim)*3 + sizeof("*1024")]; + static int i; + i &= 1; + if (lim > 1024 && lim % 1024 == 0) + sprintf(buf[i], "%llu*1024", (unsigned long long) lim / 1024); + else + sprintf(buf[i], "%llu", (unsigned long long) lim); + + return buf[i++]; +} + +#ifdef NR_GETRLIMIT + +int +main(void) +{ + kernel_ulong_t *const rlimit = tail_alloc(sizeof(*rlimit) * 2); + const struct xlat *xlat; + + for (xlat = resources; xlat->str; ++xlat) { + unsigned long res = 0xfacefeed00000000 | xlat->val; + long rc = syscall(NR_GETRLIMIT, res, 0); + if (rc && ENOSYS == errno) + perror_msg_and_skip(STR_GETRLIMIT); + printf("%s(%s, NULL) = %ld %s (%m)\n", + STR_GETRLIMIT, xlat->str, rc, errno2name()); + + rc = syscall(NR_GETRLIMIT, res, rlimit); + if (rc) + printf("%s(%s, NULL) = %ld %s (%m)\n", + STR_GETRLIMIT, xlat->str, rc, errno2name()); + else + printf("%s(%s, {rlim_cur=%s, rlim_max=%s})" + " = 0\n", STR_GETRLIMIT, xlat->str, + sprint_rlim(rlimit[0]), sprint_rlim(rlimit[1])); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#endif /* NR_GETRLIMIT */