From 439f68e55568f456653024b9d44749e2ccf15a5e Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Thu, 2 Aug 2012 08:51:25 +1000 Subject: [PATCH] CONNECTION: Track the connection state and callback via the context structure Dont free the connection state when login is finished, instead track it via the iscsi context structure and free it once the context is destroyed --- lib/connect.c | 7 ------- lib/init.c | 3 +++ lib/socket.c | 6 +++++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/connect.c b/lib/connect.c index 8e39c40..931f571 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -56,7 +56,6 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status, "failed."); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); } scsi_free_scsi_task(task); return; @@ -74,7 +73,6 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status, ct->cb(iscsi, status?SCSI_STATUS_ERROR:SCSI_STATUS_GOOD, NULL, ct->private_data); - free(ct); scsi_free_scsi_task(task); } @@ -86,7 +84,6 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_, if (status != 0) { ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); return; } @@ -94,7 +91,6 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_, iscsi_testunitready_cb, ct) == NULL) { iscsi_set_error(iscsi, "iscsi_testunitready_async failed."); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); } } @@ -108,14 +104,12 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data _U_ iscsi_set_error(iscsi, "Failed to connect to iSCSI socket. " "%s", iscsi_get_error(iscsi)); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); return; } if (iscsi_login_async(iscsi, iscsi_login_cb, ct) != 0) { iscsi_set_error(iscsi, "iscsi_login_async failed."); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); } } @@ -139,7 +133,6 @@ iscsi_full_connect_async(struct iscsi_context *iscsi, const char *portal, ct->lun = lun; ct->private_data = private_data; if (iscsi_connect_async(iscsi, portal, iscsi_connect_cb, ct) != 0) { - free(ct); return -ENOMEM; } return 0; diff --git a/lib/init.c b/lib/init.c index 979d936..2bb5b5d 100644 --- a/lib/init.c +++ b/lib/init.c @@ -244,6 +244,9 @@ iscsi_destroy_context(struct iscsi_context *iscsi) free(discard_const(iscsi->chap_c)); iscsi->chap_c = NULL; + free(iscsi->connect_data); + iscsi->connect_data = NULL; + free(iscsi); return 0; diff --git a/lib/socket.c b/lib/socket.c index 72d9473..a9048d5 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -68,6 +68,11 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, struct addrinfo *ai = NULL; int socksize; + if (iscsi->connect_data != NULL) { + free(iscsi->connect_data); + } + iscsi->connect_data = private_data; + if (iscsi->fd != -1) { iscsi_set_error(iscsi, "Trying to connect but already connected."); @@ -154,7 +159,6 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, } iscsi->socket_status_cb = cb; - iscsi->connect_data = private_data; set_nonblocking(iscsi->fd);