Skip to content

Commit

Permalink
scatterlist: prevent invalid free when alloc fails
Browse files Browse the repository at this point in the history
When alloc fails, free_table is being called. Depending on the number of
bytes requested, we determine if we are going to call _get_free_page()
or kmalloc(). When alloc fails, our math is wrong (due to sg_size - 1),
and the last buffer is wrongfully assumed to have been allocated by
kmalloc. Hence, kfree gets called and a panic occurs.

Signed-off-by: Jeffrey Carlyle <[email protected]>
Signed-off-by: Olusanya Soyannwo <[email protected]>
Acked-by: Tejun Heo <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
jcarlyle authored and Jens Axboe committed Aug 30, 2010
1 parent b76b401 commit edce682
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/scatterlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,18 @@ int __sg_alloc_table(struct sg_table *table, unsigned int nents,
left -= sg_size;

sg = alloc_fn(alloc_size, gfp_mask);
if (unlikely(!sg))
return -ENOMEM;
if (unlikely(!sg)) {
/*
* Adjust entry count to reflect that the last
* entry of the previous table won't be used for
* linkage. Without this, sg_kfree() may get
* confused.
*/
if (prv)
table->nents = ++table->orig_nents;

return -ENOMEM;
}

sg_init_table(sg, alloc_size);
table->nents = table->orig_nents += sg_size;
Expand Down

0 comments on commit edce682

Please sign in to comment.