mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-11 02:13:56 +09: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:
parent
fd985b1f48
commit
e0d0d52455
Notes:
sideshowbarker
2024-07-19 05:36:29 +09:00
Author: https://github.com/bugaevc
Commit: e0d0d52455
Pull-request: https://github.com/SerenityOS/serenity/pull/2564
Reviewed-by: https://github.com/alimpfard
Reviewed-by: https://github.com/awesomekling
5 changed files with 52 additions and 30 deletions
|
@ -78,12 +78,12 @@ KResult FileDescription::fstat(stat& buffer)
|
|||
{
|
||||
if (is_fifo()) {
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
buffer.st_mode = 001000;
|
||||
buffer.st_mode = S_IFIFO;
|
||||
return KSuccess;
|
||||
}
|
||||
if (is_socket()) {
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
buffer.st_mode = 0140000;
|
||||
buffer.st_mode = S_IFSOCK;
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,16 +40,16 @@ inline constexpr u32 encoded_device(unsigned major, unsigned minor)
|
|||
return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
|
||||
}
|
||||
|
||||
inline bool is_directory(mode_t mode) { return (mode & 0170000) == 0040000; }
|
||||
inline bool is_character_device(mode_t mode) { return (mode & 0170000) == 0020000; }
|
||||
inline bool is_block_device(mode_t mode) { return (mode & 0170000) == 0060000; }
|
||||
inline bool is_regular_file(mode_t mode) { return (mode & 0170000) == 0100000; }
|
||||
inline bool is_fifo(mode_t mode) { return (mode & 0170000) == 0010000; }
|
||||
inline bool is_symlink(mode_t mode) { return (mode & 0170000) == 0120000; }
|
||||
inline bool is_socket(mode_t mode) { return (mode & 0170000) == 0140000; }
|
||||
inline bool is_sticky(mode_t mode) { return mode & 01000; }
|
||||
inline bool is_setuid(mode_t mode) { return mode & 04000; }
|
||||
inline bool is_setgid(mode_t mode) { return mode & 02000; }
|
||||
inline bool is_directory(mode_t mode) { return (mode & S_IFMT) == S_IFDIR; }
|
||||
inline bool is_character_device(mode_t mode) { return (mode & S_IFMT) == S_IFCHR; }
|
||||
inline bool is_block_device(mode_t mode) { return (mode & S_IFMT) == S_IFBLK; }
|
||||
inline bool is_regular_file(mode_t mode) { return (mode & S_IFMT) == S_IFREG; }
|
||||
inline bool is_fifo(mode_t mode) { return (mode & S_IFMT) == S_IFIFO; }
|
||||
inline bool is_symlink(mode_t mode) { return (mode & S_IFMT) == S_IFLNK; }
|
||||
inline bool is_socket(mode_t mode) { return (mode & S_IFMT) == S_IFSOCK; }
|
||||
inline bool is_sticky(mode_t mode) { return mode & S_ISVTX; }
|
||||
inline bool is_setuid(mode_t mode) { return mode & S_ISUID; }
|
||||
inline bool is_setgid(mode_t mode) { return mode & S_ISGID; }
|
||||
|
||||
struct InodeMetadata {
|
||||
bool is_valid() const { return inode.is_valid(); }
|
||||
|
@ -63,10 +63,10 @@ struct InodeMetadata {
|
|||
if (u == 0)
|
||||
return true;
|
||||
if (uid == u)
|
||||
return mode & 0400;
|
||||
return mode & S_IRUSR;
|
||||
if (gid == g || eg.contains(gid))
|
||||
return mode & 0040;
|
||||
return mode & 0004;
|
||||
return mode & S_IRGRP;
|
||||
return mode & S_IROTH;
|
||||
}
|
||||
|
||||
bool may_write(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const
|
||||
|
@ -74,10 +74,10 @@ struct InodeMetadata {
|
|||
if (u == 0)
|
||||
return true;
|
||||
if (uid == u)
|
||||
return mode & 0200;
|
||||
return mode & S_IWUSR;
|
||||
if (gid == g || eg.contains(gid))
|
||||
return mode & 0020;
|
||||
return mode & 0002;
|
||||
return mode & S_IWGRP;
|
||||
return mode & S_IWOTH;
|
||||
}
|
||||
|
||||
bool may_execute(uid_t u, gid_t g, const FixedArray<gid_t>& eg) const
|
||||
|
@ -85,10 +85,10 @@ struct InodeMetadata {
|
|||
if (u == 0)
|
||||
return true;
|
||||
if (uid == u)
|
||||
return mode & 0100;
|
||||
return mode & S_IXUSR;
|
||||
if (gid == g || eg.contains(gid))
|
||||
return mode & 0010;
|
||||
return mode & 0001;
|
||||
return mode & S_IXGRP;
|
||||
return mode & S_IXOTH;
|
||||
}
|
||||
|
||||
bool is_directory() const { return Kernel::is_directory(mode); }
|
||||
|
|
|
@ -1144,30 +1144,30 @@ InodeMetadata ProcFSInode::metadata() const
|
|||
}
|
||||
|
||||
if (proc_parent_directory == PDI_PID_fd) {
|
||||
metadata.mode = 00120700;
|
||||
metadata.mode = S_IFLNK | S_IRUSR | S_IWUSR | S_IXUSR;
|
||||
return metadata;
|
||||
}
|
||||
|
||||
switch (proc_file_type) {
|
||||
case FI_Root_self:
|
||||
metadata.mode = 0120444;
|
||||
metadata.mode = S_IFLNK | S_IRUSR | S_IRGRP | S_IROTH;
|
||||
break;
|
||||
case FI_PID_cwd:
|
||||
case FI_PID_exe:
|
||||
case FI_PID_root:
|
||||
metadata.mode = 0120400;
|
||||
metadata.mode = S_IFLNK | S_IRUSR;
|
||||
break;
|
||||
case FI_Root:
|
||||
case FI_Root_sys:
|
||||
case FI_Root_net:
|
||||
metadata.mode = 040555;
|
||||
metadata.mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
|
||||
break;
|
||||
case FI_PID:
|
||||
case FI_PID_fd:
|
||||
metadata.mode = 040500;
|
||||
metadata.mode = S_IFDIR | S_IRUSR | S_IXUSR;
|
||||
break;
|
||||
default:
|
||||
metadata.mode = 0100444;
|
||||
metadata.mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
// Ensure it's a directory.
|
||||
mode &= ~0170000;
|
||||
mode |= 0040000;
|
||||
mode &= ~S_IFMT;
|
||||
mode |= S_IFDIR;
|
||||
auto result = create_inode(parent_id, name, mode, 0, 0, uid, gid);
|
||||
if (result.is_error())
|
||||
return result.error();
|
||||
|
@ -155,7 +155,7 @@ NonnullRefPtr<TmpFSInode> TmpFSInode::create(TmpFS& fs, InodeMetadata metadata,
|
|||
NonnullRefPtr<TmpFSInode> TmpFSInode::create_root(TmpFS& fs)
|
||||
{
|
||||
InodeMetadata metadata;
|
||||
metadata.mode = 0041777;
|
||||
metadata.mode = S_IFDIR | S_ISVTX | 0777;
|
||||
return create(fs, metadata, { fs.fsid(), 1 });
|
||||
}
|
||||
|
||||
|
|
|
@ -108,6 +108,28 @@
|
|||
#define FUTEX_WAIT 1
|
||||
#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 */
|
||||
#define VINTR 0
|
||||
#define VQUIT 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue