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