integrity: fs hook placement
PATCH 2/7 integrity: fs hook placement
This patch places calls to the new integrity hooks in the appropriate places in the fs directory. It is not meant in any way to be viewed as a complete set, but used as a basis for an initial discussion.
Signed-off-by Mimi Zohar <[email protected]>
Signed-off-by Kylene Hall <[email protected]>
---
fs/ext3/xattr_security.c +8 -0
@@ -10,6 +10,7 @@#include <linux/ext3_jbd.h> #include <linux/ext3_fs.h> #include <linux/security.h> +#include <linux/integrity.h> #include "xattr.h" static size_t
@@ -58,12 +59,19 @@ ext3_init_security(handle_t *handle, str err =security_inode_init_security (inode, dir, &name, &value, &len);if (err) { +/* Even if creation of the security xattr fails, must +* indicate this is a new inode. */ +integrity_inode_init_integrity (inode, dir,NULL ,NULL ,NULL );if (err == -EOPNOTSUPP )return 0 ;return err; } err =ext3_xattr_set_handle (handle, inode,EXT3_XATTR_INDEX_SECURITY , name, value, len,0 ); + +integrity_inode_init_integrity (inode, dir, &name, &value, &len); + err =ext3_xattr_set_handle (handle, inode,EXT3_XATTR_INDEX_SECURITY , + name, value, len,0 );kfree (name);kfree (value);return err;
include/linux/fs.h +3 -0
@@ -591,6 +591,9 @@ struct inode {#ifdef CONFIG_SECURITY void *i_security;#endif +#ifdef CONFIG_INTEGRITY +void *i_integrity; +#endif void *i_private;/* fs or device private pointer */ };
fs/dcache.c +6 -0
@@ -29,6 +29,7 @@#include <linux/file.h> #include <asm/uaccess.h> #include <linux/security.h> +#include <linux/integrity.h> #include <linux/seqlock.h> #include <linux/swap.h> #include <linux/bootmem.h>
@@ -986,6 +987,7 @@ void d_instantiate(struct dentry *entry, entry->d_inode = inode;fsnotify_d_instantiate (entry, inode);spin_unlock (&dcache_lock); +integrity_d_instantiate (entry, inode);security_d_instantiate (entry, inode); }
@@ -1050,6 +1052,7 @@ struct dentry *d_instantiate_unique(struspin_unlock (&dcache_lock);if (!result) { +integrity_d_instantiate (entry, inode);security_d_instantiate (entry, inode);return NULL ; }
@@ -1187,6 +1190,7 @@ struct dentry *d_splice_alias(struct inoBUG_ON (!(new->d_flags &DCACHE_DISCONNECTED ));fsnotify_d_instantiate (new, inode);spin_unlock (&dcache_lock); +integrity_d_instantiate (new, inode);security_d_instantiate (new, inode);d_rehash (dentry);d_move (new, dentry);
@@ -1197,6 +1201,7 @@ struct dentry *d_splice_alias(struct ino dentry->d_inode = inode;fsnotify_d_instantiate (dentry, inode);spin_unlock (&dcache_lock); +integrity_d_instantiate (dentry, inode);security_d_instantiate (dentry, inode);d_rehash (dentry); }
@@ -1748,6 +1753,7 @@ found:spin_unlock (&dcache_lock); out_nolock:if (actual == dentry) { +integrity_d_instantiate (dentry, inode);security_d_instantiate (dentry, inode);return NULL ; }
fs/file_table.c +3 -0
@@ -13,6 +13,7 @@#include <linux/smp_lock.h> #include <linux/fs.h> #include <linux/security.h> +#include <linux/integrity.h> #include <linux/eventpoll.h> #include <linux/rcupdate.h> #include <linux/mount.h>
@@ -169,6 +170,7 @@ void fastcall __fput(struct file *file)if (file->f_op && file->f_op->release) file->f_op->release (inode, file);security_file_free (file); +integrity_file_free (file);if (unlikely (S_ISCHR (inode->i_mode) && inode->i_cdev !=NULL ))cdev_put (inode->i_cdev);fops_put (file->f_op);
@@ -240,6 +242,7 @@ void put_filp(struct file *file) {if (atomic_dec_and_test (&file->f_count)) {security_file_free (file); +integrity_file_free (file);file_kill (file);file_free (file); }
fs/inode.c +10 -0
@@ -17,6 +17,7 @@#include <linux/hash.h> #include <linux/swap.h> #include <linux/security.h> +#include <linux/integrity.h> #include <linux/pagemap.h> #include <linux/cdev.h> #include <linux/bootmem.h>
@@ -142,6 +143,14 @@ static struct inode *alloc_inode(structreturn NULL ; } +if (integrity_inode_alloc (inode)) { +if (inode->i_sb->s_op->destroy_inode) + inode->i_sb->s_op->destroy_inode (inode); +else +kmem_cache_free (inode_cachep, (inode)); +return NULL ; + } + mapping->a_ops = &empty_aops; mapping->host = inode; mapping->flags =0 ;
@@ -172,6 +181,7 @@ void destroy_inode(struct inode *inode) {BUG_ON (inode_has_buffers (inode));security_inode_free (inode); +integrity_inode_free (inode);if (inode->i_sb->s_op->destroy_inode) inode->i_sb->s_op->destroy_inode (inode);else
fs/xattr.c +9 -0
@@ -14,6 +14,7 @@#include <linux/xattr.h> #include <linux/namei.h> #include <linux/security.h> +#include <linux/integrity.h> #include <linux/syscalls.h> #include <linux/module.h> #include <linux/fsnotify.h>
@@ -84,11 +85,17 @@ vfs_setxattr(struct dentry *dentry, char error =security_inode_setxattr (dentry, name, value, size, flags);if (error) goto out; + + error =integrity_inode_setxattr (dentry, name, value, size, flags); +if (error) + goto out; + error = -EOPNOTSUPP ;if (inode->i_op->setxattr) { error = inode->i_op->setxattr (dentry, name, value, size, flags);if (!error) {fsnotify_xattr (dentry); +integrity_inode_post_setxattr (dentry, name);security_inode_post_setxattr (dentry, name, value, size, flags); }
@@ -181,6 +188,8 @@ vfs_removexattr(struct dentry *dentry, cmutex_lock (&inode->i_mutex); error = inode->i_op->removexattr (dentry, name); +if (!error) +integrity_inode_post_setxattr (dentry, name);mutex_unlock (&inode->i_mutex);if (!error)