~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/proc/setns-sysvipc.c

Version: ~ [ linux-6.1-rc7 ] ~ [ linux-6.0.10 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.80 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.156 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.225 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.267 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.300 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.334 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.302 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * Copyright © 2019 Alexey Dobriyan <adobriyan@gmail.com>
  3  *
  4  * Permission to use, copy, modify, and distribute this software for any
  5  * purpose with or without fee is hereby granted, provided that the above
  6  * copyright notice and this permission notice appear in all copies.
  7  *
  8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 15  */
 16 /*
 17  * Test that setns(CLONE_NEWIPC) points to new /proc/sysvipc content even
 18  * if old one is in dcache.
 19  */
 20 #undef NDEBUG
 21 #include <assert.h>
 22 #include <errno.h>
 23 #include <stdio.h>
 24 #include <sched.h>
 25 #include <signal.h>
 26 #include <stdlib.h>
 27 #include <string.h>
 28 #include <unistd.h>
 29 #include <sys/types.h>
 30 #include <sys/stat.h>
 31 #include <fcntl.h>
 32 #include <sys/ipc.h>
 33 #include <sys/shm.h>
 34 
 35 static pid_t pid = -1;
 36 
 37 static void f(void)
 38 {
 39         if (pid > 0) {
 40                 kill(pid, SIGTERM);
 41         }
 42 }
 43 
 44 int main(void)
 45 {
 46         int fd[2];
 47         char _ = 0;
 48         int nsfd;
 49 
 50         atexit(f);
 51 
 52         /* Check for priviledges and syscall availability straight away. */
 53         if (unshare(CLONE_NEWIPC) == -1) {
 54                 if (errno == ENOSYS || errno == EPERM) {
 55                         return 4;
 56                 }
 57                 return 1;
 58         }
 59         /* Distinguisher between two otherwise empty IPC namespaces. */
 60         if (shmget(IPC_PRIVATE, 1, IPC_CREAT) == -1) {
 61                 return 1;
 62         }
 63 
 64         if (pipe(fd) == -1) {
 65                 return 1;
 66         }
 67 
 68         pid = fork();
 69         if (pid == -1) {
 70                 return 1;
 71         }
 72 
 73         if (pid == 0) {
 74                 if (unshare(CLONE_NEWIPC) == -1) {
 75                         return 1;
 76                 }
 77 
 78                 if (write(fd[1], &_, 1) != 1) {
 79                         return 1;
 80                 }
 81 
 82                 pause();
 83 
 84                 return 0;
 85         }
 86 
 87         if (read(fd[0], &_, 1) != 1) {
 88                 return 1;
 89         }
 90 
 91         {
 92                 char buf[64];
 93                 snprintf(buf, sizeof(buf), "/proc/%u/ns/ipc", pid);
 94                 nsfd = open(buf, O_RDONLY);
 95                 if (nsfd == -1) {
 96                         return 1;
 97                 }
 98         }
 99 
100         /* Reliably pin dentry into dcache. */
101         (void)open("/proc/sysvipc/shm", O_RDONLY);
102 
103         if (setns(nsfd, CLONE_NEWIPC) == -1) {
104                 return 1;
105         }
106 
107         kill(pid, SIGTERM);
108         pid = 0;
109 
110         {
111                 char buf[4096];
112                 ssize_t rv;
113                 int fd;
114 
115                 fd = open("/proc/sysvipc/shm", O_RDONLY);
116                 if (fd == -1) {
117                         return 1;
118                 }
119 
120 #define S32 "       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime        rss       swap\n"
121 #define S64 "       key      shmid perms                  size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime                   rss                  swap\n"
122                 rv = read(fd, buf, sizeof(buf));
123                 if (rv == strlen(S32)) {
124                         assert(memcmp(buf, S32, strlen(S32)) == 0);
125                 } else if (rv == strlen(S64)) {
126                         assert(memcmp(buf, S64, strlen(S64)) == 0);
127                 } else {
128                         assert(0);
129                 }
130         }
131 
132         return 0;
133 }
134 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp