mirror of https://github.com/torvalds/linux.git
selinux: fix sel_read_bool() allocation and error handling
Switch sel_read_bool() from using get_zeroed_page() and free_page() to a stack-allocated buffer. This also fixes a memory leak in the error path when security_get_bool_value() returns an error. Reported-by: Matthew Wilcox <willy@infradead.org> Signed-off-by: Stephen Smalley <stephen.smalley.work@gmail.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
parent
f20e70a341
commit
59ffc9beeb
|
|
@ -1203,7 +1203,7 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct selinux_fs_info *fsi = file_inode(filep)->i_sb->s_fs_info;
|
struct selinux_fs_info *fsi = file_inode(filep)->i_sb->s_fs_info;
|
||||||
char *page = NULL;
|
char buffer[4];
|
||||||
ssize_t length;
|
ssize_t length;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
int cur_enforcing;
|
int cur_enforcing;
|
||||||
|
|
@ -1217,27 +1217,19 @@ static ssize_t sel_read_bool(struct file *filep, char __user *buf,
|
||||||
fsi->bool_pending_names[index]))
|
fsi->bool_pending_names[index]))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
|
||||||
page = (char *)get_zeroed_page(GFP_KERNEL);
|
|
||||||
if (!page)
|
|
||||||
goto out_unlock;
|
|
||||||
|
|
||||||
cur_enforcing = security_get_bool_value(index);
|
cur_enforcing = security_get_bool_value(index);
|
||||||
if (cur_enforcing < 0) {
|
if (cur_enforcing < 0) {
|
||||||
ret = cur_enforcing;
|
ret = cur_enforcing;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
length = scnprintf(page, PAGE_SIZE, "%d %d", cur_enforcing,
|
length = scnprintf(buffer, sizeof(buffer), "%d %d", !!cur_enforcing,
|
||||||
fsi->bool_pending_values[index]);
|
!!fsi->bool_pending_values[index]);
|
||||||
mutex_unlock(&selinux_state.policy_mutex);
|
mutex_unlock(&selinux_state.policy_mutex);
|
||||||
ret = simple_read_from_buffer(buf, count, ppos, page, length);
|
return simple_read_from_buffer(buf, count, ppos, buffer, length);
|
||||||
out_free:
|
|
||||||
free_page((unsigned long)page);
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
mutex_unlock(&selinux_state.policy_mutex);
|
mutex_unlock(&selinux_state.policy_mutex);
|
||||||
goto out_free;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t sel_write_bool(struct file *filep, const char __user *buf,
|
static ssize_t sel_write_bool(struct file *filep, const char __user *buf,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue