diff options
author | Richard Weinberger <richard@nod.at> | 2016-09-29 12:00:57 -0400 |
---|---|---|
committer | Richard Weinberger <richard@nod.at> | 2016-12-12 17:07:38 -0500 |
commit | a79bff21c120a615dc8ba6df9258e9e2ef022e3b (patch) | |
tree | 4769beaf2e5d9f8313602ce5fab4f6a2ccb3ed43 /fs/ubifs | |
parent | ba40e6a3c40514f6cd50df50033107c1c6794c20 (diff) |
ubifs: Implement file open operation
We need ->open() for files to load the crypto key.
If the no key is present and the file is encrypted,
refuse to open.
Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'fs/ubifs')
-rw-r--r-- | fs/ubifs/file.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index b4fbeefba246..a9c5cc6c0bc5 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c | |||
@@ -1605,6 +1605,35 @@ static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
1605 | return 0; | 1605 | return 0; |
1606 | } | 1606 | } |
1607 | 1607 | ||
1608 | static int ubifs_file_open(struct inode *inode, struct file *filp) | ||
1609 | { | ||
1610 | int ret; | ||
1611 | struct dentry *dir; | ||
1612 | struct ubifs_info *c = inode->i_sb->s_fs_info; | ||
1613 | |||
1614 | if (ubifs_crypt_is_encrypted(inode)) { | ||
1615 | ret = fscrypt_get_encryption_info(inode); | ||
1616 | if (ret) | ||
1617 | return -EACCES; | ||
1618 | if (!fscrypt_has_encryption_key(inode)) | ||
1619 | return -ENOKEY; | ||
1620 | } | ||
1621 | |||
1622 | dir = dget_parent(file_dentry(filp)); | ||
1623 | if (ubifs_crypt_is_encrypted(d_inode(dir)) && | ||
1624 | !fscrypt_has_permitted_context(d_inode(dir), inode)) { | ||
1625 | ubifs_err(c, "Inconsistent encryption contexts: %lu/%lu", | ||
1626 | (unsigned long) d_inode(dir)->i_ino, | ||
1627 | (unsigned long) inode->i_ino); | ||
1628 | dput(dir); | ||
1629 | ubifs_ro_mode(c, -EPERM); | ||
1630 | return -EPERM; | ||
1631 | } | ||
1632 | dput(dir); | ||
1633 | |||
1634 | return 0; | ||
1635 | } | ||
1636 | |||
1608 | const struct address_space_operations ubifs_file_address_operations = { | 1637 | const struct address_space_operations ubifs_file_address_operations = { |
1609 | .readpage = ubifs_readpage, | 1638 | .readpage = ubifs_readpage, |
1610 | .writepage = ubifs_writepage, | 1639 | .writepage = ubifs_writepage, |
@@ -1647,6 +1676,7 @@ const struct file_operations ubifs_file_operations = { | |||
1647 | .unlocked_ioctl = ubifs_ioctl, | 1676 | .unlocked_ioctl = ubifs_ioctl, |
1648 | .splice_read = generic_file_splice_read, | 1677 | .splice_read = generic_file_splice_read, |
1649 | .splice_write = iter_file_splice_write, | 1678 | .splice_write = iter_file_splice_write, |
1679 | .open = ubifs_file_open, | ||
1650 | #ifdef CONFIG_COMPAT | 1680 | #ifdef CONFIG_COMPAT |
1651 | .compat_ioctl = ubifs_compat_ioctl, | 1681 | .compat_ioctl = ubifs_compat_ioctl, |
1652 | #endif | 1682 | #endif |