Kernel+LibC: Don't allow a directory to become a subdirectory of itself

If you try to do this (e.g "mv directory directory"), sys$rename() will
now fail with EDIRINTOSELF.

Dr. POSIX says we should return EINVAL for this, but a custom error
code allows us to print a much more helpful error message when this
problem occurs. :^)
This commit is contained in:
Andreas Kling 2020-11-01 17:17:23 +01:00
parent 13aa3d2d62
commit a28f29c82c
3 changed files with 8 additions and 1 deletions

View file

@ -522,6 +522,11 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base)
if (&old_parent_inode.fs() != &new_parent_inode.fs())
return KResult(-EXDEV);
for (auto* new_ancestor = new_parent_custody.ptr(); new_ancestor; new_ancestor = new_ancestor->parent()) {
if (&old_inode == &new_ancestor->inode())
return KResult(-EDIRINTOSELF);
}
auto current_process = Process::current();
if (!new_parent_inode.metadata().may_write(*current_process))
return KResult(-EACCES);

View file

@ -99,4 +99,5 @@
#define EPROTO 71
#define ENOTSUP 72
#define EPFNOSUPPORT 73
#define EMAXERRNO 74
#define EDIRINTOSELF 74
#define EMAXERRNO 75

View file

@ -364,6 +364,7 @@ const char* const sys_errlist[] = {
"Protocol error",
"Not supported",
"Protocol family not supported",
"Cannot make directory a subdirectory of itself",
"The highest errno +1 :^)",
};