xref: /freebsd/contrib/capsicum-test/procdesc.cc (revision e17f5b1d307b7b8910d67883e57a9604305906d5)
1 // Tests for the process descriptor API for Linux.
2 #include <sys/types.h>
3 #include <sys/resource.h>
4 #include <sys/select.h>
5 #include <sys/socket.h>
6 #include <sys/stat.h>
7 #include <sys/time.h>
8 #include <sys/wait.h>
9 #include <fcntl.h>
10 #include <poll.h>
11 #include <pthread.h>
12 #include <signal.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 
16 #include <iomanip>
17 #include <map>
18 
19 #include "capsicum.h"
20 #include "syscalls.h"
21 #include "capsicum-test.h"
22 
23 #ifndef __WALL
24 // Linux requires __WALL in order for waitpid(specific_pid,...) to
25 // see and reap any specific pid.  Define this to nothing for platforms
26 // (FreeBSD) where it doesn't exist, to reduce macroing.
27 #define __WALL 0
28 #endif
29 
30 // TODO(drysdale): it would be nice to use proper synchronization between
31 // processes, rather than synchronization-via-sleep; faster too.
32 
33 
34 //------------------------------------------------
35 // Utilities for the tests.
36 
37 static pid_t pdwait4_(int pd, int *status, int options, struct rusage *ru) {
38 #ifdef HAVE_PDWAIT4
39   return pdwait4(pd, status, options, ru);
40 #else
41   // Simulate pdwait4() with wait4(pdgetpid()); this won't work in capability mode.
42   pid_t pid = -1;
43   int rc = pdgetpid(pd, &pid);
44   if (rc < 0) {
45     return rc;
46   }
47   options |= __WALL;
48   return wait4(pid, status, options, ru);
49 #endif
50 }
51 
52 static void print_rusage(FILE *f, struct rusage *ru) {
53   fprintf(f, "  User CPU time=%ld.%06ld\n", (long)ru->ru_utime.tv_sec, (long)ru->ru_utime.tv_usec);
54   fprintf(f, "  System CPU time=%ld.%06ld\n", (long)ru->ru_stime.tv_sec, (long)ru->ru_stime.tv_usec);
55   fprintf(f, "  Max RSS=%ld\n", ru->ru_maxrss);
56 }
57 
58 static void print_stat(FILE *f, const struct stat *stat) {
59   fprintf(f,
60           "{ .st_dev=%ld, st_ino=%ld, st_mode=%04o, st_nlink=%ld, st_uid=%d, st_gid=%d,\n"
61           "  .st_rdev=%ld, .st_size=%ld, st_blksize=%ld, .st_block=%ld,\n  "
62 #ifdef HAVE_STAT_BIRTHTIME
63           ".st_birthtime=%ld, "
64 #endif
65           ".st_atime=%ld, .st_mtime=%ld, .st_ctime=%ld}\n",
66           (long)stat->st_dev, (long)stat->st_ino, stat->st_mode,
67           (long)stat->st_nlink, stat->st_uid, stat->st_gid,
68           (long)stat->st_rdev, (long)stat->st_size, (long)stat->st_blksize,
69           (long)stat->st_blocks,
70 #ifdef HAVE_STAT_BIRTHTIME
71           (long)stat->st_birthtime,
72 #endif
73           (long)stat->st_atime, (long)stat->st_mtime, (long)stat->st_ctime);
74 }
75 
76 static std::map<int,bool> had_signal;
77 static void handle_signal(int x) {
78   had_signal[x] = true;
79 }
80 
81 // Check that the given child process terminates as expected.
82 void CheckChildFinished(pid_t pid, bool signaled=false) {
83   // Wait for the child to finish.
84   int rc;
85   int status = 0;
86   do {
87     rc = waitpid(pid, &status, __WALL);
88     if (rc < 0) {
89       fprintf(stderr, "Warning: waitpid error %s (%d)\n", strerror(errno), errno);
90       ADD_FAILURE() << "Failed to wait for child";
91       break;
92     } else if (rc == pid) {
93       break;
94     }
95   } while (true);
96   EXPECT_EQ(pid, rc);
97   if (rc == pid) {
98     if (signaled) {
99       EXPECT_TRUE(WIFSIGNALED(status));
100     } else {
101       EXPECT_TRUE(WIFEXITED(status)) << std::hex << status;
102       EXPECT_EQ(0, WEXITSTATUS(status));
103     }
104   }
105 }
106 
107 //------------------------------------------------
108 // Basic tests of process descriptor functionality
109 
110 TEST(Pdfork, Simple) {
111   int pd = -1;
112   pid_t parent = getpid_();
113   int pid = pdfork(&pd, 0);
114   EXPECT_OK(pid);
115   if (pid == 0) {
116     // Child: check pid values.
117     EXPECT_EQ(-1, pd);
118     EXPECT_NE(parent, getpid_());
119     EXPECT_EQ(parent, getppid());
120     sleep(1);
121     exit(0);
122   }
123   usleep(100);  // ensure the child has a chance to run
124   EXPECT_NE(-1, pd);
125   EXPECT_PID_ALIVE(pid);
126   int pid_got;
127   EXPECT_OK(pdgetpid(pd, &pid_got));
128   EXPECT_EQ(pid, pid_got);
129 
130   // Wait long enough for the child to exit().
131   sleep(2);
132   EXPECT_PID_ZOMBIE(pid);
133 
134   // Wait for the the child.
135   int status;
136   struct rusage ru;
137   memset(&ru, 0, sizeof(ru));
138   int waitrc = pdwait4_(pd, &status, 0, &ru);
139   EXPECT_EQ(pid, waitrc);
140   if (verbose) {
141     fprintf(stderr, "For pd %d pid %d:\n", pd, pid);
142     print_rusage(stderr, &ru);
143   }
144   EXPECT_PID_GONE(pid);
145 
146   // Can only pdwait4(pd) once (as initial call reaps zombie).
147   memset(&ru, 0, sizeof(ru));
148   EXPECT_EQ(-1, pdwait4_(pd, &status, 0, &ru));
149   EXPECT_EQ(ECHILD, errno);
150 
151   EXPECT_OK(close(pd));
152 }
153 
154 TEST(Pdfork, InvalidFlag) {
155   int pd = -1;
156   int pid = pdfork(&pd, PD_DAEMON<<5);
157   if (pid == 0) {
158     exit(1);
159   }
160   EXPECT_EQ(-1, pid);
161   EXPECT_EQ(EINVAL, errno);
162   if (pid > 0) waitpid(pid, NULL, __WALL);
163 }
164 
165 TEST(Pdfork, TimeCheck) {
166   time_t now = time(NULL);  // seconds since epoch
167   EXPECT_NE(-1, now);
168   if (verbose) fprintf(stderr, "Calling pdfork around %ld\n", (long)(long)now);
169 
170   int pd = -1;
171   pid_t pid = pdfork(&pd, 0);
172   EXPECT_OK(pid);
173   if (pid == 0) {
174     // Child: check we didn't get a valid process descriptor then exit.
175     EXPECT_EQ(-1, pdgetpid(pd, &pid));
176     EXPECT_EQ(EBADF, errno);
177     exit(HasFailure());
178   }
179 
180 #ifdef HAVE_PROCDESC_FSTAT
181   // Parent process. Ensure that [acm]times have been set correctly.
182   struct stat stat;
183   memset(&stat, 0, sizeof(stat));
184   EXPECT_OK(fstat(pd, &stat));
185   if (verbose) print_stat(stderr, &stat);
186 
187 #ifdef HAVE_STAT_BIRTHTIME
188   EXPECT_GE(now, stat.st_birthtime);
189   EXPECT_EQ(stat.st_birthtime, stat.st_atime);
190 #endif
191   EXPECT_LT((now - stat.st_atime), 2);
192   EXPECT_EQ(stat.st_atime, stat.st_ctime);
193   EXPECT_EQ(stat.st_ctime, stat.st_mtime);
194 #endif
195 
196   // Wait for the child to finish.
197   pid_t pd_pid = -1;
198   EXPECT_OK(pdgetpid(pd, &pd_pid));
199   EXPECT_EQ(pid, pd_pid);
200   CheckChildFinished(pid);
201 }
202 
203 TEST(Pdfork, UseDescriptor) {
204   int pd = -1;
205   pid_t pid = pdfork(&pd, 0);
206   EXPECT_OK(pid);
207   if (pid == 0) {
208     // Child: immediately exit
209     exit(0);
210   }
211   CheckChildFinished(pid);
212 }
213 
214 TEST(Pdfork, NonProcessDescriptor) {
215   int fd = open("/etc/passwd", O_RDONLY);
216   EXPECT_OK(fd);
217   // pd*() operations should fail on a non-process descriptor.
218   EXPECT_EQ(-1, pdkill(fd, SIGUSR1));
219   int status;
220   EXPECT_EQ(-1, pdwait4_(fd, &status, 0, NULL));
221   pid_t pid;
222   EXPECT_EQ(-1, pdgetpid(fd, &pid));
223   close(fd);
224 }
225 
226 static void *SubThreadMain(void *) {
227   while (true) {
228     if (verbose) fprintf(stderr, "      subthread: \"I aten't dead\"\n");
229     usleep(100000);
230   }
231   return NULL;
232 }
233 
234 static void *ThreadMain(void *) {
235   int pd;
236   pid_t child = pdfork(&pd, 0);
237   if (child == 0) {
238     // Child: start a subthread then loop
239     pthread_t child_subthread;
240     EXPECT_OK(pthread_create(&child_subthread, NULL, SubThreadMain, NULL));
241     while (true) {
242       if (verbose) fprintf(stderr, "    pdforked process %d: \"I aten't dead\"\n", getpid());
243       usleep(100000);
244     }
245     exit(0);
246   }
247   if (verbose) fprintf(stderr, "  thread generated pd %d\n", pd);
248   sleep(2);
249 
250   // Pass the process descriptor back to the main thread.
251   return reinterpret_cast<void *>(pd);
252 }
253 
254 TEST(Pdfork, FromThread) {
255   // Fire off a new thread to do all of the creation work.
256   pthread_t child_thread;
257   EXPECT_OK(pthread_create(&child_thread, NULL, ThreadMain, NULL));
258   void *data;
259   EXPECT_OK(pthread_join(child_thread, &data));
260   int pd = reinterpret_cast<intptr_t>(data);
261   if (verbose) fprintf(stderr, "retrieved pd %d from terminated thread\n", pd);
262 
263   // Kill and reap.
264   pid_t pid;
265   EXPECT_OK(pdgetpid(pd, &pid));
266   EXPECT_OK(pdkill(pd, SIGKILL));
267   int status;
268   EXPECT_EQ(pid, pdwait4_(pd, &status, 0, NULL));
269   EXPECT_TRUE(WIFSIGNALED(status));
270 }
271 
272 //------------------------------------------------
273 // More complicated tests.
274 
275 
276 // Test fixture that pdfork()s off a child process, which terminates
277 // when it receives anything on a pipe.
278 class PipePdforkBase : public ::testing::Test {
279  public:
280   PipePdforkBase(int pdfork_flags) : pd_(-1), pid_(-1) {
281     had_signal.clear();
282     int pipes[2];
283     EXPECT_OK(pipe(pipes));
284     pipe_ = pipes[1];
285     int parent = getpid_();
286     if (verbose) fprintf(stderr, "[%d] about to pdfork()\n", getpid_());
287     int rc = pdfork(&pd_, pdfork_flags);
288     EXPECT_OK(rc);
289     if (rc == 0) {
290       // Child process: blocking-read an int from the pipe then exit with that value.
291       EXPECT_NE(parent, getpid_());
292       EXPECT_EQ(parent, getppid());
293       if (verbose) fprintf(stderr, "  [%d] child of %d waiting for value on pipe\n", getpid_(), getppid());
294       read(pipes[0], &rc, sizeof(rc));
295       if (verbose) fprintf(stderr, "  [%d] got value %d on pipe, exiting\n", getpid_(), rc);
296       exit(rc);
297     }
298     pid_ = rc;
299     usleep(100);  // ensure the child has a chance to run
300   }
301   ~PipePdforkBase() {
302     // Terminate by any means necessary.
303     if (pd_ > 0) {
304       pdkill(pd_, SIGKILL);
305       close(pd_);
306     }
307     if (pid_ > 0) {
308       kill(pid_, SIGKILL);
309       waitpid(pid_, NULL, __WALL|WNOHANG);
310     }
311     // Check signal expectations.
312     EXPECT_FALSE(had_signal[SIGCHLD]);
313   }
314   int TerminateChild() {
315     // Tell the child to exit.
316     int zero = 0;
317     if (verbose) fprintf(stderr, "[%d] write 0 to pipe\n", getpid_());
318     return write(pipe_, &zero, sizeof(zero));
319   }
320  protected:
321   int pd_;
322   int pipe_;
323   pid_t pid_;
324 };
325 
326 class PipePdfork : public PipePdforkBase {
327  public:
328   PipePdfork() : PipePdforkBase(0) {}
329 };
330 
331 class PipePdforkDaemon : public PipePdforkBase {
332  public:
333   PipePdforkDaemon() : PipePdforkBase(PD_DAEMON) {}
334 };
335 
336 // Can we poll a process descriptor?
337 TEST_F(PipePdfork, Poll) {
338   // Poll the process descriptor, nothing happening.
339   struct pollfd fdp;
340   fdp.fd = pd_;
341   fdp.events = POLLIN | POLLERR | POLLHUP;
342   fdp.revents = 0;
343   EXPECT_EQ(0, poll(&fdp, 1, 0));
344 
345   TerminateChild();
346 
347   // Poll again, should have activity on the process descriptor.
348   EXPECT_EQ(1, poll(&fdp, 1, 2000));
349   EXPECT_TRUE(fdp.revents & POLLHUP);
350 
351   // Poll a third time, still have POLLHUP.
352   fdp.revents = 0;
353   EXPECT_EQ(1, poll(&fdp, 1, 0));
354   EXPECT_TRUE(fdp.revents & POLLHUP);
355 }
356 
357 // Can multiple processes poll on the same descriptor?
358 TEST_F(PipePdfork, PollMultiple) {
359   int child = fork();
360   EXPECT_OK(child);
361   if (child == 0) {
362     // Child: wait to give time for setup, then write to the pipe (which will
363     // induce exit of the pdfork()ed process) and exit.
364     sleep(1);
365     TerminateChild();
366     exit(0);
367   }
368   usleep(100);  // ensure the child has a chance to run
369 
370   // Fork again
371   int doppel = fork();
372   EXPECT_OK(doppel);
373   // We now have:
374   //   pid A: main process, here
375   //   |--pid B: pdfork()ed process, blocked on read()
376   //   |--pid C: fork()ed process, in sleep(1) above
377   //   +--pid D: doppel process, here
378 
379   // Both A and D execute the following code.
380   // First, check no activity on the process descriptor yet.
381   struct pollfd fdp;
382   fdp.fd = pd_;
383   fdp.events = POLLIN | POLLERR | POLLHUP;
384   fdp.revents = 0;
385   EXPECT_EQ(0, poll(&fdp, 1, 0));
386 
387   // Now, wait (indefinitely) for activity on the process descriptor.
388   // We expect:
389   //  - pid C will finish its sleep, write to the pipe and exit
390   //  - pid B will unblock from read(), and exit
391   //  - this will generate an event on the process descriptor...
392   //  - ...in both process A and process D.
393   EXPECT_EQ(1, poll(&fdp, 1, 2000));
394   EXPECT_TRUE(fdp.revents & POLLHUP);
395 
396   if (doppel == 0) {
397     // Child: process D exits.
398     exit(0);
399   } else {
400     // Parent: wait on process D.
401     int rc = 0;
402     waitpid(doppel, &rc, __WALL);
403     EXPECT_TRUE(WIFEXITED(rc));
404     EXPECT_EQ(0, WEXITSTATUS(rc));
405     // Also wait on process B.
406     CheckChildFinished(child);
407   }
408 }
409 
410 // Check that exit status/rusage for a dead pdfork()ed child can be retrieved
411 // via any process descriptor, multiple times.
412 TEST_F(PipePdfork, MultipleRetrieveExitStatus) {
413   EXPECT_PID_ALIVE(pid_);
414   int pd_copy = dup(pd_);
415   EXPECT_LT(0, TerminateChild());
416 
417   int status;
418   struct rusage ru;
419   memset(&ru, 0, sizeof(ru));
420   int waitrc = pdwait4_(pd_copy, &status, 0, &ru);
421   EXPECT_EQ(pid_, waitrc);
422   if (verbose) {
423     fprintf(stderr, "For pd %d -> pid %d:\n", pd_, pid_);
424     print_rusage(stderr, &ru);
425   }
426   EXPECT_PID_GONE(pid_);
427 
428 #ifdef NOTYET
429   // Child has been reaped, so original process descriptor dangles but
430   // still has access to rusage information.
431   memset(&ru, 0, sizeof(ru));
432   EXPECT_EQ(0, pdwait4_(pd_, &status, 0, &ru));
433 #endif
434   close(pd_copy);
435 }
436 
437 TEST_F(PipePdfork, ChildExit) {
438   EXPECT_PID_ALIVE(pid_);
439   EXPECT_LT(0, TerminateChild());
440   EXPECT_PID_DEAD(pid_);
441 
442   int status;
443   int rc = pdwait4_(pd_, &status, 0, NULL);
444   EXPECT_OK(rc);
445   EXPECT_EQ(pid_, rc);
446   pid_ = 0;
447 }
448 
449 #ifdef HAVE_PROC_FDINFO
450 TEST_F(PipePdfork, FdInfo) {
451   char buffer[1024];
452   sprintf(buffer, "/proc/%d/fdinfo/%d", getpid_(), pd_);
453   int procfd = open(buffer, O_RDONLY);
454   EXPECT_OK(procfd);
455 
456   EXPECT_OK(read(procfd, buffer, sizeof(buffer)));
457   // The fdinfo should include the file pos of the underlying file
458   EXPECT_NE((char*)NULL, strstr(buffer, "pos:\t0")) << buffer;
459   // ...and the underlying pid
460   char pidline[256];
461   sprintf(pidline, "pid:\t%d", pid_);
462   EXPECT_NE((char*)NULL, strstr(buffer, pidline)) << buffer;
463   close(procfd);
464 }
465 #endif
466 
467 // Closing a normal process descriptor terminates the underlying process.
468 TEST_F(PipePdfork, Close) {
469   sighandler_t original = signal(SIGCHLD, handle_signal);
470   EXPECT_PID_ALIVE(pid_);
471   int status;
472   EXPECT_EQ(0, waitpid(pid_, &status, __WALL|WNOHANG));
473 
474   EXPECT_OK(close(pd_));
475   pd_ = -1;
476   EXPECT_FALSE(had_signal[SIGCHLD]);
477   EXPECT_PID_DEAD(pid_);
478 
479 #ifdef __FreeBSD__
480   EXPECT_EQ(-1, waitpid(pid_, NULL, __WALL));
481   EXPECT_EQ(errno, ECHILD);
482 #else
483   // Having closed the process descriptor means that pdwait4(pd) now doesn't work.
484   int rc = pdwait4_(pd_, &status, 0, NULL);
485   EXPECT_EQ(-1, rc);
486   EXPECT_EQ(EBADF, errno);
487 
488   // Closing all process descriptors means the the child can only be reaped via pid.
489   EXPECT_EQ(pid_, waitpid(pid_, &status, __WALL|WNOHANG));
490 #endif
491   signal(SIGCHLD, original);
492 }
493 
494 TEST_F(PipePdfork, CloseLast) {
495   sighandler_t original = signal(SIGCHLD, handle_signal);
496   // Child should only die when last process descriptor is closed.
497   EXPECT_PID_ALIVE(pid_);
498   int pd_other = dup(pd_);
499 
500   EXPECT_OK(close(pd_));
501   pd_ = -1;
502 
503   EXPECT_PID_ALIVE(pid_);
504   int status;
505   EXPECT_EQ(0, waitpid(pid_, &status, __WALL|WNOHANG));
506 
507   // Can no longer pdwait4() the closed process descriptor...
508   EXPECT_EQ(-1, pdwait4_(pd_, &status, WNOHANG, NULL));
509   EXPECT_EQ(EBADF, errno);
510   // ...but can pdwait4() the still-open process descriptor.
511   errno = 0;
512   EXPECT_EQ(0, pdwait4_(pd_other, &status, WNOHANG, NULL));
513   EXPECT_EQ(0, errno);
514 
515   EXPECT_OK(close(pd_other));
516   EXPECT_PID_DEAD(pid_);
517 
518   EXPECT_FALSE(had_signal[SIGCHLD]);
519   signal(SIGCHLD, original);
520 }
521 
522 FORK_TEST(Pdfork, OtherUser) {
523   REQUIRE_ROOT();
524   int pd;
525   pid_t pid = pdfork(&pd, 0);
526   EXPECT_OK(pid);
527   if (pid == 0) {
528     // Child process: loop forever.
529     while (true) usleep(100000);
530   }
531   usleep(100);
532 
533   // Now that the second process has been pdfork()ed, change euid.
534   setuid(other_uid);
535   if (verbose) fprintf(stderr, "uid=%d euid=%d\n", getuid(), geteuid());
536 
537   // Fail to kill child with normal PID operation.
538   EXPECT_EQ(-1, kill(pid, SIGKILL));
539   EXPECT_EQ(EPERM, errno);
540   EXPECT_PID_ALIVE(pid);
541 
542   // Succeed with pdkill though.
543   EXPECT_OK(pdkill(pd, SIGKILL));
544   EXPECT_PID_ZOMBIE(pid);
545 
546   int status;
547   int rc = pdwait4_(pd, &status, WNOHANG, NULL);
548   EXPECT_OK(rc);
549   EXPECT_EQ(pid, rc);
550   EXPECT_TRUE(WIFSIGNALED(status));
551 }
552 
553 TEST_F(PipePdfork, WaitPidThenPd) {
554   TerminateChild();
555   int status;
556   // If we waitpid(pid) first...
557   int rc = waitpid(pid_, &status, __WALL);
558   EXPECT_OK(rc);
559   EXPECT_EQ(pid_, rc);
560 
561 #ifdef NOTYET
562   // ...the zombie is reaped but we can still subsequently pdwait4(pd).
563   EXPECT_EQ(0, pdwait4_(pd_, &status, 0, NULL));
564 #endif
565 }
566 
567 TEST_F(PipePdfork, WaitPdThenPid) {
568   TerminateChild();
569   int status;
570   // If we pdwait4(pd) first...
571   int rc = pdwait4_(pd_, &status, 0, NULL);
572   EXPECT_OK(rc);
573   EXPECT_EQ(pid_, rc);
574 
575   // ...the zombie is reaped and cannot subsequently waitpid(pid).
576   EXPECT_EQ(-1, waitpid(pid_, &status, __WALL));
577   EXPECT_EQ(ECHILD, errno);
578 }
579 
580 // Setting PD_DAEMON prevents close() from killing the child.
581 TEST_F(PipePdforkDaemon, Close) {
582   EXPECT_OK(close(pd_));
583   pd_ = -1;
584   EXPECT_PID_ALIVE(pid_);
585 
586   // Can still explicitly kill it via the pid.
587   if (pid_ > 0) {
588     EXPECT_OK(kill(pid_, SIGKILL));
589     EXPECT_PID_DEAD(pid_);
590   }
591 }
592 
593 static void TestPdkill(pid_t pid, int pd) {
594   EXPECT_PID_ALIVE(pid);
595   // SIGCONT is ignored by default.
596   EXPECT_OK(pdkill(pd, SIGCONT));
597   EXPECT_PID_ALIVE(pid);
598 
599   // SIGINT isn't
600   EXPECT_OK(pdkill(pd, SIGINT));
601   EXPECT_PID_DEAD(pid);
602 
603   // pdkill() on zombie is no-op.
604   errno = 0;
605   EXPECT_EQ(0, pdkill(pd, SIGINT));
606   EXPECT_EQ(0, errno);
607 
608   // pdkill() on reaped process gives -ESRCH.
609   CheckChildFinished(pid, true);
610   EXPECT_EQ(-1, pdkill(pd, SIGINT));
611   EXPECT_EQ(ESRCH, errno);
612 }
613 
614 TEST_F(PipePdfork, Pdkill) {
615   TestPdkill(pid_, pd_);
616 }
617 
618 TEST_F(PipePdforkDaemon, Pdkill) {
619   TestPdkill(pid_, pd_);
620 }
621 
622 TEST(Pdfork, PdkillOtherSignal) {
623   int pd = -1;
624   int pid = pdfork(&pd, 0);
625   EXPECT_OK(pid);
626   if (pid == 0) {
627     // Child: watch for SIGUSR1 forever.
628     had_signal.clear();
629     signal(SIGUSR1, handle_signal);
630     while (!had_signal[SIGUSR1]) {
631       usleep(100000);
632     }
633     exit(123);
634   }
635   sleep(1);
636 
637   // Send an invalid signal.
638   EXPECT_EQ(-1, pdkill(pd, 0xFFFF));
639   EXPECT_EQ(EINVAL, errno);
640 
641   // Send an expected SIGUSR1 to the pdfork()ed child.
642   EXPECT_PID_ALIVE(pid);
643   pdkill(pd, SIGUSR1);
644   EXPECT_PID_DEAD(pid);
645 
646   // Child's exit status confirms whether it received the signal.
647   int status;
648   int rc = waitpid(pid, &status, __WALL);
649   EXPECT_OK(rc);
650   EXPECT_EQ(pid, rc);
651   EXPECT_TRUE(WIFEXITED(status)) << "0x" << std::hex << rc;
652   EXPECT_EQ(123, WEXITSTATUS(status));
653 }
654 
655 pid_t PdforkParentDeath(int pdfork_flags) {
656   // Set up:
657   //   pid A: main process, here
658   //   +--pid B: fork()ed process, sleep(4)s then exits
659   //      +--pid C: pdfork()ed process, looping forever
660   int sock_fds[2];
661   EXPECT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fds));
662   if (verbose) fprintf(stderr, "[%d] parent about to fork()...\n", getpid_());
663   pid_t child = fork();
664   EXPECT_OK(child);
665   if (child == 0) {
666     int pd;
667     if (verbose) fprintf(stderr, "  [%d] child about to pdfork()...\n", getpid_());
668     pid_t grandchild = pdfork(&pd, pdfork_flags);
669     if (grandchild == 0) {
670       while (true) {
671         if (verbose) fprintf(stderr, "    [%d] grandchild: \"I aten't dead\"\n", getpid_());
672         sleep(1);
673       }
674     }
675     if (verbose) fprintf(stderr, "  [%d] pdfork()ed grandchild %d, sending ID to parent\n", getpid_(), grandchild);
676     // send grandchild pid to parent
677     write(sock_fds[1], &grandchild, sizeof(grandchild));
678     sleep(4);
679     if (verbose) fprintf(stderr, "  [%d] child terminating\n", getpid_());
680     exit(0);
681   }
682   if (verbose) fprintf(stderr, "[%d] fork()ed child is %d\n", getpid_(), child);
683   pid_t grandchild;
684   read(sock_fds[0], &grandchild, sizeof(grandchild));
685   if (verbose) fprintf(stderr, "[%d] receive grandchild id %d\n", getpid_(), grandchild);
686   EXPECT_PID_ALIVE(child);
687   EXPECT_PID_ALIVE(grandchild);
688   sleep(6);
689   // Child dies, closing its process descriptor for the grandchild.
690   EXPECT_PID_DEAD(child);
691   CheckChildFinished(child);
692   return grandchild;
693 }
694 
695 TEST(Pdfork, Bagpuss) {
696   // "And of course when Bagpuss goes to sleep, all his friends go to sleep too"
697   pid_t grandchild = PdforkParentDeath(0);
698   // By default: child death => closed process descriptor => grandchild death.
699   EXPECT_PID_DEAD(grandchild);
700 }
701 
702 TEST(Pdfork, BagpussDaemon) {
703   pid_t grandchild = PdforkParentDeath(PD_DAEMON);
704   // With PD_DAEMON: child death => closed process descriptor => no effect on grandchild.
705   EXPECT_PID_ALIVE(grandchild);
706   if (grandchild > 0) {
707     EXPECT_OK(kill(grandchild, SIGKILL));
708   }
709 }
710 
711 // The exit of a pdfork()ed process should not generate SIGCHLD.
712 TEST_F(PipePdfork, NoSigchld) {
713   had_signal.clear();
714   sighandler_t original = signal(SIGCHLD, handle_signal);
715   TerminateChild();
716   int rc = 0;
717   // Can waitpid() for the specific pid of the pdfork()ed child.
718   EXPECT_EQ(pid_, waitpid(pid_, &rc, __WALL));
719   EXPECT_TRUE(WIFEXITED(rc)) << "0x" << std::hex << rc;
720   EXPECT_FALSE(had_signal[SIGCHLD]);
721   signal(SIGCHLD, original);
722 }
723 
724 // The exit of a pdfork()ed process whose process descriptors have
725 // all been closed should generate SIGCHLD.  The child process needs
726 // PD_DAEMON to survive the closure of the process descriptors.
727 TEST_F(PipePdforkDaemon, NoPDSigchld) {
728   had_signal.clear();
729   sighandler_t original = signal(SIGCHLD, handle_signal);
730 
731   EXPECT_OK(close(pd_));
732   TerminateChild();
733 #ifdef __FreeBSD__
734   EXPECT_EQ(-1, waitpid(pid_, NULL, __WALL));
735   EXPECT_EQ(errno, ECHILD);
736 #else
737   int rc = 0;
738   // Can waitpid() for the specific pid of the pdfork()ed child.
739   EXPECT_EQ(pid_, waitpid(pid_, &rc, __WALL));
740   EXPECT_TRUE(WIFEXITED(rc)) << "0x" << std::hex << rc;
741 #endif
742   EXPECT_FALSE(had_signal[SIGCHLD]);
743   signal(SIGCHLD, original);
744 }
745 
746 #ifdef HAVE_PROCDESC_FSTAT
747 TEST_F(PipePdfork, ModeBits) {
748   // Owner rwx bits indicate liveness of child
749   struct stat stat;
750   memset(&stat, 0, sizeof(stat));
751   EXPECT_OK(fstat(pd_, &stat));
752   if (verbose) print_stat(stderr, &stat);
753   EXPECT_EQ(S_IRWXU, (long)(stat.st_mode & S_IRWXU));
754 
755   TerminateChild();
756   usleep(100000);
757 
758   memset(&stat, 0, sizeof(stat));
759   EXPECT_OK(fstat(pd_, &stat));
760   if (verbose) print_stat(stderr, &stat);
761   EXPECT_EQ(0, (int)(stat.st_mode & S_IRWXU));
762 }
763 #endif
764 
765 TEST_F(PipePdfork, WildcardWait) {
766   TEST_SKIPPED("https://bugs.freebsd.org/244165");
767   // TODO(FreeBSD): make wildcard wait ignore pdfork()ed children
768   // https://bugs.freebsd.org/201054
769   TerminateChild();
770   sleep(1);  // Ensure child is truly dead.
771 
772   // Wildcard waitpid(-1) should not see the pdfork()ed child because
773   // there is still a process descriptor for it.
774   int rc;
775   EXPECT_EQ(-1, waitpid(-1, &rc, WNOHANG));
776   EXPECT_EQ(ECHILD, errno);
777 
778   EXPECT_OK(close(pd_));
779   pd_ = -1;
780 }
781 
782 FORK_TEST(Pdfork, Pdkill) {
783   had_signal.clear();
784   int pd;
785   pid_t pid = pdfork(&pd, 0);
786   EXPECT_OK(pid);
787 
788   if (pid == 0) {
789     // Child: set a SIGINT handler and sleep.
790     had_signal.clear();
791     signal(SIGINT, handle_signal);
792     if (verbose) fprintf(stderr, "[%d] child about to sleep(10)\n", getpid_());
793     int left = sleep(10);
794     if (verbose) fprintf(stderr, "[%d] child slept, %d sec left, had[SIGINT]=%d\n",
795                          getpid_(), left, had_signal[SIGINT]);
796     // Expect this sleep to be interrupted by the signal (and so left > 0).
797     exit(left == 0);
798   }
799 
800   // Parent: get child's PID.
801   pid_t pd_pid;
802   EXPECT_OK(pdgetpid(pd, &pd_pid));
803   EXPECT_EQ(pid, pd_pid);
804 
805   // Interrupt the child after a second.
806   sleep(1);
807   EXPECT_OK(pdkill(pd, SIGINT));
808 
809   // Make sure the child finished properly (caught signal then exited).
810   CheckChildFinished(pid);
811 }
812 
813 FORK_TEST(Pdfork, PdkillSignal) {
814   int pd;
815   pid_t pid = pdfork(&pd, 0);
816   EXPECT_OK(pid);
817 
818   if (pid == 0) {
819     // Child: sleep.  No SIGINT handler.
820     if (verbose) fprintf(stderr, "[%d] child about to sleep(10)\n", getpid_());
821     int left = sleep(10);
822     if (verbose) fprintf(stderr, "[%d] child slept, %d sec left\n", getpid_(), left);
823     exit(99);
824   }
825 
826   // Kill the child (as it doesn't handle SIGINT).
827   sleep(1);
828   EXPECT_OK(pdkill(pd, SIGINT));
829 
830   // Make sure the child finished properly (terminated by signal).
831   CheckChildFinished(pid, true);
832 }
833 
834 //------------------------------------------------
835 // Test interactions with other parts of Capsicum:
836 //  - capability mode
837 //  - capabilities
838 
839 FORK_TEST(Pdfork, DaemonUnrestricted) {
840   EXPECT_OK(cap_enter());
841   int fd;
842 
843   // Capability mode leaves pdfork() available, with and without flag.
844   int rc;
845   rc = pdfork(&fd, PD_DAEMON);
846   EXPECT_OK(rc);
847   if (rc == 0) {
848     // Child: immediately terminate.
849     exit(0);
850   }
851 
852   rc = pdfork(&fd, 0);
853   EXPECT_OK(rc);
854   if (rc == 0) {
855     // Child: immediately terminate.
856     exit(0);
857   }
858 }
859 
860 TEST(Pdfork, MissingRights) {
861   pid_t parent = getpid_();
862   int pd = -1;
863   pid_t pid = pdfork(&pd, 0);
864   EXPECT_OK(pid);
865   if (pid == 0) {
866     // Child: loop forever.
867     EXPECT_NE(parent, getpid_());
868     while (true) sleep(1);
869   }
870   // Create two capabilities from the process descriptor.
871   cap_rights_t r_ro;
872   cap_rights_init(&r_ro, CAP_READ, CAP_LOOKUP);
873   int cap_incapable = dup(pd);
874   EXPECT_OK(cap_incapable);
875   EXPECT_OK(cap_rights_limit(cap_incapable, &r_ro));
876   cap_rights_t r_pdall;
877   cap_rights_init(&r_pdall, CAP_PDGETPID, CAP_PDWAIT, CAP_PDKILL);
878   int cap_capable = dup(pd);
879   EXPECT_OK(cap_capable);
880   EXPECT_OK(cap_rights_limit(cap_capable, &r_pdall));
881 
882   pid_t other_pid;
883   EXPECT_NOTCAPABLE(pdgetpid(cap_incapable, &other_pid));
884   EXPECT_NOTCAPABLE(pdkill(cap_incapable, SIGINT));
885   int status;
886   EXPECT_NOTCAPABLE(pdwait4_(cap_incapable, &status, 0, NULL));
887 
888   EXPECT_OK(pdgetpid(cap_capable, &other_pid));
889   EXPECT_EQ(pid, other_pid);
890   EXPECT_OK(pdkill(cap_capable, SIGINT));
891   int rc = pdwait4_(pd, &status, 0, NULL);
892   EXPECT_OK(rc);
893   EXPECT_EQ(pid, rc);
894 }
895 
896 
897 //------------------------------------------------
898 // Passing process descriptors between processes.
899 
900 TEST_F(PipePdfork, PassProcessDescriptor) {
901   int sock_fds[2];
902   EXPECT_OK(socketpair(AF_UNIX, SOCK_STREAM, 0, sock_fds));
903 
904   struct msghdr mh;
905   mh.msg_name = NULL;  // No address needed
906   mh.msg_namelen = 0;
907   char buffer1[1024];
908   struct iovec iov[1];
909   iov[0].iov_base = buffer1;
910   iov[0].iov_len = sizeof(buffer1);
911   mh.msg_iov = iov;
912   mh.msg_iovlen = 1;
913   char buffer2[1024];
914   mh.msg_control = buffer2;
915   mh.msg_controllen = sizeof(buffer2);
916   struct cmsghdr *cmptr;
917 
918   if (verbose) fprintf(stderr, "[%d] about to fork()\n", getpid_());
919   pid_t child2 = fork();
920   if (child2 == 0) {
921     // Child: close our copy of the original process descriptor.
922     close(pd_);
923 
924     // Child: wait to receive process descriptor over socket
925     if (verbose) fprintf(stderr, "  [%d] child of %d waiting for process descriptor on socket\n", getpid_(), getppid());
926     int rc = recvmsg(sock_fds[0], &mh, 0);
927     EXPECT_OK(rc);
928     EXPECT_LE(CMSG_LEN(sizeof(int)), mh.msg_controllen);
929     cmptr = CMSG_FIRSTHDR(&mh);
930     int pd = *(int*)CMSG_DATA(cmptr);
931     EXPECT_EQ(CMSG_LEN(sizeof(int)), cmptr->cmsg_len);
932     cmptr = CMSG_NXTHDR(&mh, cmptr);
933     EXPECT_TRUE(cmptr == NULL);
934     if (verbose) fprintf(stderr, "  [%d] got process descriptor %d on socket\n", getpid_(), pd);
935 
936     // Child: confirm we can do pd*() operations on the process descriptor
937     pid_t other;
938     EXPECT_OK(pdgetpid(pd, &other));
939     if (verbose) fprintf(stderr, "  [%d] process descriptor %d is pid %d\n", getpid_(), pd, other);
940 
941     sleep(2);
942     if (verbose) fprintf(stderr, "  [%d] close process descriptor %d\n", getpid_(), pd);
943     close(pd);
944 
945     // Last process descriptor closed, expect death
946     EXPECT_PID_DEAD(other);
947 
948     exit(HasFailure());
949   }
950   usleep(1000);  // Ensure subprocess runs
951 
952   // Send the process descriptor over the pipe to the sub-process
953   mh.msg_controllen = CMSG_LEN(sizeof(int));
954   cmptr = CMSG_FIRSTHDR(&mh);
955   cmptr->cmsg_level = SOL_SOCKET;
956   cmptr->cmsg_type = SCM_RIGHTS;
957   cmptr->cmsg_len = CMSG_LEN(sizeof(int));
958   *(int *)CMSG_DATA(cmptr) = pd_;
959   buffer1[0] = 0;
960   iov[0].iov_len = 1;
961   sleep(1);
962   if (verbose) fprintf(stderr, "[%d] send process descriptor %d on socket\n", getpid_(), pd_);
963   int rc = sendmsg(sock_fds[1], &mh, 0);
964   EXPECT_OK(rc);
965 
966   if (verbose) fprintf(stderr, "[%d] close process descriptor %d\n", getpid_(), pd_);
967   close(pd_);  // Not last open process descriptor
968 
969   // wait for child2
970   int status;
971   EXPECT_EQ(child2, waitpid(child2, &status, __WALL));
972   rc = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
973   EXPECT_EQ(0, rc);
974 
975   // confirm death all round
976   EXPECT_PID_DEAD(child2);
977   EXPECT_PID_DEAD(pid_);
978 }
979