1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 21:57:35 +00:00

Kernel: Use symbolic constants for file modes

This fixes a bug where the mode of a FIFO was reported as 001000 instead
of 0010000 (you see the difference? me nethier), and hopefully doesn't
introduce new bugs. I've left 0777 and similar in a few places, because
that is *more* readable than its symbolic version.
This commit is contained in:
Sergey Bugaev 2020-06-16 22:03:51 +03:00 committed by Andreas Kling
parent fd985b1f48
commit e0d0d52455
5 changed files with 52 additions and 30 deletions

View file

@ -78,12 +78,12 @@ KResult FileDescription::fstat(stat& buffer)
{ {
if (is_fifo()) { if (is_fifo()) {
memset(&buffer, 0, sizeof(buffer)); memset(&buffer, 0, sizeof(buffer));
buffer.st_mode = 001000; buffer.st_mode = S_IFIFO;
return KSuccess; return KSuccess;
} }
if (is_socket()) { if (is_socket()) {
memset(&buffer, 0, sizeof(buffer)); memset(&buffer, 0, sizeof(buffer));
buffer.st_mode = 0140000; buffer.st_mode = S_IFSOCK;
return KSuccess; return KSuccess;
} }

View file

@ -40,16 +40,16 @@ inline constexpr u32 encoded_device(unsigned major, unsigned minor)
return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12); return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
} }
inline bool is_directory(mode_t mode) { return (mode & 0170000) == 0040000; } inline bool is_directory(mode_t mode) { return (mode & S_IFMT) == S_IFDIR; }
inline bool is_character_device(mode_t mode) { return (mode & 0170000) == 0020000; } inline bool is_character_device(mode_t mode) { return (mode & S_IFMT) == S_IFCHR; }
inline bool is_block_device(mode_t mode) { return (mode & 0170000) == 0060000; } inline bool is_block_device(mode_t mode) { return (mode & S_IFMT) == S_IFBLK; }
inline bool is_regular_file(mode_t mode) { return (mode & 0170000) == 0100000; } inline bool is_regular_file(mode_t mode) { return (mode & S_IFMT) == S_IFREG; }
inline bool is_fifo(mode_t mode) { return (mode & 0170000) == 0010000; } inline bool is_fifo(mode_t mode) { return (mode & S_IFMT) == S_IFIFO; }
inline bool is_symlink(mode_t mode) { return (mode & 0170000) == 0120000; } inline bool is_symlink(mode_t mode) { return (mode & S_IFMT) == S_IFLNK; }
inline bool is_socket(mode_t mode) { return (mode & 0170000) == 0140000; } inline bool is_socket(mode_t mode) { return (mode & S_IFMT) == S_IFSOCK; }
inline bool is_sticky(mode_t mode) { return mode & 01000; } inline bool is_sticky(mode_t mode) { return mode & S_ISVTX; }
inline bool is_setuid(mode_t mode) { return mode & 04000; } inline bool is_setuid(mode_t mode) { return mode & S_ISUID; }
inline bool is_setgid(mode_t mode) { return mode & 02000; } inline bool is_setgid(mode_t mode) { return mode & S_ISGID; }
struct InodeMetadata { struct InodeMetadata {
bool is_valid() const { return inode.is_valid(); } bool is_valid() const { return inode.is_valid(); }
@ -63,10 +63,10 @@ struct InodeMetadata {
if (u == 0) if (u == 0)
return true; return true;
if (uid == u) if (uid == u)
return mode & 0400; return mode & S_IRUSR;
if (gid == g || eg.contains(gid)) if (gid == g || eg.contains(gid))
return mode & 0040; return mode & S_IRGRP;
return mode & 0004; return mode & S_IROTH;
} }
bool may_write(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const bool may_write(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const
@ -74,10 +74,10 @@ struct InodeMetadata {
if (u == 0) if (u == 0)
return true; return true;
if (uid == u) if (uid == u)
return mode & 0200; return mode & S_IWUSR;
if (gid == g || eg.contains(gid)) if (gid == g || eg.contains(gid))
return mode & 0020; return mode & S_IWGRP;
return mode & 0002; return mode & S_IWOTH;
} }
bool may_execute(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const bool may_execute(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const
@ -85,10 +85,10 @@ struct InodeMetadata {
if (u == 0) if (u == 0)
return true; return true;
if (uid == u) if (uid == u)
return mode & 0100; return mode & S_IXUSR;
if (gid == g || eg.contains(gid)) if (gid == g || eg.contains(gid))
return mode & 0010; return mode & S_IXGRP;
return mode & 0001; return mode & S_IXOTH;
} }
bool is_directory() const { return Kernel::is_directory(mode); } bool is_directory() const { return Kernel::is_directory(mode); }

View file

@ -1144,30 +1144,30 @@ InodeMetadata ProcFSInode::metadata() const
} }
if (proc_parent_directory == PDI_PID_fd) { if (proc_parent_directory == PDI_PID_fd) {
metadata.mode = 00120700; metadata.mode = S_IFLNK | S_IRUSR | S_IWUSR | S_IXUSR;
return metadata; return metadata;
} }
switch (proc_file_type) { switch (proc_file_type) {
case FI_Root_self: case FI_Root_self:
metadata.mode = 0120444; metadata.mode = S_IFLNK | S_IRUSR | S_IRGRP | S_IROTH;
break; break;
case FI_PID_cwd: case FI_PID_cwd:
case FI_PID_exe: case FI_PID_exe:
case FI_PID_root: case FI_PID_root:
metadata.mode = 0120400; metadata.mode = S_IFLNK | S_IRUSR;
break; break;
case FI_Root: case FI_Root:
case FI_Root_sys: case FI_Root_sys:
case FI_Root_net: case FI_Root_net:
metadata.mode = 040555; metadata.mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
break; break;
case FI_PID: case FI_PID:
case FI_PID_fd: case FI_PID_fd:
metadata.mode = 040500; metadata.mode = S_IFDIR | S_IRUSR | S_IXUSR;
break; break;
default: default:
metadata.mode = 0100444; metadata.mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH;
break; break;
} }

View file

@ -125,8 +125,8 @@ KResultOr<NonnullRefPtr<Inode>> TmpFS::create_inode(InodeIdentifier parent_id, c
KResult TmpFS::create_directory(InodeIdentifier parent_id, const String& name, mode_t mode, uid_t uid, gid_t gid) KResult TmpFS::create_directory(InodeIdentifier parent_id, const String& name, mode_t mode, uid_t uid, gid_t gid)
{ {
// Ensure it's a directory. // Ensure it's a directory.
mode &= ~0170000; mode &= ~S_IFMT;
mode |= 0040000; mode |= S_IFDIR;
auto result = create_inode(parent_id, name, mode, 0, 0, uid, gid); auto result = create_inode(parent_id, name, mode, 0, 0, uid, gid);
if (result.is_error()) if (result.is_error())
return result.error(); return result.error();
@ -155,7 +155,7 @@ NonnullRefPtr<TmpFSInode> TmpFSInode::create(TmpFS& fs, InodeMetadata metadata,
NonnullRefPtr<TmpFSInode> TmpFSInode::create_root(TmpFS& fs) NonnullRefPtr<TmpFSInode> TmpFSInode::create_root(TmpFS& fs)
{ {
InodeMetadata metadata; InodeMetadata metadata;
metadata.mode = 0041777; metadata.mode = S_IFDIR | S_ISVTX | 0777;
return create(fs, metadata, { fs.fsid(), 1 }); return create(fs, metadata, { fs.fsid(), 1 });
} }

View file

@ -108,6 +108,28 @@
#define FUTEX_WAIT 1 #define FUTEX_WAIT 1
#define FUTEX_WAKE 2 #define FUTEX_WAKE 2
#define S_IFMT 0170000
#define S_IFDIR 0040000
#define S_IFCHR 0020000
#define S_IFBLK 0060000
#define S_IFREG 0100000
#define S_IFIFO 0010000
#define S_IFLNK 0120000
#define S_IFSOCK 0140000
#define S_ISUID 04000
#define S_ISGID 02000
#define S_ISVTX 01000
#define S_IRUSR 0400
#define S_IWUSR 0200
#define S_IXUSR 0100
#define S_IRGRP 0040
#define S_IWGRP 0020
#define S_IXGRP 0010
#define S_IROTH 0004
#define S_IWOTH 0002
#define S_IXOTH 0001
/* c_cc characters */ /* c_cc characters */
#define VINTR 0 #define VINTR 0
#define VQUIT 1 #define VQUIT 1