diff --git a/drivers/block/loop.c b/drivers/block/loop.c index e3c0ba93c1a3..4ca20ce3158d 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -977,6 +977,9 @@ loop_set_status_from_info(struct loop_device *lo, return -EINVAL; } + if (info->lo_offset < 0 || info->lo_sizelimit < 0) + return -EINVAL; + lo->lo_offset = info->lo_offset; lo->lo_sizelimit = info->lo_sizelimit; memcpy(lo->lo_file_name, info->lo_file_name, LO_NAME_SIZE); diff --git a/include/uapi/linux/loop.h b/include/uapi/linux/loop.h index 6f63527dd2ed..973565f38f9d 100644 --- a/include/uapi/linux/loop.h +++ b/include/uapi/linux/loop.h @@ -53,12 +53,12 @@ struct loop_info64 { __u64 lo_device; /* ioctl r/o */ __u64 lo_inode; /* ioctl r/o */ __u64 lo_rdevice; /* ioctl r/o */ - __u64 lo_offset; - __u64 lo_sizelimit;/* bytes, 0 == max available */ - __u32 lo_number; /* ioctl r/o */ - __u32 lo_encrypt_type; /* obsolete, ignored */ - __u32 lo_encrypt_key_size; /* ioctl w/o */ - __u32 lo_flags; + __s64 lo_offset; + __s64 lo_sizelimit;/* bytes, 0 == max available */ + __s32 lo_number; /* ioctl r/o */ + __s32 lo_encrypt_type; /* obsolete, ignored */ + __s32 lo_encrypt_key_size; /* ioctl w/o */ + __s32 lo_flags; __u8 lo_file_name[LO_NAME_SIZE]; __u8 lo_crypt_name[LO_NAME_SIZE]; __u8 lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */