| Index: src/trusted/service_runtime/sys_filename.c
|
| diff --git a/src/trusted/service_runtime/sys_filename.c b/src/trusted/service_runtime/sys_filename.c
|
| index d179b8b48d4f42adf4de99c4d36b25f3c5fde0df..37c699aeaab94c066027069403a04016361a0853 100644
|
| --- a/src/trusted/service_runtime/sys_filename.c
|
| +++ b/src/trusted/service_runtime/sys_filename.c
|
| @@ -339,3 +339,292 @@ int32_t NaClSysUnlink(struct NaClAppThread *natp,
|
| cleanup:
|
| return retval;
|
| }
|
| +
|
| +int32_t NaClSysTruncate(struct NaClAppThread *natp,
|
| + uint32_t pathname,
|
| + nacl_abi_off_t length) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char path[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysTruncate(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%"NACL_PRIx64")\n"),
|
| + (uintptr_t) natp, (uintptr_t) pathname, length);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, path, sizeof path, pathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescTruncate(path, length);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysLstat(struct NaClAppThread *natp,
|
| + uint32_t pathname,
|
| + struct nacl_abi_stat *buf) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char path[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| + nacl_host_stat_t stbuf;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysLstat(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;
|
| + }
|
| +
|
| + retval = NaClHostDescLstat(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;
|
| +}
|
| +
|
| +int32_t NaClSysLink(struct NaClAppThread *natp,
|
| + uint32_t oldpathname,
|
| + uint32_t newpathname) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char oldpath[NACL_CONFIG_PATH_MAX];
|
| + char newpath[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysLink(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%08"NACL_PRIxPTR")\n"),
|
| + (uintptr_t) natp, (uintptr_t) oldpathname, (uintptr_t) newpathname);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, oldpath, sizeof oldpath,
|
| + (uintptr_t) oldpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, newpath, sizeof newpath,
|
| + (uintptr_t) newpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescLink(oldpath, newpath);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysChmod(struct NaClAppThread *natp,
|
| + uint32_t pathname,
|
| + int mode) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char path[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysChmod(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%x)\n"),
|
| + (uintptr_t) natp, (uintptr_t) pathname, mode);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, path, sizeof path, (uintptr_t) pathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescChmod(path, mode);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysAccess(struct NaClAppThread *natp,
|
| + uint32_t pathname,
|
| + int mode) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char path[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysAccess(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " %d)\n"),
|
| + (uintptr_t) natp, (uintptr_t) pathname, mode);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, path, sizeof path, (uintptr_t) pathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescAccess(path, mode);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysRename(struct NaClAppThread *natp,
|
| + uint32_t oldpathname,
|
| + uint32_t newpathname) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char oldpath[NACL_CONFIG_PATH_MAX];
|
| + char newpath[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysRename(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%08"NACL_PRIxPTR")\n"),
|
| + (uintptr_t) natp, (uintptr_t) oldpathname, (uintptr_t) newpathname);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, oldpath, sizeof oldpath, oldpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, newpath, sizeof newpath, newpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescRename(oldpath, newpath);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysReadlink(struct NaClAppThread *natp,
|
| + uint32_t pathname,
|
| + uint32_t buf,
|
| + size_t bufsize) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char path[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| + char pathbuf[NACL_CONFIG_PATH_MAX];
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysReadlink(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%08"NACL_PRIxPTR", 0x%"NACL_PRIuS")\n"),
|
| + (uintptr_t) natp, (uintptr_t) pathname, (uintptr_t) buf, bufsize);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, path, sizeof path, (uintptr_t) pathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescReadlink(path, pathbuf, sizeof pathbuf);
|
| + NaClLog(4, "path %s, buf %s\n", path, pathbuf);
|
| + if (0 == retval) {
|
| + if (!NaClCopyOutToUser(nap, (uintptr_t) buf, &pathbuf, bufsize)) {
|
| + retval = -NACL_ABI_EFAULT;
|
| + }
|
| + }
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysSymlink(struct NaClAppThread *natp,
|
| + uint32_t oldpathname,
|
| + uint32_t newpathname) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char oldpath[NACL_CONFIG_PATH_MAX];
|
| + char newpath[NACL_CONFIG_PATH_MAX];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysSymlink(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%08"NACL_PRIxPTR")\n"),
|
| + (uintptr_t) natp, (uintptr_t) oldpathname, (uintptr_t) newpathname);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, oldpath, sizeof oldpath, oldpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, newpath, sizeof newpath, newpathname);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescSymlink(oldpath, newpath);
|
| +cleanup:
|
| + return retval;
|
| +}
|
| +
|
| +int32_t NaClSysUtimes(struct NaClAppThread *natp,
|
| + uint32_t path,
|
| + uint32_t times) {
|
| + struct NaClApp *nap = natp->nap;
|
| + char kern_path[NACL_CONFIG_PATH_MAX];
|
| + struct nacl_abi_timeval kern_times[2];
|
| + int32_t retval = -NACL_ABI_EINVAL;
|
| +
|
| + NaClLog(3,
|
| + ("Entered NaClSysUtimes(0x%08"NACL_PRIxPTR", 0x%08"NACL_PRIxPTR","
|
| + " 0x%08"NACL_PRIxPTR")\n"),
|
| + (uintptr_t) natp, (uintptr_t) path, (uintptr_t) times);
|
| +
|
| + if (!NaClAclBypassChecks) {
|
| + retval = -NACL_ABI_EACCES;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = CopyPathFromUser(nap, kern_path, sizeof kern_path, path);
|
| + if (0 != retval) {
|
| + goto cleanup;
|
| + }
|
| +
|
| + if (!NaClCopyInFromUser(nap, &kern_times, (uintptr_t) times,
|
| + sizeof kern_times)) {
|
| + retval = -NACL_ABI_EFAULT;
|
| + goto cleanup;
|
| + }
|
| +
|
| + retval = NaClHostDescUtimes(kern_path, kern_times);
|
| +cleanup:
|
| + return retval;
|
| +}
|
|
|