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++) {


Reply via email to