]> granicus.if.org Git - strace/commitdiff
tests: move kernel uid overflow check to libtests
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Apr 2016 22:38:17 +0000 (22:38 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 18 Apr 2016 01:10:41 +0000 (01:10 +0000)
This code used in two different places, so move it to the library.

* tests/overflowuid.c: New file.
* tests/Makefile.am (libtests_a_SOURCES): Add it.
* tests/tests.h (check_overflowuid, check_overflowgid): New prototypes.
* tests/uid.c (main): Use check_overflowuid.
* tests/uid16.c (main): Likewise.

tests/Makefile.am
tests/overflowuid.c [new file with mode: 0644]
tests/tests.h
tests/uid.c
tests/uid16.c

index 2a4feb00953cac5ec42e257af65930348ceab0e0..c7e884d9aa75df90dd8afd2354ec45aa40f722c4 100644 (file)
@@ -46,6 +46,7 @@ libtests_a_SOURCES = \
        hexdump_strdup.c \
        hexquote_strndup.c \
        inode_of_sockfd.c \
+       overflowuid.c \
        print_quoted_string.c \
        tail_alloc.c \
        tests.h \
diff --git a/tests/overflowuid.c b/tests/overflowuid.c
new file mode 100644 (file)
index 0000000..d9d9e37
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014-2016 Dmitry V. Levin <ldv@altlinux.org>
+ * 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 <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+check_overflow_id(const int id, const char *overflowid)
+{
+       int fd = open(overflowid, O_RDONLY);
+       if (fd < 0) {
+               if (ENOENT == errno)
+                       return;
+               perror_msg_and_fail("open: %s", overflowid);
+       }
+
+       /* we trust the kernel */
+       char buf[sizeof(int)*3];
+       int n = read(fd, buf, sizeof(buf) - 1);
+       if (n > 0) {
+               buf[n] = '\0';
+               n = atoi(buf);
+               if (id == n)
+                       error_msg_and_skip("%d matches %s", id, overflowid);
+       }
+
+       close(fd);
+}
+
+void
+check_overflowuid(const int uid)
+{
+       check_overflow_id(uid, "/proc/sys/kernel/overflowuid");
+}
+
+void
+check_overflowgid(const int gid)
+{
+       check_overflow_id(gid, "/proc/sys/kernel/overflowgid");
+}
index 115379ee5c63e8548fb834d9ababcdef6af7b9c8..4382fe35cda406f79a487259e89f0dbc9b8c1bdf 100644 (file)
@@ -79,7 +79,13 @@ const char *hexquote_strndup(const char *, size_t);
 unsigned long inode_of_sockfd(int);
 
 /* Print string in quoted form. */
-void print_quoted_string(const char *str);
+void print_quoted_string(const char *);
+
+/* Check whether given uid matches kernel overflowuid. */
+void check_overflowuid(const int);
+
+/* Check whether given gid matches kernel overflowgid. */
+void check_overflowgid(const int);
 
 # define ARRAY_SIZE(arg) ((unsigned int) (sizeof(arg) / sizeof((arg)[0])))
 # define LENGTH_OF(arg) ((unsigned int) sizeof(arg) - 1)
index 5da04712df9f09ba819dec13604910279b8f0cbe..35e0b91ac037b7f43658eb52845d76f42a0b98d3 100644 (file)
@@ -52,20 +52,7 @@ main(void)
 #  define __NR_getuid __NR_getxuid
 # endif
        uid = syscall(__NR_getuid);
-
-       (void) close(0);
-       if (open("/proc/sys/kernel/overflowuid", O_RDONLY) == 0) {
-               /* we trust the kernel */
-               char buf[sizeof(int)*3];
-               int n = read(0, buf, sizeof(buf) - 1);
-               if (n) {
-                       buf[n] = '\0';
-                       n = atoi(buf);
-                       if (uid == n)
-                               error_msg_and_skip("getuid() == overflowuid");
-               }
-               (void) close(0);
-       }
+       check_overflowuid(uid);
 
        assert(syscall(__NR_setuid, uid) == 0);
        {
index 04bf8a31bde3cf2be0348ae28a7f04d2880e877c..bc713878a0565f170a0c88458645f7a0ec580789 100644 (file)
@@ -66,20 +66,7 @@ main(void)
        int *list = 0;
 
        uid = syscall(__NR_getuid);
-
-       (void) close(0);
-       if (open("/proc/sys/kernel/overflowuid", O_RDONLY) == 0) {
-               /* we trust the kernel */
-               char buf[sizeof(int)*3];
-               int n = read(0, buf, sizeof(buf) - 1);
-               if (n) {
-                       buf[n] = '\0';
-                       n = atoi(buf);
-                       if (uid == n)
-                               error_msg_and_skip("getuid() == overflowuid");
-               }
-               close(0);
-       }
+       check_overflowuid(uid);
 
        assert(syscall(__NR_setuid, uid) == 0);
        {