int NaClHostDescOpen(struct NaClHostDesc *d, char const *path, int flags, int mode) { int host_desc; struct stat stbuf; NaClLog(3, "NaClHostDescOpen(0x%08"NACL_PRIxPTR", %s, 0x%x, 0x%x)\n", (uintptr_t) d, path, flags, mode); if (NULL == d) { NaClLog(LOG_FATAL, "NaClHostDescOpen: 'this' is NULL\n"); } /* * Sanitize access flags. */ if (0 != (flags & ~NACL_ALLOWED_OPEN_FLAGS)) { return -NACL_ABI_EINVAL; } switch (flags & NACL_ABI_O_ACCMODE) { case NACL_ABI_O_RDONLY: case NACL_ABI_O_WRONLY: case NACL_ABI_O_RDWR: break; default: NaClLog(LOG_ERROR, "NaClHostDescOpen: bad access flags 0x%x.\n", flags); return -NACL_ABI_EINVAL; } flags = NaClMapOpenFlags(flags); mode = NaClMapOpenPerm(mode); NaClLog(3, "NaClHostDescOpen: invoking POSIX open(%s,0x%x,0%o)\n", path, flags, mode); host_desc = open(path, flags, mode); NaClLog(3, "NaClHostDescOpen: got descriptor %d\n", host_desc); if (-1 == host_desc) { NaClLog(LOG_ERROR, "NaClHostDescOpen: open returned -1, errno %d\n", errno); return -NaClXlateErrno(errno); } if (-1 == fstat(host_desc, &stbuf)) { NaClLog(LOG_ERROR, "NaClHostDescOpen: fstat failed?!? errno %d\n", errno); (void) close(host_desc); return -NaClXlateErrno(errno); } if (!S_ISREG(stbuf.st_mode)) { NaClLog(LOG_INFO, "NaClHostDescOpen: file type 0x%x, not regular\n", stbuf.st_mode); (void) close(host_desc); /* cannot access anything other than a real file */ return -NACL_ABI_EPERM; } // return NaClHostDescCtor(d, host_desc, NULL); /* d'b ### */ return NaClHostDescCtor(d, host_desc); }
int NaClHostDescOpen(struct NaClHostDesc *d, char const *path, int flags, int mode) { int host_desc; int posix_flags; NaClLog(3, "NaClHostDescOpen(0x%08"NACL_PRIxPTR", %s, 0x%x, 0x%x)\n", (uintptr_t) d, path, flags, mode); if (NULL == d) { NaClLog(LOG_FATAL, "NaClHostDescOpen: 'this' is NULL\n"); } /* * Sanitize access flags. */ if (0 != (flags & ~NACL_ALLOWED_OPEN_FLAGS)) { return -NACL_ABI_EINVAL; } switch (flags & NACL_ABI_O_ACCMODE) { case NACL_ABI_O_RDONLY: case NACL_ABI_O_WRONLY: case NACL_ABI_O_RDWR: break; default: NaClLog(LOG_ERROR, "NaClHostDescOpen: bad access flags 0x%x.\n", flags); return -NACL_ABI_EINVAL; } posix_flags = NaClMapOpenFlags(flags); #if NACL_LINUX posix_flags |= O_LARGEFILE; #endif mode = NaClMapOpenPerm(mode); NaClLog(3, "NaClHostDescOpen: invoking POSIX open(%s,0x%x,0%o)\n", path, posix_flags, mode); host_desc = open(path, posix_flags, mode); NaClLog(3, "NaClHostDescOpen: got descriptor %d\n", host_desc); if (-1 == host_desc) { NaClLog(2, "NaClHostDescOpen: open returned -1, errno %d\n", errno); return -NaClXlateErrno(errno); } return NaClHostDescCtor(d, host_desc, flags); }