Skip to content

Commit 6339204

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: Take ima_file_free() to proper place. ima: rename PATH_CHECK to FILE_CHECK ima: rename ima_path_check to ima_file_check ima: initialize ima before inodes can be allocated fix ima breakage Take ima_path_check() in nfsd past dentry_open() in nfsd_open() freeze_bdev: don't deactivate successfully frozen MS_RDONLY sb befs: fix leak
2 parents 80e1e82 + 89068c5 commit 6339204

File tree

14 files changed

+123
-178
lines changed

14 files changed

+123
-178
lines changed

Documentation/ABI/testing/ima_policy

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Description:
2020
lsm: [[subj_user=] [subj_role=] [subj_type=]
2121
[obj_user=] [obj_role=] [obj_type=]]
2222

23-
base: func:= [BPRM_CHECK][FILE_MMAP][INODE_PERMISSION]
23+
base: func:= [BPRM_CHECK][FILE_MMAP][FILE_CHECK]
2424
mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC]
2525
fsmagic:= hex value
2626
uid:= decimal value
@@ -40,11 +40,11 @@ Description:
4040

4141
measure func=BPRM_CHECK
4242
measure func=FILE_MMAP mask=MAY_EXEC
43-
measure func=INODE_PERM mask=MAY_READ uid=0
43+
measure func=FILE_CHECK mask=MAY_READ uid=0
4444

4545
The default policy measures all executables in bprm_check,
4646
all files mmapped executable in file_mmap, and all files
47-
open for read by root in inode_permission.
47+
open for read by root in do_filp_open.
4848

4949
Examples of LSM specific definitions:
5050

@@ -54,8 +54,8 @@ Description:
5454

5555
dont_measure obj_type=var_log_t
5656
dont_measure obj_type=auditd_log_t
57-
measure subj_user=system_u func=INODE_PERM mask=MAY_READ
58-
measure subj_role=system_r func=INODE_PERM mask=MAY_READ
57+
measure subj_user=system_u func=FILE_CHECK mask=MAY_READ
58+
measure subj_role=system_r func=FILE_CHECK mask=MAY_READ
5959

6060
Smack:
61-
measure subj_user=_ func=INODE_PERM mask=MAY_READ
61+
measure subj_user=_ func=FILE_CHECK mask=MAY_READ

fs/befs/linuxvfs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
873873
brelse(bh);
874874

875875
unacquire_priv_sbp:
876+
kfree(befs_sb->mount_opts.iocharset);
876877
kfree(sb->s_fs_info);
877878

878879
unacquire_none:

fs/block_dev.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,8 @@ struct super_block *freeze_bdev(struct block_device *bdev)
246246
if (!sb)
247247
goto out;
248248
if (sb->s_flags & MS_RDONLY) {
249-
deactivate_locked_super(sb);
249+
sb->s_frozen = SB_FREEZE_TRANS;
250+
up_write(&sb->s_umount);
250251
mutex_unlock(&bdev->bd_fsfreeze_mutex);
251252
return sb;
252253
}
@@ -307,7 +308,7 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb)
307308
BUG_ON(sb->s_bdev != bdev);
308309
down_write(&sb->s_umount);
309310
if (sb->s_flags & MS_RDONLY)
310-
goto out_deactivate;
311+
goto out_unfrozen;
311312

312313
if (sb->s_op->unfreeze_fs) {
313314
error = sb->s_op->unfreeze_fs(sb);
@@ -321,11 +322,11 @@ int thaw_bdev(struct block_device *bdev, struct super_block *sb)
321322
}
322323
}
323324

325+
out_unfrozen:
324326
sb->s_frozen = SB_UNFROZEN;
325327
smp_wmb();
326328
wake_up(&sb->s_wait_unfrozen);
327329

328-
out_deactivate:
329330
if (sb)
330331
deactivate_locked_super(sb);
331332
out_unlock:

fs/file_table.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ void __fput(struct file *file)
253253
if (file->f_op && file->f_op->release)
254254
file->f_op->release(inode, file);
255255
security_file_free(file);
256+
ima_file_free(file);
256257
if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL))
257258
cdev_put(inode->i_cdev);
258259
fops_put(file->f_op);

