Kernel: Add file permission checks to utime() syscall.

This commit is contained in:
Andreas Kling 2019-02-21 16:37:41 +01:00
parent f0a869ea50
commit a624fe06b8
Notes: sideshowbarker 2024-07-19 15:39:01 +09:00
3 changed files with 27 additions and 12 deletions

View file

@ -1125,14 +1125,6 @@ int Process::sys$utime(const char* pathname, const utimbuf* buf)
return -EFAULT;
if (buf && !validate_read_typed(buf))
return -EFAULT;
String path(pathname);
int error;
auto descriptor = VFS::the().open(move(path), error, 0, 0, cwd_inode());
if (!descriptor)
return error;
auto& inode = *descriptor->inode();
if (inode.fs().is_readonly())
return -EROFS;
time_t atime;
time_t mtime;
if (buf) {
@ -1143,11 +1135,10 @@ int Process::sys$utime(const char* pathname, const utimbuf* buf)
mtime = now;
atime = now;
}
error = inode.set_atime(atime);
if (error)
int error;
if (!VFS::the().utime(String(pathname), error, cwd_inode(), atime, mtime))
return error;
error = inode.set_mtime(mtime);
return error;
return 0;
}
int Process::sys$access(const char* pathname, int mode)

View file

@ -131,6 +131,29 @@ RetainPtr<FileDescriptor> VFS::open(RetainPtr<Device>&& device, int& error, int
return FileDescriptor::create(move(device));
}
bool VFS::utime(const String& path, int& error, Inode& base, time_t atime, time_t mtime)
{
auto descriptor = VFS::the().open(move(path), error, 0, 0, base);
if (!descriptor)
return false;
auto& inode = *descriptor->inode();
if (inode.fs().is_readonly()) {
error = -EROFS;
return false;
}
if (inode.metadata().uid != current->euid()) {
error = -EACCES;
return false;
}
error = inode.set_atime(atime);
if (error)
return false;
error = inode.set_mtime(mtime);
if (error)
return false;
return true;
}
bool VFS::stat(const String& path, int& error, int options, Inode& base, struct stat& statbuf)
{
auto inode_id = resolve_path(path, base.identifier(), error, options);

View file

@ -70,6 +70,7 @@ public:
bool rmdir(const String& path, Inode& base, int& error);
bool chmod(const String& path, mode_t, Inode& base, int& error);
bool stat(const String& path, int& error, int options, Inode& base, struct stat&);
bool utime(const String& path, int& error, Inode& base, time_t atime, time_t mtime);
void register_device(Device&);
void unregister_device(Device&);