From 281e4578ddff7a43188f7901418a30d077086adf Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 18 Apr 2016 15:59:28 +0000 Subject: [PATCH] tests: check decoding of setfsuid syscall * tests/setfsugid.c: New file. * tests/setfsuid.c: New file. * tests/setfsuid.test: New test. * tests/.gitignore: Add setfsuid. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add setfsuid.test. (EXTRA_DIST): Add setfsugid.c. --- tests/.gitignore | 1 + tests/Makefile.am | 3 +++ tests/setfsugid.c | 65 +++++++++++++++++++++++++++++++++++++++++++++ tests/setfsuid.c | 23 ++++++++++++++++ tests/setfsuid.test | 6 +++++ 5 files changed, 98 insertions(+) create mode 100644 tests/setfsugid.c create mode 100644 tests/setfsuid.c create mode 100755 tests/setfsuid.test diff --git a/tests/.gitignore b/tests/.gitignore index 3ef4062c..8bcede0f 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -142,6 +142,7 @@ semop sendfile sendfile64 set_ptracer_any +setfsuid setgid setgid32 sethostname diff --git a/tests/Makefile.am b/tests/Makefile.am index cf2027a3..eb91ab3d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -192,6 +192,7 @@ check_PROGRAMS = \ sendfile \ sendfile64 \ set_ptracer_any \ + setfsuid \ setgid \ setgid32 \ sethostname \ @@ -411,6 +412,7 @@ DECODER_TESTS = \ semop.test \ sendfile.test \ sendfile64.test \ + setfsuid.test \ setgid.test \ setgid32.test \ sethostname.test \ @@ -530,6 +532,7 @@ EXTRA_DIST = init.sh run.sh match.awk \ pipe.expected \ ppoll.expected \ ppoll-v.expected \ + setfsugid.c \ setreugid.c \ setresugid.c \ setugid.c \ diff --git a/tests/setfsugid.c b/tests/setfsugid.c new file mode 100644 index 00000000..5b8f4fdd --- /dev/null +++ b/tests/setfsugid.c @@ -0,0 +1,65 @@ +/* + * Check decoding of setfsuid/setfsgid/setfsuid32/setfsgid32 syscalls. + * + * 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 + +int +main(void) +{ + unsigned int ugid = GETUGID; + + const long tests[] = { + ugid, + 0xffff0000U | ugid, + (unsigned long) 0xffffffff00000000ULL | ugid, + 0xffffU, + -1U, + -1L, + 0xc0deffffU, + 0xfacefeedU, + (long) 0xfacefeeddeadbeefULL + }; + + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(tests); ++i) { + const unsigned int num = (unsigned UGID_TYPE) tests[i]; + unsigned int rc; + + rc = syscall(SYSCALL_NR, tests[i]); + printf("%s(%u) = %u\n", SYSCALL_NAME, num, rc); + + rc = syscall(SYSCALL_NR, ugid); + printf("%s(%u) = %u\n", SYSCALL_NAME, ugid, rc); + } + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/setfsuid.c b/tests/setfsuid.c new file mode 100644 index 00000000..7c77f502 --- /dev/null +++ b/tests/setfsuid.c @@ -0,0 +1,23 @@ +#include "tests.h" +#include + +#ifdef __NR_setfsuid + +# define SYSCALL_NR __NR_setfsuid +# define SYSCALL_NAME "setfsuid" + +# if defined __NR_setfsuid32 && __NR_setfsuid != __NR_setfsuid32 +# define UGID_TYPE short +# define GETUGID syscall(__NR_geteuid) +# else +# define UGID_TYPE int +# define GETUGID geteuid() +# endif + +# include "setfsugid.c" + +#else + +SKIP_MAIN_UNDEFINED("__NR_setfsuid") + +#endif diff --git a/tests/setfsuid.test b/tests/setfsuid.test new file mode 100755 index 00000000..18a10219 --- /dev/null +++ b/tests/setfsuid.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check setfsuid syscall decoding. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a12 -- 2.40.0