| From 134cb2b5c0d67d16cefe1f91ba77d12bce2df602 Mon Sep 17 00:00:00 2001 |
| From: Eric Biggers <ebiggers@google.com> |
| Date: Mon, 19 Dec 2016 14:20:13 -0800 |
| Subject: [PATCH] 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: 9bd8212f981e ("ext4 crypto: add encryption policy and password salt support") |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| Reviewed-by: Richard Weinberger <richard@nod.at> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c |
| index 6865663aac69..abc18847b98d 100644 |
| --- a/fs/crypto/policy.c |
| +++ b/fs/crypto/policy.c |
| @@ -171,6 +171,11 @@ int fscrypt_has_permitted_context(struct inode *parent, struct inode *child) |
| 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 */ |
| if (!parent->i_sb->s_cop->is_encrypted(parent)) |
| return 1; |
| -- |
| 2.10.1 |
| |