fs/namei.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,8 +1736,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
17361736
if (nd.root.mnt)
17371737
path_put(&nd.root);
17381738
if (!IS_ERR(filp)) {
1739-
error = ima_path_check(&filp->f_path, filp->f_mode &
1740-
(MAY_READ | MAY_WRITE | MAY_EXEC));
1739+
error = ima_file_check(filp, acc_mode);
17411740
if (error) {
17421741
fput(filp);
17431742
filp = ERR_PTR(error);
@@ -1797,8 +1796,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
17971796
}
17981797
filp = nameidata_to_filp(&nd);
17991798
if (!IS_ERR(filp)) {
1800-
error = ima_path_check(&filp->f_path, filp->f_mode &
1801-
(MAY_READ | MAY_WRITE | MAY_EXEC));
1799+
error = ima_file_check(filp, acc_mode);
18021800
if (error) {
18031801
fput(filp);
18041802
filp = ERR_PTR(error);

fs/nfsd/vfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
752752
flags, current_cred());
753753
if (IS_ERR(*filp))
754754
host_err = PTR_ERR(*filp);
755+
host_err = ima_file_check(*filp, access);
755756
out_nfserr:
756757
err = nfserrno(host_err);
757758
out:
@@ -2127,7 +2128,6 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp,
21272128
*/
21282129
path.mnt = exp->ex_path.mnt;
21292130
path.dentry = dentry;
2130-
err = ima_path_check(&path, acc & (MAY_READ | MAY_WRITE | MAY_EXEC));
21312131
nfsd_out:
21322132
return err? nfserrno(err) : 0;
21332133
}

include/linux/ima.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct linux_binprm;
1717
extern int ima_bprm_check(struct linux_binprm *bprm);
1818
extern int ima_inode_alloc(struct inode *inode);
1919
extern void ima_inode_free(struct inode *inode);
20-
extern int ima_path_check(struct path *path, int mask);
20+
extern int ima_file_check(struct file *file, int mask);
2121
extern void ima_file_free(struct file *file);
2222
extern int ima_file_mmap(struct file *file, unsigned long prot);
2323
extern void ima_counts_get(struct file *file);
@@ -38,7 +38,7 @@ static inline void ima_inode_free(struct inode *inode)
3838
return;
3939
}
4040

41-
static inline int ima_path_check(struct path *path, int mask)
41+
static inline int ima_file_check(struct file *file, int mask)
4242
{
4343
return 0;
4444
}

init/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,9 +657,9 @@ asmlinkage void __init start_kernel(void)
657657
proc_caches_init();
658658
buffer_init();
659659
key_init();
660+
radix_tree_init();
660661
security_init();
661662
vfs_caches_init(totalram_pages);
662-
radix_tree_init();
663663
signals_init();
664664
/* rootfs populating might need page-writeback */
665665
page_writeback_init();

security/integrity/ima/ima.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ void integrity_audit_msg(int audit_msgno, struct inode *inode,
6565
const char *cause, int result, int info);
6666

6767
/* Internal IMA function definitions */
68-
void ima_iintcache_init(void);
6968
int ima_init(void);
7069
void ima_cleanup(void);
7170
int ima_fs_init(void);
@@ -131,7 +130,7 @@ void iint_free(struct kref *kref);
131130
void iint_rcu_free(struct rcu_head *rcu);
132131

133132
/* IMA policy related functions */
134-
enum ima_hooks { PATH_CHECK = 1, FILE_MMAP, BPRM_CHECK };
133+
enum ima_hooks { FILE_CHECK = 1, FILE_MMAP, BPRM_CHECK };
135134

136135
int ima_match_policy(struct inode *inode, enum ima_hooks func, int mask);
137136
void ima_init_policy(void);

security/integrity/ima/ima_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ void ima_add_violation(struct inode *inode, const unsigned char *filename,
9595
* ima_must_measure - measure decision based on policy.
9696
* @inode: pointer to inode to measure
9797
* @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXECUTE)
98-
* @function: calling function (PATH_CHECK, BPRM_CHECK, FILE_MMAP)
98+
* @function: calling function (FILE_CHECK, BPRM_CHECK, FILE_MMAP)
9999
*
100100
* The policy is defined in terms of keypairs:
101101
* subj=, obj=, type=, func=, mask=, fsmagic=
102102
* subj,obj, and type: are LSM specific.
103-
* func: PATH_CHECK | BPRM_CHECK | FILE_MMAP
103+
* func: FILE_CHECK | BPRM_CHECK | FILE_MMAP
104104
* mask: contains the permission mask
105105
* fsmagic: hex value
106106
*

security/integrity/ima/ima_iint.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ int ima_inode_alloc(struct inode *inode)
5252
struct ima_iint_cache *iint = NULL;
5353
int rc = 0;
5454

55-
if (!ima_initialized)
56-
return 0;
57-
5855
iint = kmem_cache_alloc(iint_cache, GFP_NOFS);
5956
if (!iint)
6057
return -ENOMEM;
@@ -118,8 +115,6 @@ void ima_inode_free(struct inode *inode)
118115
{
119116
struct ima_iint_cache *iint;
120117

121-
if (!ima_initialized)
122-
return;
123118
spin_lock(&ima_iint_lock);
124119
iint = radix_tree_delete(&ima_iint_store, (unsigned long)inode);
125120
spin_unlock(&ima_iint_lock);
@@ -141,9 +136,11 @@ static void init_once(void *foo)
141136
kref_set(&iint->refcount, 1);
142137
}
143138

144-
void __init ima_iintcache_init(void)
139+
static int __init ima_iintcache_init(void)
145140
{
146141
iint_cache =
147142
kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0,
148143
SLAB_PANIC, init_once);
144+
return 0;
149145
}
146+
security_initcall(ima_iintcache_init);

0 commit comments

Comments
 (0)