tcmu: Fix possible to/from address overflow when doing the memcpy
For most case the sg->length equals to PAGE_SIZE, so this bug won't be triggered. Otherwise this will crash the kernel, for example when all segments' sg->length equal to 1K. Signed-off-by: Xiubo Li <lixiubo@cmss.chinamobile.com> Reviewed-by: Mike Christie <mchristi@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
520eccdfe1
commit
c542942cb4
@ -563,8 +563,6 @@ static int scatter_data_area(struct tcmu_dev *udev,
|
||||
block_remaining);
|
||||
to_offset = get_block_offset_user(udev, dbi,
|
||||
block_remaining);
|
||||
offset = DATA_BLOCK_SIZE - block_remaining;
|
||||
to += offset;
|
||||
|
||||
if (*iov_cnt != 0 &&
|
||||
to_offset == iov_tail(*iov)) {
|
||||
@ -575,7 +573,9 @@ static int scatter_data_area(struct tcmu_dev *udev,
|
||||
(*iov)->iov_len = copy_bytes;
|
||||
}
|
||||
if (copy_data) {
|
||||
memcpy(to, from + sg->length - sg_remaining,
|
||||
offset = DATA_BLOCK_SIZE - block_remaining;
|
||||
memcpy(to + offset,
|
||||
from + sg->length - sg_remaining,
|
||||
copy_bytes);
|
||||
tcmu_flush_dcache_range(to, copy_bytes);
|
||||
}
|
||||
@ -637,9 +637,8 @@ static void gather_data_area(struct tcmu_dev *udev, struct tcmu_cmd *cmd,
|
||||
copy_bytes = min_t(size_t, sg_remaining,
|
||||
block_remaining);
|
||||
offset = DATA_BLOCK_SIZE - block_remaining;
|
||||
from += offset;
|
||||
tcmu_flush_dcache_range(from, copy_bytes);
|
||||
memcpy(to + sg->length - sg_remaining, from,
|
||||
memcpy(to + sg->length - sg_remaining, from + offset,
|
||||
copy_bytes);
|
||||
|
||||
sg_remaining -= copy_bytes;
|
||||
|
Loading…
Reference in New Issue
Block a user