Hello community, here is the log from the commit of package libiscsi for openSUSE:Factory checked in at 2016-05-11 16:38:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libiscsi (Old) and /work/SRC/openSUSE:Factory/.libiscsi.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libiscsi" Changes: -------- --- /work/SRC/openSUSE:Factory/libiscsi/libiscsi.changes 2016-05-10 09:27:04.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.libiscsi.new/libiscsi.changes 2016-05-11 16:38:06.000000000 +0200 @@ -1,0 +2,7 @@ +Tue May 10 07:45:44 UTC 2016 - [email protected] + +- Update to 1.17.0 (fate#320080) + * Bugfix for a rare condition where if a DATA-OUT PDU has a + callback registered, it can cause a crash on reconnect/timeout. + +------------------------------------------------------------------- Old: ---- libiscsi-1.16.0.tar.gz New: ---- libiscsi-1.17.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libiscsi.spec ++++++ --- /var/tmp/diff_new_pack.8XplQ2/_old 2016-05-11 16:38:07.000000000 +0200 +++ /var/tmp/diff_new_pack.8XplQ2/_new 2016-05-11 16:38:07.000000000 +0200 @@ -18,7 +18,7 @@ %define libname %{name}7 Name: libiscsi -Version: 1.16.0 +Version: 1.17.0 Release: 0 Summary: iSCSI client library and utilities License: GPL-2.0 and LGPL-2.1 @@ -59,7 +59,7 @@ %package devel Summary: Development files for %{name} Group: Development/Languages/C and C++ -Requires: %{libname} = %{version}-%{release} +Requires: %{libname} = %{version} %description devel Development files for %{name} ++++++ libiscsi-1.16.0.tar.gz -> libiscsi-1.17.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/include/iscsi-private.h new/libiscsi-1.17.0/include/iscsi-private.h --- old/libiscsi-1.16.0/include/iscsi-private.h 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/include/iscsi-private.h 2016-05-08 21:37:59.000000000 +0200 @@ -228,8 +228,6 @@ /* There will not be a response to this pdu, so delete it once it is sent on the wire. Don't put it on the wait-queue */ #define ISCSI_PDU_DELETE_WHEN_SENT 0x00000001 -/* Don't call the CANCEL callback when the context is destroyed */ -#define ISCSI_PDU_NO_CALLBACK 0x00000002 /* When reconnecting, just drop all these PDUs. Don't re-queue them. * This includes any DATA-OUT PDU as well as all NOPs. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/Makefile.am new/libiscsi-1.17.0/lib/Makefile.am --- old/libiscsi-1.16.0/lib/Makefile.am 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/Makefile.am 2016-05-08 21:37:59.000000000 +0200 @@ -11,7 +11,7 @@ endif SOCURRENT=7 -SOREVISON=1 +SOREVISON=2 SOAGE=0 libiscsi_la_LDFLAGS = \ -version-info $(SOCURRENT):$(SOREVISON):$(SOAGE) -bindir $(bindir) \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/connect.c new/libiscsi-1.17.0/lib/connect.c --- old/libiscsi-1.16.0/lib/connect.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/connect.c 2016-05-08 21:37:59.000000000 +0200 @@ -270,25 +270,23 @@ while ((pdu = iscsi->outqueue)) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (iscsi->is_loggedin && pdu->callback) { /* If an error happened during connect/login, we don't want to call any of the callbacks. */ - if (iscsi->is_loggedin) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, - NULL, pdu->private_data); - } + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, + NULL, pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - /* If an error happened during connect/login, - we don't want to call any of the callbacks. - */ - if (iscsi->is_loggedin) { + if (iscsi->is_loggedin && pdu->callback) { + /* If an error happened during connect/login, + we don't want to call any of the callbacks. + */ pdu->callback(iscsi, SCSI_STATUS_CANCELLED, - NULL, pdu->private_data); + NULL, pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/discovery.c new/libiscsi-1.17.0/lib/discovery.c --- old/libiscsi-1.16.0/lib/discovery.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/discovery.c 2016-05-08 21:37:59.000000000 +0200 @@ -127,8 +127,10 @@ if (in->hdr[1] != ISCSI_PDU_TEXT_FINAL) { iscsi_set_error(iscsi, "unsupported flags in text " "reply %02x", in->hdr[1]); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return -1; } @@ -141,8 +143,10 @@ iscsi_set_error(iscsi, "NUL not found after offset %ld " "when parsing discovery data", (long)(ptr - in->data)); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -161,8 +165,10 @@ iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -171,8 +177,10 @@ iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target name"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free(iscsi, target); target = NULL; iscsi_free_discovery_addresses(iscsi, targets); @@ -186,8 +194,10 @@ if (targets == NULL) { iscsi_set_error(iscsi, "Invalid discovery " "reply"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -195,8 +205,10 @@ if (portal == NULL) { iscsi_set_error(iscsi, "Failed to malloc " "portal structure"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -209,16 +221,20 @@ iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target address"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } } else { iscsi_set_error(iscsi, "Don't know how to handle " "discovery string : %s", ptr); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -227,7 +243,9 @@ size -= len + 1; } - pdu->callback(iscsi, SCSI_STATUS_GOOD, targets, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_GOOD, targets, pdu->private_data); + } iscsi_free_discovery_addresses(iscsi, targets); return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/init.c new/libiscsi-1.17.0/lib/init.c --- old/libiscsi-1.16.0/lib/init.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/init.c 2016-05-08 21:37:59.000000000 +0200 @@ -304,25 +304,23 @@ while ((pdu = iscsi->outqueue)) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (iscsi->is_loggedin && pdu->callback) { /* If an error happened during connect/login, we don't want to call any of the callbacks. */ - if (iscsi->is_loggedin && pdu->callback != NULL) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, + pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - /* If an error happened during connect/login, we don't want to - call any of the callbacks. - */ - if (iscsi->is_loggedin && pdu->callback != NULL) { + if (iscsi->is_loggedin && pdu->callback) { + /* If an error happened during connect/login, we don't want to + call any of the callbacks. + */ pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); + pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/iscsi-command.c new/libiscsi-1.17.0/lib/iscsi-command.c --- old/libiscsi-1.16.0/lib/iscsi-command.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/iscsi-command.c 2016-05-08 21:37:59.000000000 +0200 @@ -59,15 +59,19 @@ case SCSI_STATUS_CANCELLED: case SCSI_STATUS_TIMEOUT: scsi_cbdata->task->status = status; - scsi_cbdata->callback(iscsi, status, scsi_cbdata->task, - scsi_cbdata->private_data); + if (scsi_cbdata->callback) { + scsi_cbdata->callback(iscsi, status, scsi_cbdata->task, + scsi_cbdata->private_data); + } return; default: scsi_cbdata->task->status = SCSI_STATUS_ERROR; iscsi_set_error(iscsi, "Cant handle scsi status %d yet.", - status); - scsi_cbdata->callback(iscsi, SCSI_STATUS_ERROR, scsi_cbdata->task, - scsi_cbdata->private_data); + status); + if (scsi_cbdata->callback) { + scsi_cbdata->callback(iscsi, SCSI_STATUS_ERROR, scsi_cbdata->task, + scsi_cbdata->private_data); + } } } @@ -86,17 +90,11 @@ ISCSI_PDU_DATA_OUT, ISCSI_PDU_NO_PDU, cmd_pdu->itt, - ISCSI_PDU_DROP_ON_RECONNECT|ISCSI_PDU_DELETE_WHEN_SENT|ISCSI_PDU_NO_CALLBACK); + ISCSI_PDU_DROP_ON_RECONNECT|ISCSI_PDU_DELETE_WHEN_SENT); if (pdu == NULL) { iscsi_set_error(iscsi, "Out-of-memory, Failed to allocate " "scsi data out pdu."); - ISCSI_LIST_REMOVE(&iscsi->outqueue, cmd_pdu); - ISCSI_LIST_REMOVE(&iscsi->waitpdu, cmd_pdu); - cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - cmd_pdu->private_data); - iscsi_free_pdu(iscsi, cmd_pdu); - return -1; - + goto error; } pdu->scsi_cbdata.task = cmd_pdu->scsi_cbdata.task; /* set the cmdsn in the pdu struct so we can compare with @@ -131,25 +129,26 @@ /* update data segment length */ scsi_set_uint32(&pdu->outdata.data[4], pdu->payload_len); - pdu->callback = cmd_pdu->callback; - pdu->private_data = cmd_pdu->private_data; - if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi " "scsi pdu."); - ISCSI_LIST_REMOVE(&iscsi->outqueue, cmd_pdu); - ISCSI_LIST_REMOVE(&iscsi->waitpdu, cmd_pdu); - cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - cmd_pdu->private_data); - iscsi_free_pdu(iscsi, cmd_pdu); - iscsi_free_pdu(iscsi, pdu); - return -1; + goto error; } tot_len -= len; offset += len; } return 0; + +error: + ISCSI_LIST_REMOVE(&iscsi->outqueue, cmd_pdu); + ISCSI_LIST_REMOVE(&iscsi->waitpdu, cmd_pdu); + if (cmd_pdu->callback) { + cmd_pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + cmd_pdu->private_data); + } + iscsi_free_pdu(iscsi, cmd_pdu); + return -1; } static int @@ -373,15 +372,19 @@ if ((flags&ISCSI_PDU_DATA_FINAL) == 0) { iscsi_set_error(iscsi, "scsi response pdu but Final bit is " "not set: 0x%02x.", flags); - pdu->callback(iscsi, SCSI_STATUS_ERROR, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, task, + pdu->private_data); + } return -1; } if ((flags&ISCSI_PDU_DATA_ACK_REQUESTED) != 0) { iscsi_set_error(iscsi, "scsi response asked for ACK " "0x%02x.", flags); - pdu->callback(iscsi, SCSI_STATUS_ERROR, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, task, + pdu->private_data); + } return -1; } @@ -395,8 +398,10 @@ if (response != 0) { iscsi_set_error(iscsi, "protocol error: flags %#02x;" " response %#02x.", flags, response); - pdu->callback(iscsi, SCSI_STATUS_ERROR, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, task, + pdu->private_data); + } return -1; } task->residual = scsi_get_uint32(&in->hdr[44]); @@ -424,8 +429,10 @@ pdu->indata.data = NULL; pdu->indata.size = 0; - pdu->callback(iscsi, SCSI_STATUS_GOOD, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_GOOD, task, + pdu->private_data); + } break; case SCSI_STATUS_CHECK_CONDITION: task->datain.size = in->data_pos; @@ -443,39 +450,52 @@ task->sense.key, scsi_sense_ascq_str(task->sense.ascq), task->sense.ascq); - pdu->callback(iscsi, SCSI_STATUS_CHECK_CONDITION, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_CHECK_CONDITION, task, + pdu->private_data); + } break; case SCSI_STATUS_RESERVATION_CONFLICT: iscsi_set_error(iscsi, "RESERVATION CONFLICT"); - pdu->callback(iscsi, SCSI_STATUS_RESERVATION_CONFLICT, - task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_RESERVATION_CONFLICT, + task, pdu->private_data); + } break; case SCSI_STATUS_TASK_SET_FULL: iscsi_set_error(iscsi, "TASK_SET_FULL"); - pdu->callback(iscsi, SCSI_STATUS_TASK_SET_FULL, - task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_TASK_SET_FULL, + task, pdu->private_data); + } break; case SCSI_STATUS_ACA_ACTIVE: iscsi_set_error(iscsi, "ACA_ACTIVE"); - pdu->callback(iscsi, SCSI_STATUS_ACA_ACTIVE, - task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ACA_ACTIVE, + task, pdu->private_data); + } break; case SCSI_STATUS_TASK_ABORTED: iscsi_set_error(iscsi, "TASK_ABORTED"); - pdu->callback(iscsi, SCSI_STATUS_TASK_ABORTED, - task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_TASK_ABORTED, + task, pdu->private_data); + } break; case SCSI_STATUS_BUSY: iscsi_set_error(iscsi, "BUSY"); - pdu->callback(iscsi, SCSI_STATUS_BUSY, - task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_BUSY, + task, pdu->private_data); + } break; default: iscsi_set_error(iscsi, "Unknown SCSI status :%d.", status); - - pdu->callback(iscsi, SCSI_STATUS_ERROR, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, + task, pdu->private_data); + } return -1; } @@ -495,8 +515,10 @@ if ((flags&ISCSI_PDU_DATA_ACK_REQUESTED) != 0) { iscsi_set_error(iscsi, "scsi response asked for ACK " "0x%02x.", flags); - pdu->callback(iscsi, SCSI_STATUS_ERROR, task, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, task, + pdu->private_data); + } return -1; } dsl = scsi_get_uint32(&in->hdr[4]) & 0x00ffffff; @@ -553,7 +575,9 @@ pdu->indata.data = NULL; pdu->indata.size = 0; - pdu->callback(iscsi, status, task, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, status, task, pdu->private_data); + } return 0; } @@ -1894,7 +1918,7 @@ for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { if (pdu->itt == task->itt) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } @@ -1905,7 +1929,7 @@ for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { if (pdu->itt == task->itt) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } @@ -1923,7 +1947,7 @@ while ((pdu = iscsi->waitpdu)) { ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } @@ -1931,7 +1955,7 @@ } while ((pdu = iscsi->outqueue)) { ISCSI_LIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, pdu->private_data); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/login.c new/libiscsi-1.17.0/lib/login.c --- old/libiscsi-1.16.0/lib/login.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/login.c 2016-05-08 21:37:59.000000000 +0200 @@ -1082,8 +1082,10 @@ iscsi_set_error(iscsi, "NUL not found after offset %ld " "when parsing login data", (long)((unsigned char *)ptr - in->data)); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return -1; } @@ -1161,8 +1163,10 @@ if (len-9 > MAX_CHAP_C_LENGTH) { iscsi_set_error(iscsi, "Wrong length of CHAP_C received from" " target (%d, max: %d)", len-9, MAX_CHAP_C_LENGTH); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } *iscsi->chap_c = '\0'; @@ -1175,8 +1179,10 @@ iscsi_set_error(iscsi, "Failed to log in to" " target. Wrong CHAP targetname" " received: %s", ptr + 7); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } must_have_chap_n = 0; @@ -1188,8 +1194,10 @@ if (len != 9 + 2 * CHAP_R_SIZE) { iscsi_set_error(iscsi, "Wrong size of CHAP_R" " received from target."); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } for (i = 0; i < CHAP_R_SIZE; i++) { @@ -1199,8 +1207,10 @@ iscsi_set_error(iscsi, "Authentication " "failed. Invalid CHAP_R " "response from the target"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, - NULL, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, + NULL, pdu->private_data); + } return 0; } } @@ -1213,32 +1223,40 @@ if (status == SCSI_STATUS_REDIRECT && iscsi->target_address[0]) { ISCSI_LOG(iscsi, 2, "target requests redirect to %s",iscsi->target_address); - pdu->callback(iscsi, SCSI_STATUS_REDIRECT, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_REDIRECT, NULL, + pdu->private_data); + } return 0; } if (status != 0) { iscsi_set_error(iscsi, "Failed to log in to target. Status: %s(%d)", login_error_str(status), status); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } if (must_have_chap_n) { iscsi_set_error(iscsi, "Failed to log in to target. " "It did not return CHAP_N during SECNEG."); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } if (must_have_chap_r) { iscsi_set_error(iscsi, "Failed to log in to target. " "It did not return CHAP_R during SECNEG."); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, + pdu->private_data); + } return 0; } @@ -1256,7 +1274,9 @@ } else { if (iscsi_login_async(iscsi, pdu->callback, pdu->private_data) != 0) { iscsi_set_error(iscsi, "Failed to send continuation login pdu"); - pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); + } } } @@ -1315,7 +1335,9 @@ { iscsi->is_loggedin = 0; ISCSI_LOG(iscsi, 2, "logout successful"); - pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data); + } return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/nop.c new/libiscsi-1.17.0/lib/nop.c --- old/libiscsi-1.16.0/lib/nop.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/nop.c 2016-05-08 21:37:59.000000000 +0200 @@ -101,7 +101,7 @@ ISCSI_PDU_NOP_OUT, ISCSI_PDU_NO_PDU, 0xffffffff, - ISCSI_PDU_DROP_ON_RECONNECT|ISCSI_PDU_DELETE_WHEN_SENT|ISCSI_PDU_NO_CALLBACK); + ISCSI_PDU_DROP_ON_RECONNECT|ISCSI_PDU_DELETE_WHEN_SENT); if (pdu == NULL) { iscsi_set_error(iscsi, "Failed to allocate nop-out pdu"); return -1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/pdu.c new/libiscsi-1.17.0/lib/pdu.c --- old/libiscsi-1.16.0/lib/pdu.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/pdu.c 2016-05-08 21:37:59.000000000 +0200 @@ -365,7 +365,7 @@ if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, - pdu->private_data); + pdu->private_data); } ISCSI_LIST_REMOVE(&iscsi->waitpdu, pdu); @@ -708,7 +708,7 @@ iscsi_dump_pdu_header(iscsi, pdu->outdata.data); if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, - NULL, pdu->private_data); + NULL, pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } @@ -728,7 +728,7 @@ iscsi_dump_pdu_header(iscsi, pdu->outdata.data); if (pdu->callback) { pdu->callback(iscsi, SCSI_STATUS_TIMEOUT, - NULL, pdu->private_data); + NULL, pdu->private_data); } iscsi_free_pdu(iscsi, pdu); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/lib/task_mgmt.c new/libiscsi-1.17.0/lib/task_mgmt.c --- old/libiscsi-1.16.0/lib/task_mgmt.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/lib/task_mgmt.c 2016-05-08 21:37:59.000000000 +0200 @@ -78,7 +78,6 @@ /* rcmdsn */ iscsi_pdu_set_rcmdsn(pdu, rcmdsn); - pdu->callback = cb; pdu->private_data = private_data; @@ -97,7 +96,9 @@ { uint32_t response = in->hdr[2]; - pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data); + if (pdu->callback) { + pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data); + } return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/packaging/RPM/libiscsi.spec.in new/libiscsi-1.17.0/packaging/RPM/libiscsi.spec.in --- old/libiscsi-1.16.0/packaging/RPM/libiscsi.spec.in 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/packaging/RPM/libiscsi.spec.in 2016-05-08 21:37:59.000000000 +0200 @@ -1,6 +1,6 @@ Name: libiscsi Summary: iSCSI client library -Version: 1.16.0 +Version: 1.17.0 Release: 1GITHASH%{?dist} License: LGPLv2+ Group: System Environment/Libraries @@ -110,6 +110,8 @@ %changelog +* Sun May 8 2016 : 1.0.17 + - Fix a rare bug with DATA-OUT callbacks causing a crash on reconnect/timeout. * Sun May 1 2016 : 1.0.16 - Various test updates. - Add tests for ExtendedCopy and ReceiveCopyResults diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libiscsi-1.16.0/test-tool/iscsi-test-cu.c new/libiscsi-1.17.0/test-tool/iscsi-test-cu.c --- old/libiscsi-1.16.0/test-tool/iscsi-test-cu.c 2016-05-02 00:55:58.000000000 +0200 +++ new/libiscsi-1.17.0/test-tool/iscsi-test-cu.c 2016-05-08 21:37:59.000000000 +0200 @@ -1094,6 +1094,8 @@ }; int i, c; int opt_idx = 0; + unsigned int failures = 0; + int ret; while ((c = getopt_long(argc, argv, "?hli:I:t:sdgfAsSnvxV", long_opts, &opt_idx)) > 0) { @@ -1445,6 +1447,7 @@ printf("Tests completed with return value: %d\n", res); } + failures = CU_get_number_of_failures(); CU_cleanup_registry(); if (inq_task != NULL) { @@ -1469,7 +1472,12 @@ free_scsi_device(mp_sds[i]); } free(scratch); - return 0; + if (failures > 0) { + ret = 1; + } else { + ret = 0; + } + return ret; err_sds_free: for (i = 0; i < mp_num_sds; i++) {
