Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Add 21 unit tests for the XSI message queues.



details:   https://anonhg.NetBSD.org/src/rev/aae1aaba81f5
branches:  trunk
changeset: 770977:aae1aaba81f5
user:      jruoho <jruoho%NetBSD.org@localhost>
date:      Sat Nov 05 07:45:40 2011 +0000

description:
Add 21 unit tests for the XSI message queues.

diffstat:

 distrib/sets/lists/tests/mi   |   10 +-
 tests/lib/libc/sys/Makefile   |    6 +-
 tests/lib/libc/sys/t_msgctl.c |  358 ++++++++++++++++++++++++++++++++++++++++++
 tests/lib/libc/sys/t_msgget.c |  292 ++++++++++++++++++++++++++++++++++
 tests/lib/libc/sys/t_msgrcv.c |  341 ++++++++++++++++++++++++++++++++++++++++
 tests/lib/libc/sys/t_msgsnd.c |  338 +++++++++++++++++++++++++++++++++++++++
 6 files changed, 1343 insertions(+), 2 deletions(-)

diffs (truncated from 1396 to 300 lines):

diff -r 0796c260d448 -r aae1aaba81f5 distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi       Sat Nov 05 00:34:01 2011 +0000
+++ b/distrib/sets/lists/tests/mi       Sat Nov 05 07:45:40 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.414 2011/11/04 02:25:31 christos Exp $
+# $NetBSD: mi,v 1.415 2011/11/05 07:45:40 jruoho Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -511,6 +511,10 @@
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_mknod.debug               tests-lib-debug         debug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_mmap.debug                        tests-lib-debug         debug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_mprotect.debug            tests-lib-debug         debug,atf
+./usr/libdata/debug/usr/tests/lib/libc/sys/t_msgctl.debug              tests-lib-debug         debug,atf
+./usr/libdata/debug/usr/tests/lib/libc/sys/t_msgget.debug              tests-lib-debug         debug,atf
+./usr/libdata/debug/usr/tests/lib/libc/sys/t_msgrcv.debug              tests-lib-debug         debug,atf
+./usr/libdata/debug/usr/tests/lib/libc/sys/t_msgsnd.debug              tests-lib-debug         debug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_msync.debug               tests-lib-debug         debug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_nanosleep.debug           tests-lib-debug         debug,atf
 ./usr/libdata/debug/usr/tests/lib/libc/sys/t_pipe.debug                        tests-lib-debug         debug,atf
@@ -2137,6 +2141,10 @@
 ./usr/tests/lib/libc/sys/t_mknod               tests-lib-tests         atf
 ./usr/tests/lib/libc/sys/t_mmap                        tests-lib-tests         atf
 ./usr/tests/lib/libc/sys/t_mprotect            tests-lib-tests         atf
+./usr/tests/lib/libc/sys/t_msgctl              tests-lib-tests         atf
+./usr/tests/lib/libc/sys/t_msgget              tests-lib-tests         atf
+./usr/tests/lib/libc/sys/t_msgrcv              tests-lib-tests         atf
+./usr/tests/lib/libc/sys/t_msgsnd              tests-lib-tests         atf
 ./usr/tests/lib/libc/sys/t_msync               tests-lib-tests         atf
 ./usr/tests/lib/libc/sys/t_nanosleep           tests-lib-tests         atf
 ./usr/tests/lib/libc/sys/t_pipe                        tests-lib-tests         atf
diff -r 0796c260d448 -r aae1aaba81f5 tests/lib/libc/sys/Makefile
--- a/tests/lib/libc/sys/Makefile       Sat Nov 05 00:34:01 2011 +0000
+++ b/tests/lib/libc/sys/Makefile       Sat Nov 05 07:45:40 2011 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.17 2011/10/31 15:41:31 christos Exp $
+# $NetBSD: Makefile,v 1.18 2011/11/05 07:45:41 jruoho Exp $
 
 MKMAN= no
 
@@ -31,6 +31,10 @@
 TESTS_C+=              t_mknod
 TESTS_C+=              t_mmap
 TESTS_C+=              t_mprotect
+TESTS_C+=              t_msgctl
+TESTS_C+=              t_msgget
+TESTS_C+=              t_msgrcv
+TESTS_C+=              t_msgsnd
 TESTS_C+=              t_msync
 TESTS_C+=              t_nanosleep
 TESTS_C+=              t_pipe
