Index: native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc |
index 89c8e36db7c341a23eb96d91b6443092d7851d67..db6f42baa2a9a82961bba9116b94bb52cfeaa7fe 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/kernel_proxy.cc |
@@ -209,7 +209,7 @@ int KernelProxy::open_resource(const char* path) { |
int KernelProxy::open(const char* path, int open_flags, mode_t mode) { |
ScopedFilesystem fs; |
ScopedNode node; |
- mode_t mask = ~GetUmask(); |
+ mode_t mask = ~GetUmask() & 0777; |
Error error = AcquireFsAndNode(path, open_flags, mode & mask, &fs, &node); |
if (error) { |
@@ -372,7 +372,8 @@ int KernelProxy::mkdir(const char* path, mode_t mode) { |
return -1; |
} |
- error = fs->Mkdir(rel, mode & ~GetUmask()); |
+ mode_t mask = ~GetUmask() & 0777; |
+ error = fs->Mkdir(rel, mode & mask); |
if (error) { |
errno = error; |
return -1; |
@@ -792,6 +793,11 @@ int KernelProxy::truncate(const char* path, off_t len) { |
return -1; |
} |
+ // Directories cannot be truncated. |
+ if (node->IsaDir()) { |
+ return EISDIR; |
+ } |
+ |
if (!node->CanOpen(O_WRONLY)) { |
errno = EACCES; |
return -1; |
@@ -873,7 +879,7 @@ int KernelProxy::fchmod(int fd, mode_t mode) { |
return -1; |
} |
- error = handle->node()->Fchmod(mode); |
+ error = handle->node()->Fchmod(mode & 0777); |
if (error) { |
errno = error; |
return -1; |
@@ -1184,7 +1190,7 @@ int KernelProxy::sigaction(int signum, |
} |
mode_t KernelProxy::umask(mode_t mask) { |
- return SetUmask(mask); |
+ return SetUmask(mask & 0777); |
} |
#ifdef PROVIDES_SOCKET_API |