Skip to content

Commit

Permalink
sg_start_req(): make sure that there's not too many elements in iovec
Browse files Browse the repository at this point in the history
commit 451a288 upstream.

unfortunately, allowing an arbitrary 16bit value means a possibility of
overflow in the calculation of total number of pages in bio_map_user_iov() -
we rely on there being no more than PAGE_SIZE members of sum in the
first loop there.  If that sum wraps around, we end up allocating
too small array of pointers to pages and it's easy to overflow it in
the second loop.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
[bwh: s/MAX_UIOVEC/UIO_MAXIOV/. This was fixed upstream by commit
 fdc81f4 ("sg_start_req(): use import_iovec()"), but we don't
 have that function.]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
  • Loading branch information
Al Viro authored and Jiri Slaby committed Aug 4, 2015
1 parent 8c25527 commit aba300b
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions drivers/scsi/sg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1694,6 +1694,9 @@ static int sg_start_req(Sg_request *srp, unsigned char *cmd)
md->from_user = 0;
}

if (unlikely(iov_count > UIO_MAXIOV))
return -EINVAL;

if (iov_count) {
int len, size = sizeof(struct sg_iovec) * iov_count;
struct iovec *iov;
Expand Down

0 comments on commit aba300b

Please sign in to comment.