diff options
author | Jean Delvare <jdelvare@suse.de> | 2009-03-05 15:45:55 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-03-13 16:25:53 -0400 |
commit | f474a37bc48667595b5653a983b635c95ed82a3b (patch) | |
tree | e8c61e0d9c09eb96eda58a2c68ede724e94d5879 /drivers/scsi | |
parent | 07c00ec449d4d94042063a6900d7d04fdc9f8e62 (diff) |
[SCSI] libiscsi: fix iscsi pool error path
Memory freeing in iscsi_pool_free() looks wrong to me. Either q->pool
can be NULL and this should be tested before dereferencing it, or it
can't be NULL and it shouldn't be tested at all. As far as I can see,
the only case where q->pool is NULL is on early error in
iscsi_pool_init(). One possible way to fix the bug is thus to not
call iscsi_pool_free() in this case (nothing needs to be freed anyway)
and then we can get rid of the q->pool check.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libiscsi.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 809d32d95c76..c33e28fd49bc 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -1944,7 +1944,7 @@ iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size) | |||
1944 | num_arrays++; | 1944 | num_arrays++; |
1945 | q->pool = kzalloc(num_arrays * max * sizeof(void*), GFP_KERNEL); | 1945 | q->pool = kzalloc(num_arrays * max * sizeof(void*), GFP_KERNEL); |
1946 | if (q->pool == NULL) | 1946 | if (q->pool == NULL) |
1947 | goto enomem; | 1947 | return -ENOMEM; |
1948 | 1948 | ||
1949 | q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), | 1949 | q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), |
1950 | GFP_KERNEL, NULL); | 1950 | GFP_KERNEL, NULL); |
@@ -1979,8 +1979,7 @@ void iscsi_pool_free(struct iscsi_pool *q) | |||
1979 | 1979 | ||
1980 | for (i = 0; i < q->max; i++) | 1980 | for (i = 0; i < q->max; i++) |
1981 | kfree(q->pool[i]); | 1981 | kfree(q->pool[i]); |
1982 | if (q->pool) | 1982 | kfree(q->pool); |
1983 | kfree(q->pool); | ||
1984 | kfree(q->queue); | 1983 | kfree(q->queue); |
1985 | } | 1984 | } |
1986 | EXPORT_SYMBOL_GPL(iscsi_pool_free); | 1985 | EXPORT_SYMBOL_GPL(iscsi_pool_free); |