|
@@ -4209,12 +4209,16 @@ SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname,
|
|
|
bool should_retry = false;
|
|
|
int error;
|
|
|
|
|
|
- if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
|
|
|
+ if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if ((flags & RENAME_NOREPLACE) && (flags & RENAME_EXCHANGE))
|
|
|
+ if ((flags & (RENAME_NOREPLACE | RENAME_WHITEOUT)) &&
|
|
|
+ (flags & RENAME_EXCHANGE))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if ((flags & RENAME_WHITEOUT) && !capable(CAP_MKNOD))
|
|
|
+ return -EPERM;
|
|
|
+
|
|
|
retry:
|
|
|
from = user_path_parent(olddfd, oldname, &oldnd, lookup_flags);
|
|
|
if (IS_ERR(from)) {
|