summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaotian Feng <dfeng@redhat.com>2010-11-29 10:03:55 +0100
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-04-17 16:16:17 -0400
commit7eab63eb262398e1e3b94dee3cc7f96b9ca92abe (patch)
tree1903acbd976361a6430533622fb8ffd5be8294ac
parent799c3ec501854be3d6be56c1db5452e2e8371ef4 (diff)
block: check for proper length of iov entries earlier in blk_rq_map_user_iov()
commit 5478755616ae2ef1ce144dded589b62b2a50d575 upstream. 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> Signed-off-by: Jens Axboe <jaxboe@fusionio.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.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 30a7e5158930..749effa7149c 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)