Skip to content

Commit 9f6ad5d

Browse files
philzjhaxboe
authored andcommitted
loop: loop_set_status_from_info() check before assignment
In loop_set_status_from_info(), lo->lo_offset and lo->lo_sizelimit should be checked before reassignment, because if an overflow error occurs, the original correct value will be changed to the wrong value, and it will not be changed back. More, the original patch did not solve the problem, the value was set and ioctl returned an error, but the subsequent io used the value in the loop driver, which still caused an alarm: loop_handle_cmd do_req_filebacked loff_t pos = ((loff_t) blk_rq_pos(rq) << 9) + lo->lo_offset; lo_rw_aio cmd->iocb.ki_pos = pos Fixes: c490a0b ("loop: Check for overflow while configuring loop") Signed-off-by: Zhong Jinghua <[email protected]> Reviewed-by: Chaitanya Kulkarni <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent 9c7c4bc commit 9f6ad5d

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/block/loop.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -977,13 +977,13 @@ loop_set_status_from_info(struct loop_device *lo,
977977
return -EINVAL;
978978
}
979979

980+
/* Avoid assigning overflow values */
981+
if (info->lo_offset > LLONG_MAX || info->lo_sizelimit > LLONG_MAX)
982+
return -EOVERFLOW;
983+
980984
lo->lo_offset = info->lo_offset;
981985
lo->lo_sizelimit = info->lo_sizelimit;
982986

983-
/* loff_t vars have been assigned __u64 */
984-
if (lo->lo_offset < 0 || lo->lo_sizelimit < 0)
985-
return -EOVERFLOW;
986-
987987
memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE);
988988
lo->lo_file_name[LO_NAME_SIZE-1] = 0;
989989
lo->lo_flags = info->lo_flags;

0 commit comments

Comments
 (0)