diff -r 0796c260d448 -r aae1aaba81f5 tests/lib/libc/sys/t_msgctl.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lib/libc/sys/t_msgctl.c     Sat Nov 05 07:45:40 2011 +0000
@@ -0,0 +1,358 @@
+/* $NetBSD: t_msgctl.c,v 1.1 2011/11/05 07:45:41 jruoho Exp $ */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jukka Ruohonen.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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 <sys/cdefs.h>
+__RCSID("$NetBSD: t_msgctl.c,v 1.1 2011/11/05 07:45:41 jruoho Exp $");
+
+#include <sys/msg.h>
+#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/wait.h>
+
+#include <atf-c.h>
+#include <errno.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <time.h>
+#include <unistd.h>
+
+#define MSG_KEY                12345689
+#define MSG_MTYPE_1    0x41
+
+struct msg {
+       long             mtype;
+       char             buf[3];
+};
+
+static void            clean(void);
+
+static void
+clean(void)
+{
+       int id;
+
+       if ((id = msgget(MSG_KEY, 0)) != -1)
+               (void)msgctl(id, IPC_RMID, 0);
+}
+
+ATF_TC_WITH_CLEANUP(msgctl_err);
+ATF_TC_HEAD(msgctl_err, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "Test errors from msgctl(2)");
+}
+
+ATF_TC_BODY(msgctl_err, tc)
+{
+       const int cmd[] = { IPC_STAT, IPC_SET, IPC_RMID };
+       struct msqid_ds msgds;
+       size_t i;
+       int id;
+
+       (void)memset(&msgds, 0, sizeof(struct msqid_ds));
+
+       id = msgget(MSG_KEY, IPC_CREAT | 0600);
+       ATF_REQUIRE(id != -1);
+
+       errno = 0;
+       ATF_REQUIRE_ERRNO(EINVAL, msgctl(id, INT_MAX, &msgds) == -1);
+
+       errno = 0;
+       ATF_REQUIRE_ERRNO(EFAULT, msgctl(id, IPC_STAT, (void *)-1) == -1);
+
+       for (i = 0; i < __arraycount(cmd); i++) {
+               errno = 0;
+               ATF_REQUIRE_ERRNO(EINVAL, msgctl(-1, cmd[i], &msgds) == -1);
+       }
+
+       ATF_REQUIRE(msgctl(id, IPC_RMID, 0) == 0);
+}
+
+ATF_TC_CLEANUP(msgctl_err, tc)
+{
+       clean();
+}
+
+ATF_TC_WITH_CLEANUP(msgctl_perm);
+ATF_TC_HEAD(msgctl_perm, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "Test permissiosn with msgctl(2)");
+       atf_tc_set_md_var(tc, "require.user", "root");
+}
+
+ATF_TC_BODY(msgctl_perm, tc)
+{
+       struct msqid_ds msgds;
+       struct passwd *pw;
+       pid_t pid;
+       int sta;
+       int id;
+
+       (void)memset(&msgds, 0, sizeof(struct msqid_ds));
+
+       pw = getpwnam("nobody");
+       id = msgget(MSG_KEY, IPC_CREAT | 0600);
+
+       ATF_REQUIRE(id != -1);
+       ATF_REQUIRE(pw != NULL);
+       ATF_REQUIRE(msgctl(id, IPC_STAT, &msgds) == 0);
+
+       pid = fork();
+       ATF_REQUIRE(pid >= 0);
+
+       if (pid == 0) {
+
+               if (setuid(pw->pw_uid) != 0)
+                       _exit(EX_OSERR);
+
+               msgds.msg_perm.uid = getuid();
+               msgds.msg_perm.gid = getgid();
+
+               errno = 0;
+
+               if (msgctl(id, IPC_SET, &msgds) == 0)
+                       _exit(EXIT_FAILURE);
+
+               if (errno != EPERM)
+                       _exit(EXIT_FAILURE);
+
+               (void)memset(&msgds, 0, sizeof(struct msqid_ds));
+
+               if (msgctl(id, IPC_STAT, &msgds) != 0)
+                       _exit(EX_OSERR);
+
+               msgds.msg_qbytes = 1;
+
+               if (msgctl(id, IPC_SET, &msgds) == 0)
+                       _exit(EXIT_FAILURE);
+
+               if (errno != EPERM)
+                       _exit(EXIT_FAILURE);
+
+               _exit(EXIT_SUCCESS);
+       }
+
+       (void)wait(&sta);
+
+       if (WIFEXITED(sta) == 0) {
+
+               if (WEXITSTATUS(sta) == EX_OSERR)
+                       atf_tc_fail("system call failed");
+
+               if (WEXITSTATUS(sta) == EXIT_FAILURE)
+                       atf_tc_fail("UID %u manipulated root's "
+                           "message queue", pw->pw_uid);
+       }
+
+       ATF_REQUIRE(msgctl(id, IPC_RMID, 0) == 0);
+}
+
+ATF_TC_CLEANUP(msgctl_perm, tc)
+{
+       clean();
+}
+
+ATF_TC_WITH_CLEANUP(msgctl_pid);
+ATF_TC_HEAD(msgctl_pid, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "Test that PIDs are updated");
+}
+
+ATF_TC_BODY(msgctl_pid, tc)
+{
+       struct msg msg = { MSG_MTYPE_1, { 'a', 'b', 'c' } };
+       struct msqid_ds msgds;
+       int id, sta;
+       pid_t pid;
+
+       id = msgget(MSG_KEY, IPC_CREAT | 0600);
+       ATF_REQUIRE(id != -1);
+
+       pid = fork();
+       ATF_REQUIRE(pid >= 0);
+
+       if (pid == 0) {
+
+               (void)msgsnd(id, &msg, sizeof(struct msg), IPC_NOWAIT);
+
+               _exit(EXIT_SUCCESS);
+       }
+
+       (void)sleep(1);
+       (void)wait(&sta);
+       (void)memset(&msgds, 0, sizeof(struct msqid_ds));
+
+       ATF_REQUIRE(msgctl(id, IPC_STAT, &msgds) == 0);
+
+       if (pid != msgds.msg_lspid)
+               atf_tc_fail("the PID of last msgsnd(2) was not updated");
+
+       pid = fork();
+       ATF_REQUIRE(pid >= 0);
+
+       if (pid == 0) {
+
+               (void)msgrcv(id, &msg,
+                   sizeof(struct msg), MSG_MTYPE_1, IPC_NOWAIT);
+
+               _exit(EXIT_SUCCESS);
+       }
+
+       (void)sleep(1);
+       (void)wait(&sta);
+       (void)memset(&msgds, 0, sizeof(struct msqid_ds));
+
+       ATF_REQUIRE(msgctl(id, IPC_STAT, &msgds) == 0);
+
+       if (pid != msgds.msg_lrpid)
+               atf_tc_fail("the PID of last msgrcv(2) was not updated");
+
+       ATF_REQUIRE(msgctl(id, IPC_RMID, 0) == 0);
+}
+
+ATF_TC_CLEANUP(msgctl_pid, tc)
+{
+       clean();
+}



Home | Main Index | Thread Index | Old Index