Commit b979b669 authored by sbc's avatar sbc Committed by Commit bot

[NaCk SDK] nacl_io: Don't assume ~S_IFMT are the mode bits.

Define a new macro S_MODEBITS to represent the
mode bits settable by chmod/fchmod.

Add test to verify that file type cannot be changed
with chmod.

Review URL: https://codereview.chromium.org/671513002

Cr-Commit-Position: refs/heads/master@{#300341}
parent 3cfd0dca
...@@ -70,7 +70,7 @@ Error DirNode::GetDents(size_t offs, ...@@ -70,7 +70,7 @@ Error DirNode::GetDents(size_t offs,
Error DirNode::Fchmod(mode_t mode) { Error DirNode::Fchmod(mode_t mode) {
AUTO_LOCK(node_lock_); AUTO_LOCK(node_lock_);
SetMode(mode & ~S_IFMT); SetMode(mode);
return 0; return 0;
} }
......
...@@ -90,7 +90,7 @@ Error FuseFs::OpenWithMode(const Path& path, int open_flags, mode_t mode, ...@@ -90,7 +90,7 @@ Error FuseFs::OpenWithMode(const Path& path, int open_flags, mode_t mode,
if (result < 0) if (result < 0)
return -result; return -result;
if ((statbuf.st_mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(statbuf.st_mode)) {
// This is a directory. Don't try to open, just create a new node with // This is a directory. Don't try to open, just create a new node with
// this path. // this path.
ScopedNode node(new DirFuseFsNode(this, fuse_ops_, fi, path_cstr)); ScopedNode node(new DirFuseFsNode(this, fuse_ops_, fi, path_cstr));
...@@ -102,7 +102,7 @@ Error FuseFs::OpenWithMode(const Path& path, int open_flags, mode_t mode, ...@@ -102,7 +102,7 @@ Error FuseFs::OpenWithMode(const Path& path, int open_flags, mode_t mode,
return 0; return 0;
} }
// Get mode. // Get mode.
mode = statbuf.st_mode & ~S_IFMT; mode = statbuf.st_mode & S_MODEBITS;
} }
// Existing file. // Existing file.
...@@ -189,7 +189,7 @@ Error FuseFs::Remove(const Path& path) { ...@@ -189,7 +189,7 @@ Error FuseFs::Remove(const Path& path) {
node.reset(); node.reset();
if ((statbuf.st_mode & S_IFMT) == S_IFDIR) { if (S_ISDIR(statbuf.st_mode)) {
return Rmdir(path); return Rmdir(path);
} else { } else {
return Unlink(path); return Unlink(path);
......
...@@ -162,7 +162,7 @@ mode_t KernelObject::GetUmask() { ...@@ -162,7 +162,7 @@ mode_t KernelObject::GetUmask() {
mode_t KernelObject::SetUmask(mode_t newmask) { mode_t KernelObject::SetUmask(mode_t newmask) {
AUTO_LOCK(umask_lock_); AUTO_LOCK(umask_lock_);
mode_t oldmask = umask_; mode_t oldmask = umask_;
umask_ = newmask & 0777; umask_ = newmask & S_MODEBITS;
return oldmask; return oldmask;
} }
......
...@@ -209,7 +209,7 @@ int KernelProxy::open_resource(const char* path) { ...@@ -209,7 +209,7 @@ int KernelProxy::open_resource(const char* path) {
int KernelProxy::open(const char* path, int open_flags, mode_t mode) { int KernelProxy::open(const char* path, int open_flags, mode_t mode) {
ScopedFilesystem fs; ScopedFilesystem fs;
ScopedNode node; ScopedNode node;
mode_t mask = ~GetUmask(); mode_t mask = ~GetUmask() & S_MODEBITS;
Error error = AcquireFsAndNode(path, open_flags, mode & mask, &fs, &node); Error error = AcquireFsAndNode(path, open_flags, mode & mask, &fs, &node);
if (error) { if (error) {
...@@ -372,7 +372,8 @@ int KernelProxy::mkdir(const char* path, mode_t mode) { ...@@ -372,7 +372,8 @@ int KernelProxy::mkdir(const char* path, mode_t mode) {
return -1; return -1;
} }
error = fs->Mkdir(rel, mode & ~GetUmask()); mode_t mask = ~GetUmask() & S_MODEBITS;
error = fs->Mkdir(rel, mode & mask);
if (error) { if (error) {
errno = error; errno = error;
return -1; return -1;
...@@ -878,7 +879,7 @@ int KernelProxy::fchmod(int fd, mode_t mode) { ...@@ -878,7 +879,7 @@ int KernelProxy::fchmod(int fd, mode_t mode) {
return -1; return -1;
} }
error = handle->node()->Fchmod(mode); error = handle->node()->Fchmod(mode & S_MODEBITS);
if (error) { if (error) {
errno = error; errno = error;
return -1; return -1;
...@@ -1189,7 +1190,7 @@ int KernelProxy::sigaction(int signum, ...@@ -1189,7 +1190,7 @@ int KernelProxy::sigaction(int signum,
} }
mode_t KernelProxy::umask(mode_t mask) { mode_t KernelProxy::umask(mode_t mask) {
return SetUmask(mask); return SetUmask(mask & S_MODEBITS);
} }
#ifdef PROVIDES_SOCKET_API #ifdef PROVIDES_SOCKET_API
......
...@@ -135,7 +135,7 @@ Error MemFsNode::Futimens(const struct timespec times[2]) { ...@@ -135,7 +135,7 @@ Error MemFsNode::Futimens(const struct timespec times[2]) {
Error MemFsNode::Fchmod(mode_t mode) { Error MemFsNode::Fchmod(mode_t mode) {
AUTO_LOCK(node_lock_); AUTO_LOCK(node_lock_);
SetMode(mode & ~S_IFMT); SetMode(mode);
return 0; return 0;
} }
......
...@@ -189,7 +189,7 @@ int Node::GetLinks() { ...@@ -189,7 +189,7 @@ int Node::GetLinks() {
} }
int Node::GetMode() { int Node::GetMode() {
return stat_.st_mode & ~S_IFMT; return stat_.st_mode & S_MODEBITS;
} }
Error Node::GetSize(off_t* out_size) { Error Node::GetSize(off_t* out_size) {
...@@ -208,8 +208,8 @@ void Node::SetType(int type) { ...@@ -208,8 +208,8 @@ void Node::SetType(int type) {
} }
void Node::SetMode(int mode) { void Node::SetMode(int mode) {
assert((mode & S_IFMT) == 0); assert((mode & ~S_MODEBITS) == 0);
stat_.st_mode &= S_IFMT; stat_.st_mode &= ~S_MODEBITS;
stat_.st_mode |= mode; stat_.st_mode |= mode;
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#define S_IRALL (S_IRUSR | S_IRGRP | S_IROTH) #define S_IRALL (S_IRUSR | S_IRGRP | S_IROTH)
#define S_IWALL (S_IWUSR | S_IWGRP | S_IWOTH) #define S_IWALL (S_IWUSR | S_IWGRP | S_IWOTH)
#define S_IXALL (S_IXUSR | S_IXGRP | S_IXOTH) #define S_IXALL (S_IXUSR | S_IXGRP | S_IXOTH)
#define S_MODEBITS 07777
namespace nacl_io { namespace nacl_io {
......
...@@ -289,8 +289,8 @@ TEST_F(FuseFsTest, CreateWithMode) { ...@@ -289,8 +289,8 @@ TEST_F(FuseFsTest, CreateWithMode) {
ASSERT_EQ(0, fs_.OpenWithMode(Path("/hello"), ASSERT_EQ(0, fs_.OpenWithMode(Path("/hello"),
O_RDWR | O_CREAT, 0723, &node)); O_RDWR | O_CREAT, 0723, &node));
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFREG, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISREG(statbuf.st_mode));
EXPECT_EQ(0723, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0723, statbuf.st_mode & S_MODEBITS);
} }
TEST_F(FuseFsTest, CreateAndWrite) { TEST_F(FuseFsTest, CreateAndWrite) {
...@@ -317,20 +317,20 @@ TEST_F(FuseFsTest, GetStat) { ...@@ -317,20 +317,20 @@ TEST_F(FuseFsTest, GetStat) {
ASSERT_EQ(0, fs_.Open(Path("/hello"), O_RDONLY, &node)); ASSERT_EQ(0, fs_.Open(Path("/hello"), O_RDONLY, &node));
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFREG, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISREG(statbuf.st_mode));
EXPECT_EQ(0666, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0666, statbuf.st_mode & S_MODEBITS);
EXPECT_EQ(strlen(hello_world), statbuf.st_size); EXPECT_EQ(strlen(hello_world), statbuf.st_size);
ASSERT_EQ(0, fs_.Open(Path("/"), O_RDONLY, &node)); ASSERT_EQ(0, fs_.Open(Path("/"), O_RDONLY, &node));
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFDIR, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISDIR(statbuf.st_mode));
EXPECT_EQ(0755, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0755, statbuf.st_mode & S_MODEBITS);
// Create a file and stat. // Create a file and stat.
ASSERT_EQ(0, fs_.Open(Path("/foobar"), O_RDWR | O_CREAT, &node)); ASSERT_EQ(0, fs_.Open(Path("/foobar"), O_RDWR | O_CREAT, &node));
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFREG, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISREG(statbuf.st_mode));
EXPECT_EQ(0666, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0666, statbuf.st_mode & S_MODEBITS);
EXPECT_EQ(0, statbuf.st_size); EXPECT_EQ(0, statbuf.st_size);
} }
...@@ -394,12 +394,12 @@ TEST_F(FuseFsTest, Fchmod) { ...@@ -394,12 +394,12 @@ TEST_F(FuseFsTest, Fchmod) {
ASSERT_EQ(0, fs_.Open(Path("/hello"), O_RDONLY, &node)); ASSERT_EQ(0, fs_.Open(Path("/hello"), O_RDONLY, &node));
ASSERT_EQ(0, node->GetStat(&statbuf)); ASSERT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(0666, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0666, statbuf.st_mode & S_MODEBITS);
ASSERT_EQ(0, node->Fchmod(0777)); ASSERT_EQ(0, node->Fchmod(0777));
ASSERT_EQ(0, node->GetStat(&statbuf)); ASSERT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(0777, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(0777, statbuf.st_mode & S_MODEBITS);
} }
namespace { namespace {
......
...@@ -184,7 +184,7 @@ TEST_F(Html5FsTest, Mkdir) { ...@@ -184,7 +184,7 @@ TEST_F(Html5FsTest, Mkdir) {
ScopedNode node; ScopedNode node;
ASSERT_EQ(0, fs->Open(path, O_RDONLY, &node)); ASSERT_EQ(0, fs->Open(path, O_RDONLY, &node));
EXPECT_EQ(0, node->GetStat(&stat)); EXPECT_EQ(0, node->GetStat(&stat));
EXPECT_EQ(S_IFDIR, stat.st_mode & S_IFDIR); EXPECT_TRUE(S_ISDIR(stat.st_mode));
} }
TEST_F(Html5FsTest, Remove) { TEST_F(Html5FsTest, Remove) {
...@@ -388,8 +388,8 @@ TEST_F(Html5FsTest, GetStat) { ...@@ -388,8 +388,8 @@ TEST_F(Html5FsTest, GetStat) {
struct stat statbuf; struct stat statbuf;
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFREG, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISREG(statbuf.st_mode));
EXPECT_EQ(S_IRALL | S_IWALL | S_IXALL, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(S_IRALL | S_IWALL | S_IXALL, statbuf.st_mode & S_MODEBITS);
EXPECT_EQ(strlen(contents), statbuf.st_size); EXPECT_EQ(strlen(contents), statbuf.st_size);
EXPECT_EQ(access_time, statbuf.st_atime); EXPECT_EQ(access_time, statbuf.st_atime);
EXPECT_EQ(creation_time, statbuf.st_ctime); EXPECT_EQ(creation_time, statbuf.st_ctime);
...@@ -406,8 +406,8 @@ TEST_F(Html5FsTest, GetStat) { ...@@ -406,8 +406,8 @@ TEST_F(Html5FsTest, GetStat) {
// GetStat on a directory... // GetStat on a directory...
EXPECT_EQ(0, fs->Open(Path("/dir"), O_RDONLY, &node)); EXPECT_EQ(0, fs->Open(Path("/dir"), O_RDONLY, &node));
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFDIR, statbuf.st_mode & S_IFMT); EXPECT_TRUE(S_ISDIR(statbuf.st_mode));
EXPECT_EQ(S_IRALL | S_IWALL | S_IXALL, statbuf.st_mode & ~S_IFMT); EXPECT_EQ(S_IRALL | S_IWALL | S_IXALL, statbuf.st_mode & S_MODEBITS);
EXPECT_EQ(0, statbuf.st_size); EXPECT_EQ(0, statbuf.st_size);
EXPECT_EQ(access_time, statbuf.st_atime); EXPECT_EQ(access_time, statbuf.st_atime);
EXPECT_EQ(creation_time, statbuf.st_ctime); EXPECT_EQ(creation_time, statbuf.st_ctime);
......
...@@ -243,7 +243,8 @@ TEST_P(HttpFsLargeFileTest, GetStat) { ...@@ -243,7 +243,8 @@ TEST_P(HttpFsLargeFileTest, GetStat) {
struct stat statbuf; struct stat statbuf;
EXPECT_EQ(0, node->GetStat(&statbuf)); EXPECT_EQ(0, node->GetStat(&statbuf));
EXPECT_EQ(S_IFREG | S_IRUSR | S_IRGRP | S_IROTH, statbuf.st_mode); EXPECT_TRUE(S_ISREG(statbuf.st_mode));
EXPECT_EQ(S_IRUSR | S_IRGRP | S_IROTH, statbuf.st_mode & S_MODEBITS);
EXPECT_EQ(size, statbuf.st_size); EXPECT_EQ(size, statbuf.st_size);
// These are not currently set. // These are not currently set.
EXPECT_EQ(0, statbuf.st_atime); EXPECT_EQ(0, statbuf.st_atime);
......
...@@ -567,7 +567,7 @@ TEST_F(KernelProxyTest, OpenWithMode) { ...@@ -567,7 +567,7 @@ TEST_F(KernelProxyTest, OpenWithMode) {
struct stat buf; struct stat buf;
EXPECT_EQ(0, ki_lstat("/foo", &buf)); EXPECT_EQ(0, ki_lstat("/foo", &buf));
EXPECT_EQ(0723, buf.st_mode & ~S_IFMT); EXPECT_EQ(0723, buf.st_mode & 0777);
} }
TEST_F(KernelProxyTest, CreateWronlyWithReadOnlyMode) { TEST_F(KernelProxyTest, CreateWronlyWithReadOnlyMode) {
...@@ -663,10 +663,10 @@ TEST_F(KernelProxyTest, Umask) { ...@@ -663,10 +663,10 @@ TEST_F(KernelProxyTest, Umask) {
struct stat buf; struct stat buf;
EXPECT_EQ(0, ki_stat("/foo", &buf)); EXPECT_EQ(0, ki_stat("/foo", &buf));
EXPECT_EQ(0444, buf.st_mode & ~S_IFMT); EXPECT_EQ(0444, buf.st_mode & 0777);
EXPECT_EQ(0, ki_stat("/dir", &buf)); EXPECT_EQ(0, ki_stat("/dir", &buf));
EXPECT_EQ(0555, buf.st_mode & ~S_IFMT); EXPECT_EQ(0555, buf.st_mode & 0777);
EXPECT_EQ(0222, ki_umask(0)); EXPECT_EQ(0222, ki_umask(0));
} }
......
...@@ -137,7 +137,8 @@ TEST(MemFsNodeTest, Fchmod) { ...@@ -137,7 +137,8 @@ TEST(MemFsNodeTest, Fchmod) {
struct stat s; struct stat s;
ASSERT_EQ(0, file.GetStat(&s)); ASSERT_EQ(0, file.GetStat(&s));
EXPECT_EQ(S_IFREG | S_IRALL | S_IWALL, s.st_mode); EXPECT_TRUE(S_ISREG(s.st_mode));
EXPECT_EQ(S_IRALL | S_IWALL, s.st_mode & S_MODEBITS);
// Change to read-only. // Change to read-only.
EXPECT_EQ(0, file.Fchmod(S_IRALL)); EXPECT_EQ(0, file.Fchmod(S_IRALL));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment