main.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "common.h"
  2. #include "sandbox.h"
  3. #include <sys/stat.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. /*
  7. _assertNotNull(a);
  8. _assertEqual(sllist_count(a), 0);
  9. */
  10. int fakeread(int fd, char *buf, int buflen, struct s_sandboxenv *env)
  11. {
  12. #ifdef __x86_64__
  13. env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_read;
  14. env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) fd;
  15. env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) buf;
  16. env->syscall_args[2] = env->registers.rdx = (REGISTER_TYPE) buflen;
  17. #else
  18. # error "non-x86 unsupported"
  19. #endif
  20. ovr_read(env);
  21. return fd;
  22. }
  23. int fakelseek(int fd, off_t offset, int whence, struct s_sandboxenv *env)
  24. {
  25. #ifdef __x86_64__
  26. env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_lseek;
  27. env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) fd;
  28. env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) offset;
  29. env->syscall_args[2] = env->registers.rdx = (REGISTER_TYPE) whence;
  30. #else
  31. # error "non-x86 unsupported"
  32. #endif
  33. ovr_lseek(env);
  34. return fd;
  35. }
  36. int fakeopen(const char *path, int flags, int mod, struct s_sandboxenv *env)
  37. {
  38. int fd;
  39. #ifdef __x86_64__
  40. env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_open;
  41. env->syscall_no.syscall_return = fd = open(path, flags, mod);
  42. env->syscall_args[0] = env->registers.rdi = (REGISTER_TYPE) path;
  43. env->syscall_args[1] = env->registers.rsi = flags;
  44. env->syscall_args[2] = env->registers.rdx = mod;
  45. #else
  46. # error "non-x86 unsupported"
  47. #endif
  48. ovr_open(env);
  49. return fd;
  50. }
  51. int fakeclose(int fd, struct s_sandboxenv *env)
  52. {
  53. #ifdef __x86_64__
  54. env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_close;
  55. env->syscall_args[0] = env->registers.rdi = fd;
  56. #else
  57. # error "non-x86 unsupported"
  58. #endif
  59. ovr_close(env);
  60. return fd;
  61. }
  62. int fakewrite(int fd, char *buf, int len, struct s_sandboxenv *env)
  63. {
  64. #ifdef __x86_64__
  65. env->syscall_no.syscall_no = env->registers.orig_rax = (REGISTER_TYPE) __NR_write;
  66. env->syscall_args[0] = env->registers.rdi = fd;
  67. env->syscall_args[1] = env->registers.rsi = (REGISTER_TYPE) buf;
  68. env->syscall_args[2] = env->registers.rdx = len;
  69. #else
  70. # error "non-x86 unsupported"
  71. #endif
  72. ovr_write(env);
  73. if (env->registers.orig_rax == __NR_write)
  74. env->registers.rax = write(fd, buf, len);
  75. return env->registers.rax;
  76. }
  77. int test_open(struct s_sandboxenv *env, int *final_fd)
  78. {
  79. t_fileinfo *fi;
  80. t_fd *fd_struct;
  81. close(open("_test", O_CREAT, 0644));
  82. _assertEqual(sllist_count(env->filetable), 0);
  83. int fd = fakeopen("_test", O_RDONLY, 0, env);
  84. _assertDiff(fd, -1);
  85. _assertEqual(env->syscall_no.syscall_return, fd);
  86. _assertEqual(sllist_count(env->filetable), 0);
  87. close(fd);
  88. fd = fakeopen("_test", O_WRONLY, 0646, env);
  89. _assertDiff(fd, -1);
  90. _assertEqual(env->syscall_no.syscall_return, fd);
  91. _assertEqual(sllist_count(env->filetable), 1);
  92. fi = (t_fileinfo *)sllist_at(env->filetable, 0);
  93. _assertEqual(sllist_count(fi->fds), 1);
  94. _assertTrue(fi->local_fd > 0);
  95. int fd2 = fakeopen("_test", O_RDONLY, 0, env);
  96. _assertTrue(fd2 > 0);
  97. _assertEqual(sllist_count(env->filetable), 1);
  98. _assertEqual(sllist_count(fi->fds), 2);
  99. fakeclose(fd2, env);
  100. _assertEqual(sllist_count(fi->fds), 1);
  101. fd_struct = sllist_at(fi->fds, 0);
  102. _assertNotNull(fd_struct);
  103. _assertEqual(fd_struct->fd, fd);
  104. _assertEqual(fd_struct->flags, O_WRONLY);
  105. _assertEqual(fd_struct->mod, 0646);
  106. *final_fd = fd;
  107. return 0;
  108. }
  109. int test_write(struct s_sandboxenv *env, int fd)
  110. {
  111. struct stat st;
  112. char buf[4];
  113. _assertEqual(fakewrite(fd, "test", 4, env), 4);
  114. _assertEqual(stat("_test", &st), 0);
  115. _assertEqual(st.st_size, 0);
  116. #warning TODO
  117. return 0;
  118. _assertEqual(fakelseek(fd, 0, SEEK_SET, env), 0);
  119. _assertEqual(fakeread(fd, buf, 4, env), 4);
  120. _assertEqual(strcmp(buf, "test"), 0);
  121. return 0;
  122. }
  123. int main()
  124. {
  125. int success = 1;
  126. struct s_sandboxenv env;
  127. int fd;
  128. t_param params;
  129. tests_init_env(&env, &params);
  130. success &= !test_open(&env, &fd);
  131. success &= !test_write(&env, fd);
  132. fakeclose(fd, &env);
  133. tests_release_env(&env, &params);
  134. unlink("_test");
  135. exit(success ? EXIT_SUCCESS: EXIT_FAILURE);
  136. }