| From 10b9c3cd8848919561d16570759c0146988cb8d5 Mon Sep 17 00:00:00 2001 |
| From: Jean Delvare <jdelvare@suse.de> |
| Date: Thu, 5 Mar 2009 14:45:55 -0600 |
| Subject: SCSI: libiscsi: fix iscsi pool error path |
| |
| From: Jean Delvare <jdelvare@suse.de> |
| |
| upstream commit: f474a37bc48667595b5653a983b635c95ed82a3b |
| |
| 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> |
| Signed-off-by: Chris Wright <chrisw@sous-sol.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| drivers/scsi/libiscsi.c | 5 ++--- |
| 1 file changed, 2 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/scsi/libiscsi.c |
| +++ b/drivers/scsi/libiscsi.c |
| @@ -1862,7 +1862,7 @@ iscsi_pool_init(struct iscsi_pool *q, in |
| num_arrays++; |
| q->pool = kzalloc(num_arrays * max * sizeof(void*), GFP_KERNEL); |
| if (q->pool == NULL) |
| - goto enomem; |
| + return -ENOMEM; |
| |
| q->queue = kfifo_init((void*)q->pool, max * sizeof(void*), |
| GFP_KERNEL, NULL); |
| @@ -1897,8 +1897,7 @@ void iscsi_pool_free(struct iscsi_pool * |
| |
| for (i = 0; i < q->max; i++) |
| kfree(q->pool[i]); |
| - if (q->pool) |
| - kfree(q->pool); |
| + kfree(q->pool); |
| kfree(q->queue); |
| } |
| EXPORT_SYMBOL_GPL(iscsi_pool_free); |