diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2016-04-09 12:48:18 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2016-04-11 11:49:09 -0400 |
commit | 072623de1f964c7ff01c46a9101af1c822fd2873 (patch) | |
tree | 3ed2b05ecda7041e5225db0dd9ba83e555e0c54c /drivers/md/dm.c | |
parent | bf16200689118d19de1b8d2a3c314fc21f5dc7bb (diff) | |
download | linux-stable-072623de1f964c7ff01c46a9101af1c822fd2873.tar.gz linux-stable-072623de1f964c7ff01c46a9101af1c822fd2873.tar.bz2 linux-stable-072623de1f964c7ff01c46a9101af1c822fd2873.zip |
dm: fix dm_target_io leak if clone_bio() returns an error
Commit c80914e81ec5b08 ("dm: return error if bio_integrity_clone() fails
in clone_bio()") changed clone_bio() such that if it does return error
then the alloc_tio() created resources (both the bio that was allocated
to be a clone and the containing dm_target_io struct) will leak.
Fix this by calling free_tio() in __clone_and_map_data_bio()'s
clone_bio() error path.
Fixes: c80914e81ec5b08 ("dm: return error if bio_integrity_clone() fails in clone_bio()")
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm.c')
-rw-r--r-- | drivers/md/dm.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index be4905769a45..3d3ac13287a4 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1662,8 +1662,10 @@ static int __clone_and_map_data_bio(struct clone_info *ci, struct dm_target *ti, tio = alloc_tio(ci, ti, target_bio_nr); tio->len_ptr = len; r = clone_bio(tio, bio, sector, *len); - if (r < 0) + if (r < 0) { + free_tio(ci->md, tio); break; + } __map_bio(tio); } |