summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaotian Feng <dfeng@redhat.com>2010-11-29 12:03:55 +0300
committerJens Axboe <jaxboe@fusionio.com>2010-11-29 12:04:50 +0300
commit5478755616ae2ef1ce144dded589b62b2a50d575 (patch)
treeb1dffb15dba1a924bba289beb78ea23f34782c9c
parenta115413de13ae6beb0cbfc198afe385a261ab284 (diff)
downloadlinux-5478755616ae2ef1ce144dded589b62b2a50d575.tar.xz
block: check for proper length of iov entries earlier in blk_rq_map_user_iov()
commit 9284bcf checks for proper length of iov entries in blk_rq_map_user_iov(). But if the map is unaligned, kernel will break out the loop without checking for the proper length. So we need to check the proper length before the unalign check. Signed-off-by: Xiaotian Feng <dfeng@redhat.com> Cc: stable@kernel.org Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
-rw-r--r--block/blk-map.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/block/blk-map.c b/block/blk-map.c
index 5d5dbe47c228..e663ac2d8e68 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -201,12 +201,13 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
for (i = 0; i < iov_count; i++) {
unsigned long uaddr = (unsigned long)iov[i].iov_base;
+ if (!iov[i].iov_len)
+ return -EINVAL;
+
if (uaddr & queue_dma_alignment(q)) {
unaligned = 1;
break;
}
- if (!iov[i].iov_len)
- return -EINVAL;
}
if (unaligned || (q->dma_pad_mask & len) || map_data)