| 1 | // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s |
| 2 | |
| 3 | #include <sys/capsicum.h> |
| 4 | #include <sys/ioctl.h> |
| 5 | |
| 6 | #include <assert.h> |
| 7 | #include <errno.h> |
| 8 | #include <stdio.h> |
| 9 | #include <string.h> |
| 10 | #include <termios.h> |
| 11 | #include <unistd.h> |
| 12 | |
| 13 | void test_cap_ioctls() { |
| 14 | cap_rights_t rights; |
| 15 | unsigned long ncmds[] = {TIOCGETA, TIOCGWINSZ, FIODTYPE}; |
| 16 | unsigned long rcmds = 0; |
| 17 | cap_rights_t *rptr = cap_rights_init(&rights, CAP_IOCTL, CAP_READ); |
| 18 | assert(rptr); |
| 19 | |
| 20 | int rv = cap_rights_limit(STDIN_FILENO, &rights); |
| 21 | assert(rv == 0); |
| 22 | rv = cap_ioctls_limit(STDIN_FILENO, ncmds, 3); |
| 23 | assert(rv == 0); |
| 24 | ssize_t rz = cap_ioctls_get(STDIN_FILENO, &rcmds, 3); |
| 25 | assert(rz == 3); |
| 26 | printf(format: "ioctls test: %ld commands authorized\n" , rz); |
| 27 | } |
| 28 | |
| 29 | void test_cap_rights() { |
| 30 | cap_rights_t rights, little, remove, grights; |
| 31 | cap_rights_t *rptr = cap_rights_init(&rights, CAP_IOCTL, CAP_READ); |
| 32 | assert(rptr); |
| 33 | cap_rights_t *gptr = cap_rights_init(&remove, CAP_IOCTL); |
| 34 | assert(gptr); |
| 35 | cap_rights_t *sptr = cap_rights_init(&little, CAP_READ); |
| 36 | assert(sptr); |
| 37 | bool hasit = cap_rights_contains(rptr, sptr); |
| 38 | assert(hasit == true); |
| 39 | cap_rights_t *pptr = cap_rights_remove(&rights, gptr); |
| 40 | hasit = cap_rights_contains(pptr, sptr); |
| 41 | assert(hasit == true); |
| 42 | cap_rights_t *aptr = cap_rights_merge(&rights, gptr); |
| 43 | assert(aptr); |
| 44 | bool correct = cap_rights_is_valid(&rights); |
| 45 | assert(correct == true); |
| 46 | |
| 47 | int rv = cap_rights_limit(STDIN_FILENO, &rights); |
| 48 | assert(rv == 0); |
| 49 | rv = cap_rights_get(STDIN_FILENO, &grights); |
| 50 | assert(rv == 0); |
| 51 | assert(memcmp(&grights, &rights, sizeof(grights)) == 0); |
| 52 | cap_rights_t *iptr = cap_rights_set(&rights, CAP_IOCTL); |
| 53 | assert(iptr); |
| 54 | cap_rights_t *eptr = cap_rights_clear(&rights, CAP_READ); |
| 55 | assert(eptr); |
| 56 | hasit = cap_rights_is_set(&rights, CAP_IOCTL); |
| 57 | assert(hasit == true); |
| 58 | printf(format: "rights test: %d\n" , rv); |
| 59 | } |
| 60 | |
| 61 | int main(void) { |
| 62 | test_cap_ioctls(); |
| 63 | |
| 64 | test_cap_rights(); |
| 65 | |
| 66 | // CHECK: ioctls test: {{.*}} commands authorized |
| 67 | // CHECK: rights test: {{.*}} |
| 68 | } |
| 69 | |