/* A very basic decoder for execve(2) system call. */ static void decode_execve(pid_t pid, pink_bitness_t bitness) { bool nil; unsigned i; long arg; char buf[MAX_STRING_LEN]; const char *sep; if (!pink_decode_string(pid, bitness, 0, buf, MAX_STRING_LEN)) { perror("pink_decode_string"); return; } if (!pink_util_get_arg(pid, bitness, 1, &arg)) { perror("pink_util_get_arg"); return; } printf("execve(\"%s\", [", buf); for (i = 0, nil = false, sep = "";;sep = ", ") { if (!pink_decode_string_array_member(pid, bitness, arg, ++i, buf, MAX_STRING_LEN, &nil)) { perror("pink_decode_string_array_member"); return; } printf("%s\"%s\"", sep, buf); if (nil) { printf("], envp[])"); break; } } }
/* A very basic decoder for open(2) system call. */ static void decode_open(pid_t pid, pink_bitness_t bitness) { long flags; char buf[MAX_STRING_LEN]; if (!pink_decode_string(pid, bitness, 0, buf, MAX_STRING_LEN)) { perror("pink_decode_string"); return; } if (!pink_util_get_arg(pid, bitness, 1, &flags)) { perror("pink_util_get_arg"); return; } printf("open(\"%s\", ", buf); print_open_flags(flags); putchar(')'); }
int sys_linkat(pink_easy_process_t *current, const char *name) { int r; long flags; pid_t pid = pink_easy_process_get_pid(current); pink_bitness_t bit = pink_easy_process_get_bitness(current); proc_data_t *data = pink_easy_process_get_userdata(current); sys_info_t info; if (data->config.sandbox_write == SANDBOX_OFF) return 0; /* Check for AT_SYMLINK_FOLLOW */ if (!pink_util_get_arg(pid, bit, 4, &flags)) { if (errno != ESRCH) { warning("pink_util_get_arg(%lu, \"%s\", 4): %d(%s)", (unsigned long)pid, pink_bitness_name(bit), errno, strerror(errno)); return panic(current); } return PINK_EASY_CFLAG_DROP; } memset(&info, 0, sizeof(sys_info_t)); info.at = true; info.resolv = !!(flags & AT_SYMLINK_FOLLOW); info.index = 1; info.whitelisting = data->config.sandbox_write == SANDBOX_DENY; r = box_check_path(current, name, &info); if (!r && !data->deny) { info.create = MAY_CREATE; info.index = 3; return box_check_path(current, name, &info); } return r; }