mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 20:32:04 +09:00
fscrypt: fix renaming and linking special files
commit42d97eb0adupstream. Attempting to link a device node, named pipe, or socket file into an encrypted directory through rename(2) or link(2) always failed with EPERM. This happened because fscrypt_has_permitted_context() saw that the file was unencrypted and forbid creating the link. This behavior was unexpected because such files are never encrypted; only regular files, directories, and symlinks can be encrypted. To fix this, make fscrypt_has_permitted_context() always return true on special files. This will be covered by a test in my encryption xfstests patchset. Fixes:9bd8212f98("ext4 crypto: add encryption policy and password salt support") Signed-off-by: Eric Biggers <ebiggers@google.com> Reviewed-by: Richard Weinberger <richard@nod.at> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c10ffe988f
commit
fd74e8d258
@@ -156,6 +156,12 @@ int ext4_is_child_context_consistent_with_parent(struct inode *parent,
|
|||||||
WARN_ON(1); /* Should never happen */
|
WARN_ON(1); /* Should never happen */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* No restrictions on file types which are never encrypted */
|
||||||
|
if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
|
||||||
|
!S_ISLNK(child->i_mode))
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* no restrictions if the parent directory is not encrypted */
|
/* no restrictions if the parent directory is not encrypted */
|
||||||
if (!ext4_encrypted_inode(parent))
|
if (!ext4_encrypted_inode(parent))
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -149,6 +149,11 @@ int f2fs_is_child_context_consistent_with_parent(struct inode *parent,
|
|||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* No restrictions on file types which are never encrypted */
|
||||||
|
if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
|
||||||
|
!S_ISLNK(child->i_mode))
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* no restrictions if the parent directory is not encrypted */
|
/* no restrictions if the parent directory is not encrypted */
|
||||||
if (!f2fs_encrypted_inode(parent))
|
if (!f2fs_encrypted_inode(parent))
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user