Skip to content

Commit fd74e8d

Browse files
ebiggersgregkh
authored andcommitted
fscrypt: fix renaming and linking special files
commit 42d97eb0ade31e1bc537d086842f5d6e766d9d51 upstream. 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: 9bd8212 ("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>
1 parent c10ffe9 commit fd74e8d

2 files changed

Lines changed: 11 additions & 0 deletions

File tree

fs/ext4/crypto_policy.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ int ext4_is_child_context_consistent_with_parent(struct inode *parent,
156156
WARN_ON(1); /* Should never happen */
157157
return 0;
158158
}
159+
160+
/* No restrictions on file types which are never encrypted */
161+
if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
162+
!S_ISLNK(child->i_mode))
163+
return 1;
164+
159165
/* no restrictions if the parent directory is not encrypted */
160166
if (!ext4_encrypted_inode(parent))
161167
return 1;

fs/f2fs/crypto_policy.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ int f2fs_is_child_context_consistent_with_parent(struct inode *parent,
149149
BUG_ON(1);
150150
}
151151

152+
/* No restrictions on file types which are never encrypted */
153+
if (!S_ISREG(child->i_mode) && !S_ISDIR(child->i_mode) &&
154+
!S_ISLNK(child->i_mode))
155+
return 1;
156+
152157
/* no restrictions if the parent directory is not encrypted */
153158
if (!f2fs_encrypted_inode(parent))
154159
return 1;

0 commit comments

Comments
 (0)