bool sb_mkdirat_pre_check(const char *func, const char *pathname, int dirfd) { char canonic[SB_PATH_MAX]; save_errno(); /* XXX: need to check pathname with dirfd */ if (-1 == canonicalize(pathname, canonic)) /* see comments in check_syscall() */ if (ENAMETOOLONG != errno) { if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s) @ canonicalize: %s\n", func, pathname, strerror(errno)); return false; } /* XXX: Hack to prevent errors if the directory exist, and are * not writable - we rather return EEXIST than fail. This can * occur if doing something like `mkdir -p /`. We certainly do * not want to pass this attempt up to the higher levels as those * will trigger a sandbox violation. */ struct stat st; if (0 == lstat(canonic, &st)) { if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s[%s]) @ lstat: %s\n", func, pathname, canonic, strerror(errno)); errno = EEXIST; return false; } restore_errno(); return true; }
static inline bool PRE_CHECK_FUNC(WRAPPER_NAME)(_WRAPPER_ARGS_PROTO) { if (!(flags & O_CREAT)) { /* If we're not trying to create, fail normally if * file does not stat */ #if USE_AT if (dirfd == AT_FDCWD || pathname[0] == '/') #endif #undef USE_AT { struct stat st; save_errno(); if (-1 == stat(pathname, &st)) { if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s): %s\n", STRING_NAME, pathname, strerror(errno)); return false; } restore_errno(); } } return true; }
static inline bool sb_unlinkat_pre_check(WRAPPER_ARGS_PROTO) { char canonic[SB_PATH_MAX]; save_errno(); if (-1 == canonicalize(pathname, canonic)) /* see comments in check_syscall() */ if (ENAMETOOLONG != errno) goto error; /* XXX: Hack to make sure sandboxed process cannot remove * a device node, bug #79836. */ if (0 == strcmp(canonic, "/dev/null") || 0 == strcmp(canonic, "/dev/zero")) { errno = EACCES; goto error; } restore_errno(); return true; error: if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s): %s\n", STRING_NAME, pathname, strerror(errno)); return false; }
bool sb_unlinkat_pre_check(const char *func, const char *pathname, int dirfd) { char canonic[SB_PATH_MAX]; save_errno(); /* XXX: need to check pathname with dirfd */ if (-1 == canonicalize(pathname, canonic)) /* see comments in check_syscall() */ if (ENAMETOOLONG != errno) goto error; /* XXX: Hack to make sure sandboxed process cannot remove * a device node, bug #79836. */ if (0 == strcmp(canonic, "/dev/null") || 0 == strcmp(canonic, "/dev/zero")) { errno = EACCES; goto error; } restore_errno(); return true; error: if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s): %s\n", func, pathname, strerror(errno)); return false; }
bool sb_fopen_pre_check(const char *func, const char *pathname, const char *mode) { if ((NULL != mode) && (mode[0] == 'r')) { save_errno(); /* If we're trying to read, fail normally if file does not stat */ struct stat st; if (-1 == stat(pathname, &st)) { if (is_env_on(ENV_SANDBOX_DEBUG)) SB_EINFO("EARLY FAIL", " %s(%s): %s\n", func, pathname, strerror(errno)); return false; } restore_errno(); } return true; }