int32_t NaClSysLstat(struct NaClAppThread *natp, uint32_t pathname, uint32_t nasp) { struct NaClApp *nap = natp->nap; int32_t retval = -NACL_ABI_EINVAL; char path[NACL_CONFIG_PATH_MAX]; nacl_host_stat_t stbuf; NaClLog(3, ("Entered NaClSysLstat(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIx32"," " 0x%08"NACL_PRIx32")\n"), (uintptr_t) natp, pathname, nasp); if (!NaClAclBypassChecks) { return -NACL_ABI_EACCES; } retval = CopyPathFromUser(nap, path, sizeof path, pathname); if (0 != retval) return retval; /* * Perform a host stat. */ retval = NaClHostDescLstat(path, &stbuf); if (0 == retval) { struct nacl_abi_stat abi_stbuf; retval = NaClAbiStatHostDescStatXlateCtor(&abi_stbuf, &stbuf); if (!NaClCopyOutToUser(nap, nasp, &abi_stbuf, sizeof abi_stbuf)) { return -NACL_ABI_EFAULT; } } return retval; }
static int NaClDescIoDescFstat(struct NaClDesc *vself, struct nacl_abi_stat *statbuf) { struct NaClDescIoDesc *self = (struct NaClDescIoDesc *) vself; int rv; nacl_host_stat_t hstatbuf; rv = NaClHostDescFstat(self->hd, &hstatbuf); if (0 != rv) { return rv; } return NaClAbiStatHostDescStatXlateCtor(statbuf, &hstatbuf); }
int32_t NaClSysStat(struct NaClAppThread *natp, const char *pathname, struct nacl_abi_stat *buf) { struct NaClApp *nap = natp->nap; int32_t retval = -NACL_ABI_EINVAL; char path[NACL_CONFIG_PATH_MAX]; nacl_host_stat_t stbuf; NaClLog(3, ("Entered NaClSysStat(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR"," " 0x%08"NACL_PRIxPTR")\n"), (uintptr_t) natp, (uintptr_t) pathname, (uintptr_t) buf); retval = CopyPathFromUser(nap, path, sizeof path, (uintptr_t) pathname); if (0 != retval) goto cleanup; retval = NaClStatAclCheck(nap, path); if (0 != retval) goto cleanup; /* * Perform a host stat. */ retval = NaClHostDescStat(path, &stbuf); if (0 == retval) { struct nacl_abi_stat abi_stbuf; retval = NaClAbiStatHostDescStatXlateCtor(&abi_stbuf, &stbuf); if (!NaClCopyOutToUser(nap, (uintptr_t) buf, &abi_stbuf, sizeof abi_stbuf)) { retval = -NACL_ABI_EFAULT; } } cleanup: return retval; }