diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-03-22 19:13:54 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-03-22 19:13:54 -0500 |
| commit | f01c18456993bab43067b678f56c87ca954aa43b (patch) | |
| tree | 3e0cd0cdf1a57618202b46a7126125902e3ab832 /security/selinux/hooks.c | |
| parent | 949ec2c8e6b7b89179b85baf6309c009e1a1b951 (diff) | |
| parent | 1c2e02750b992703a8a18634e08b04353face243 (diff) | |
Merge branch 'master'
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 5b16196f2823..ccaf988f3729 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
| @@ -117,6 +117,8 @@ static struct security_operations *secondary_ops = NULL; | |||
| 117 | static LIST_HEAD(superblock_security_head); | 117 | static LIST_HEAD(superblock_security_head); |
| 118 | static DEFINE_SPINLOCK(sb_security_lock); | 118 | static DEFINE_SPINLOCK(sb_security_lock); |
| 119 | 119 | ||
| 120 | static kmem_cache_t *sel_inode_cache; | ||
| 121 | |||
| 120 | /* Allocate and free functions for each kind of security blob. */ | 122 | /* Allocate and free functions for each kind of security blob. */ |
| 121 | 123 | ||
| 122 | static int task_alloc_security(struct task_struct *task) | 124 | static int task_alloc_security(struct task_struct *task) |
| @@ -146,10 +148,11 @@ static int inode_alloc_security(struct inode *inode) | |||
| 146 | struct task_security_struct *tsec = current->security; | 148 | struct task_security_struct *tsec = current->security; |
| 147 | struct inode_security_struct *isec; | 149 | struct inode_security_struct *isec; |
| 148 | 150 | ||
| 149 | isec = kzalloc(sizeof(struct inode_security_struct), GFP_KERNEL); | 151 | isec = kmem_cache_alloc(sel_inode_cache, SLAB_KERNEL); |
| 150 | if (!isec) | 152 | if (!isec) |
| 151 | return -ENOMEM; | 153 | return -ENOMEM; |
| 152 | 154 | ||
| 155 | memset(isec, 0, sizeof(*isec)); | ||
| 153 | init_MUTEX(&isec->sem); | 156 | init_MUTEX(&isec->sem); |
| 154 | INIT_LIST_HEAD(&isec->list); | 157 | INIT_LIST_HEAD(&isec->list); |
| 155 | isec->inode = inode; | 158 | isec->inode = inode; |
| @@ -172,7 +175,7 @@ static void inode_free_security(struct inode *inode) | |||
| 172 | spin_unlock(&sbsec->isec_lock); | 175 | spin_unlock(&sbsec->isec_lock); |
| 173 | 176 | ||
| 174 | inode->i_security = NULL; | 177 | inode->i_security = NULL; |
| 175 | kfree(isec); | 178 | kmem_cache_free(sel_inode_cache, isec); |
| 176 | } | 179 | } |
| 177 | 180 | ||
| 178 | static int file_alloc_security(struct file *file) | 181 | static int file_alloc_security(struct file *file) |
| @@ -1929,7 +1932,6 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, | |||
| 1929 | struct task_security_struct *tsec; | 1932 | struct task_security_struct *tsec; |
| 1930 | struct inode_security_struct *dsec; | 1933 | struct inode_security_struct *dsec; |
| 1931 | struct superblock_security_struct *sbsec; | 1934 | struct superblock_security_struct *sbsec; |
| 1932 | struct inode_security_struct *isec; | ||
| 1933 | u32 newsid, clen; | 1935 | u32 newsid, clen; |
| 1934 | int rc; | 1936 | int rc; |
| 1935 | char *namep = NULL, *context; | 1937 | char *namep = NULL, *context; |
| @@ -1937,7 +1939,6 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, | |||
| 1937 | tsec = current->security; | 1939 | tsec = current->security; |
| 1938 | dsec = dir->i_security; | 1940 | dsec = dir->i_security; |
| 1939 | sbsec = dir->i_sb->s_security; | 1941 | sbsec = dir->i_sb->s_security; |
| 1940 | isec = inode->i_security; | ||
| 1941 | 1942 | ||
| 1942 | if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) { | 1943 | if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) { |
| 1943 | newsid = tsec->create_sid; | 1944 | newsid = tsec->create_sid; |
| @@ -1957,7 +1958,7 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, | |||
| 1957 | 1958 | ||
| 1958 | inode_security_set_sid(inode, newsid); | 1959 | inode_security_set_sid(inode, newsid); |
| 1959 | 1960 | ||
| 1960 | if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT) | 1961 | if (!ss_initialized || sbsec->behavior == SECURITY_FS_USE_MNTPOINT) |
| 1961 | return -EOPNOTSUPP; | 1962 | return -EOPNOTSUPP; |
| 1962 | 1963 | ||
| 1963 | if (name) { | 1964 | if (name) { |
| @@ -4408,6 +4409,9 @@ static __init int selinux_init(void) | |||
| 4408 | tsec = current->security; | 4409 | tsec = current->security; |
| 4409 | tsec->osid = tsec->sid = SECINITSID_KERNEL; | 4410 | tsec->osid = tsec->sid = SECINITSID_KERNEL; |
| 4410 | 4411 | ||
| 4412 | sel_inode_cache = kmem_cache_create("selinux_inode_security", | ||
| 4413 | sizeof(struct inode_security_struct), | ||
| 4414 | 0, SLAB_PANIC, NULL, NULL); | ||
| 4411 | avc_init(); | 4415 | avc_init(); |
| 4412 | 4416 | ||
| 4413 | original_ops = secondary_ops = security_ops; | 4417 | original_ops = secondary_ops = security_ops; |
