mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
tcm_fileio: Prevent information leak for short reads
[ Upstream commitf11b55d135] If we failed to read data from backing file (probably because some one truncate file under us), we must zerofill cmd's data, otherwise it will be returned as is. Most likely cmd's data are unitialized pages from page cache. This result in information leak. (Change BUG_ON into -EINVAL se_cmd failure - nab) testcase:e11a1b7b90Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9935f86219
commit
f29bc9dc0b
@@ -276,12 +276,11 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
|
||||
else
|
||||
ret = vfs_iter_read(fd, &iter, &pos);
|
||||
|
||||
kfree(bvec);
|
||||
|
||||
if (is_write) {
|
||||
if (ret < 0 || ret != data_length) {
|
||||
pr_err("%s() write returned %d\n", __func__, ret);
|
||||
return (ret < 0 ? ret : -EINVAL);
|
||||
if (ret >= 0)
|
||||
ret = -EINVAL;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@@ -294,17 +293,29 @@ static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
|
||||
pr_err("%s() returned %d, expecting %u for "
|
||||
"S_ISBLK\n", __func__, ret,
|
||||
data_length);
|
||||
return (ret < 0 ? ret : -EINVAL);
|
||||
if (ret >= 0)
|
||||
ret = -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (ret < 0) {
|
||||
pr_err("%s() returned %d for non S_ISBLK\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
} else if (ret != data_length) {
|
||||
/*
|
||||
* Short read case:
|
||||
* Probably some one truncate file under us.
|
||||
* We must explicitly zero sg-pages to prevent
|
||||
* expose uninizialized pages to userspace.
|
||||
*/
|
||||
if (ret < data_length)
|
||||
ret += iov_iter_zero(data_length - ret, &iter);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
kfree(bvec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static sense_reason_t
|
||||
|
||||
Reference in New Issue
Block a user