Hello community,

here is the log from the commit of package istgt for openSUSE:Factory checked 
in at 2013-07-15 09:48:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/istgt (Old)
 and      /work/SRC/openSUSE:Factory/.istgt.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "istgt"

Changes:
--------
--- /work/SRC/openSUSE:Factory/istgt/istgt.changes      2013-04-12 
20:33:20.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.istgt.new/istgt.changes 2013-07-15 
09:48:02.000000000 +0200
@@ -1,0 +2,15 @@
+Wed Jul 10 14:03:25 UTC 2013 - dd...@suse.com
+
+- Add SCSI target fixes:
+  + disk-support-0-len-read-and-write-CBDs.patch
+  + lu-perform-lba-range-check-before-0-byte-fastpath.patch
+  + lu-add-sense-data-to-out-of-range-read-and-write-err.patch
+
+- Cleanup shutdown logic:
+  + iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
+
+- Remove openssl dependency:
+  + md5-add-RFC1321-based-RSA-free-MD5-library.patch
+  + md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch
+
+-------------------------------------------------------------------

New:
----
  disk-support-0-len-read-and-write-CBDs.patch
  iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
  lu-add-sense-data-to-out-of-range-read-and-write-err.patch
  lu-perform-lba-range-check-before-0-byte-fastpath.patch
  md5-add-RFC1321-based-RSA-free-MD5-library.patch
  md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ istgt.spec ++++++
--- /var/tmp/diff_new_pack.Np7K3C/_old  2013-07-15 09:48:04.000000000 +0200
+++ /var/tmp/diff_new_pack.Np7K3C/_new  2013-07-15 09:48:04.000000000 +0200
@@ -27,14 +27,15 @@
 Source:         istgt-%{upstreamrel}.tar.gz
 Requires:       bash
 BuildRequires:  autoconf
-%if 0%{?fedora_version} || 0%{?rhel_version}
-BuildRequires:  openssl-devel
-%else
-BuildRequires:  libopenssl-devel
-%endif
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 Patch1:         fix-installdir.patch
 Patch2:         add-istgtcontrol-manpage.patch
+Patch3:         disk-support-0-len-read-and-write-CBDs.patch
+Patch4:         lu-perform-lba-range-check-before-0-byte-fastpath.patch
+Patch5:         lu-add-sense-data-to-out-of-range-read-and-write-err.patch
+Patch6:         iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch
+Patch7:         md5-add-RFC1321-based-RSA-free-MD5-library.patch
+Patch8:         md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch
 
 %description
 This software (istgt) is the implementation of iSCSI target
@@ -56,6 +57,13 @@
 %setup -q -n istgt-%{upstreamrel}
 %patch1 -p1
 %patch2 -p1
+%patch3 -p0
+%patch4 -p0
+%patch5 -p0
+%patch6 -p0
+%patch7 -p0
+%patch8 -p0
+
 autoconf
 
 %build

++++++ disk-support-0-len-read-and-write-CBDs.patch ++++++
>From 4441406e6bfd8de8fedde118bc08346e449c9eb4 Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Tue, 26 Mar 2013 17:51:10 +0100
Subject: [PATCH 1/7] disk: support 0 len read and write CBDs

---
 src/istgt_lu_disk.c | 78 ++++++++++++++++++++++++++++-------------------------
 1 file changed, 42 insertions(+), 36 deletions(-)

diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c
index bf0e1b4..2850955 100644
--- src/istgt_lu_disk.c
+++ src/istgt_lu_disk.c
@@ -6077,12 +6077,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->R_bit == 0) {
-                               ISTGT_ERRLOG("R_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6091,6 +6085,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "READ_10(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("R_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6113,12 +6114,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->R_bit == 0) {
-                               ISTGT_ERRLOG("R_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6127,6 +6122,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "READ_12(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("R_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6149,12 +6151,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->R_bit == 0) {
-                               ISTGT_ERRLOG("R_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6163,6 +6159,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "READ_16(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->R_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("R_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbread(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbread() failed\n");
@@ -6220,12 +6223,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->W_bit == 0) {
-                               ISTGT_ERRLOG("W_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6234,6 +6231,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "WRITE_10(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("W_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
@@ -6257,12 +6261,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->W_bit == 0) {
-                               ISTGT_ERRLOG("W_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6271,6 +6269,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "WRITE_12(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("W_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
@@ -6294,12 +6299,6 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                                }
                        }
 
-                       if (lu_cmd->W_bit == 0) {
-                               ISTGT_ERRLOG("W_bit == 0\n");
-                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
-                               return -1;
-                       }
-
                        dpo = BGET8(&cdb[1], 4);
                        fua = BGET8(&cdb[1], 3);
                        fua_nv = BGET8(&cdb[1], 1);
@@ -6308,6 +6307,13 @@ istgt_lu_disk_execute(CONN_Ptr conn, ISTGT_LU_CMD_Ptr 
lu_cmd)
                        ISTGT_TRACELOG(ISTGT_TRACE_SCSI,
                            "WRITE_16(lba %"PRIu64", len %u blocks)\n",
                            lba, transfer_len);
+
+                       if ((lu_cmd->W_bit == 0) && (transfer_len > 0)) {
+                               ISTGT_ERRLOG("W_bit == 0\n");
+                               lu_cmd->status = 
ISTGT_SCSI_STATUS_CHECK_CONDITION;
+                               return -1;
+                       }
+
                        rc = istgt_lu_disk_lbwrite(spec, conn, lu_cmd, lba, 
transfer_len);
                        if (rc < 0) {
                                ISTGT_ERRLOG("lu_disk_lbwrite() failed\n");
-- 
1.8.1.4

++++++ iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch ++++++
>From 88f929d2c17739e88eaed15fe22c6c898c7dde4d Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Wed, 27 Mar 2013 18:30:27 +0100
Subject: [PATCH 4/7] iscsi: cancel conn worker threads using the task_pipe

Currently istgt_iscsi_drop_*_conns() use pthread_cancel() to tell the
connection worker thread to exit. This is unnecessary, as the worker
thread already accepts exit requests via the task_pipe.
---
 src/istgt_iscsi.c | 87 ++++++++++---------------------------------------------
 1 file changed, 16 insertions(+), 71 deletions(-)

diff --git src/istgt_iscsi.c src/istgt_iscsi.c
index 1ca226c..5fa5fbc 100644
--- src/istgt_iscsi.c
+++ src/istgt_iscsi.c
@@ -5260,9 +5260,8 @@ wait_all_task(CONN_Ptr conn)
 }
 
 static void
-worker_cleanup(void *arg)
+worker_cleanup(CONN_Ptr conn)
 {
-       CONN_Ptr conn = (CONN_Ptr) arg;
        ISTGT_LU_Ptr lu;
        int rc;
 
@@ -5534,9 +5533,6 @@ worker(void *arg)
        conn->exec_lu_task = NULL;
        lu_task = NULL;
 
-       pthread_cleanup_push(worker_cleanup, conn);
-       pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-
        conn->use_sender = 0;
        if (conn->istgt->swmode >= ISTGT_SWMODE_NORMAL) {
                /* create sender thread */
@@ -5585,7 +5581,6 @@ worker(void *arg)
                        }
                }
 
-               pthread_testcancel();
                if (conn->state != CONN_STATE_RUNNING) {
                        break;
                }
@@ -5701,9 +5696,6 @@ worker(void *arg)
                execute_pdu:
                        opcode = BGET8W(&conn->pdu.bhs.opcode, 5, 6);
 
-#if 0
-                       pthread_testcancel();
-#endif
                        if (conn->state != CONN_STATE_RUNNING) {
                                break;
                        }
@@ -5913,62 +5905,7 @@ worker(void *arg)
 
     cleanup_exit:
        ;
-       pthread_cleanup_pop(0);
-       conn->state = CONN_STATE_EXITING;
-       if (conn->sess != NULL) {
-               SESS_MTX_LOCK(conn);
-               lu = conn->sess->lu;
-               if (lu != NULL && lu->queue_depth != 0) {
-                       rc = istgt_lu_clear_task_IT(conn, lu);
-                       if (rc < 0) {
-                               ISTGT_ERRLOG("lu_clear_task_IT() failed\n");
-                       }
-                       istgt_clear_all_transfer_task(conn);
-               }
-               SESS_MTX_UNLOCK(conn);
-       }
-       if (conn->pdu.copy_pdu == 0) {
-               xfree(conn->pdu.ahs);
-               conn->pdu.ahs = NULL;
-               if (conn->pdu.data != conn->pdu.shortdata) {
-                       xfree(conn->pdu.data);
-               }
-               conn->pdu.data = NULL;
-       }
-       wait_all_task(conn);
-
-       if (conn->use_sender) {
-               ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "stop sender thread (%d)\n", 
conn->id);
-               /* stop sender thread */
-               MTX_LOCK(&conn->result_queue_mutex);
-               rc = pthread_cond_broadcast(&conn->result_queue_cond);
-               MTX_UNLOCK(&conn->result_queue_mutex);
-               if (rc != 0) {
-                       ISTGT_ERRLOG("cond_broadcast() failed\n");
-                       /* ignore errors */
-               }
-               rc = pthread_join(conn->sender_thread, NULL);
-               if (rc != 0) {
-                       ISTGT_ERRLOG("pthread_join() failed\n");
-                       /* ignore errors */
-               }
-       }
-
-       close(conn->sock);
-#ifdef ISTGT_USE_KQUEUE
-       close(kq);
-       conn->kq = -1;
-#endif /* ISTGT_USE_KQUEUE */
-       sleep(1);
-       ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "worker %d end\n", conn->id);
-
-       /* cleanup conn & sess */
-       ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "cleanup LOCK\n");
-       MTX_LOCK(&g_conns_mutex);
-       g_conns[conn->id] = NULL;
-       istgt_remove_conn(conn);
-       MTX_UNLOCK(&g_conns_mutex);
-       ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "cleanup UNLOCK\n");
+       worker_cleanup(conn);
 
        return NULL;
 }
@@ -6697,7 +6634,6 @@ istgt_iscsi_drop_all_conns(CONN_Ptr conn)
        istgt_yield();
        sleep(1);
        if (num > max_conns + 1) {
-               printf("try pthread_cancel\n");
                for (i = 0; i < g_nconns; i++) {
                        xconn = g_conns[i];
                        if (xconn == NULL)
@@ -6719,9 +6655,14 @@ istgt_iscsi_drop_all_conns(CONN_Ptr conn)
                                            xconn->initiator_addr,
                                            xconn->cid);
                                }
-                               rc = pthread_cancel(xconn->thread);
+                               rc = write(xconn->task_pipe[1], "E", 1);
+                               if (rc < 0 || rc != 1) {
+                                       ISTGT_ERRLOG("write() failed\n");
+                                       continue;
+                               }
+                               rc = pthread_join(xconn->thread, NULL);
                                if (rc != 0) {
-                                       ISTGT_ERRLOG("pthread_cancel() failed 
rc=%d\n", rc);
+                                       ISTGT_ERRLOG("pthread_join() failed 
rc=%d\n", rc);
                                }
                        }
                }
@@ -6781,7 +6722,6 @@ istgt_iscsi_drop_old_conns(CONN_Ptr conn)
        istgt_yield();
        sleep(1);
        if (num > max_conns + 1) {
-               printf("try pthread_cancel\n");
                for (i = 0; i < g_nconns; i++) {
                        xconn = g_conns[i];
                        if (xconn == NULL)
@@ -6803,9 +6743,14 @@ istgt_iscsi_drop_old_conns(CONN_Ptr conn)
                                            xconn->initiator_addr,
                                            xconn->cid);
                                }
-                               rc = pthread_cancel(xconn->thread);
+                               rc = write(xconn->task_pipe[1], "E", 1);
+                               if (rc < 0 || rc != 1) {
+                                       ISTGT_ERRLOG("write() failed\n");
+                                       continue;
+                               }
+                               rc = pthread_join(xconn->thread, NULL);
                                if (rc != 0) {
-                                       ISTGT_ERRLOG("pthread_cancel() failed 
rc=%d\n", rc);
+                                       ISTGT_ERRLOG("pthread_join() failed 
rc=%d\n", rc);
                                }
                        }
                }
-- 
1.8.1.4

++++++ lu-add-sense-data-to-out-of-range-read-and-write-err.patch ++++++
>From 27cfa2b5fd417d6ba7cf72486c90e203314f569e Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Tue, 26 Mar 2013 18:56:32 +0100
Subject: [PATCH 3/7] lu: add sense data to out of range read and write errors

ILLEGAL_REQUEST/LOGICAL BLOCK ADDRESS OUT OF RANGE.
---
 src/istgt_lu_disk.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c
index 277e8d2..807b47f 100644
--- src/istgt_lu_disk.c
+++ src/istgt_lu_disk.c
@@ -4031,7 +4031,13 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn 
__attribute__((__unused_
            maxlba, lba, len);
 
        if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) {
+               uint8_t *sense_data;
+               size_t *sense_len;
                ISTGT_ERRLOG("end of media\n");
+               sense_data = lu_cmd->sense_data;
+               sense_len = &lu_cmd->sense_data_len;
+               *sense_len = 0;
+               BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00);
                return -1;
        }
 
@@ -4090,7 +4096,13 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr 
conn, ISTGT_LU_CMD_Ptr lu_cm
            maxlba, lba, len);
 
        if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) {
+               uint8_t *sense_data;
+               size_t *sense_len;
                ISTGT_ERRLOG("end of media\n");
+               sense_data = lu_cmd->sense_data;
+               sense_len = &lu_cmd->sense_data_len;
+               *sense_len = 0;
+               BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00);
                return -1;
        }
 
@@ -4150,12 +4162,18 @@ istgt_lu_disk_lbwrite_same(ISTGT_LU_DISK *spec, 
CONN_Ptr conn, ISTGT_LU_CMD_Ptr
        uint64_t nblocks;
        uint64_t wblocks;
        int64_t rc;
+       uint8_t *sense_data;
+       size_t *sense_len;
 
+       sense_data = lu_cmd->sense_data;
+       sense_len = &lu_cmd->sense_data_len;
+       *sense_len = 0;
        maxlba = spec->blockcnt;
        llen = (uint64_t) len;
        if (llen == 0) {
                if (lba >= maxlba) {
                        ISTGT_ERRLOG("end of media\n");
+                       BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00);
                        return -1;
                }
                llen = maxlba - lba;
@@ -4170,6 +4188,7 @@ istgt_lu_disk_lbwrite_same(ISTGT_LU_DISK *spec, CONN_Ptr 
conn, ISTGT_LU_CMD_Ptr
 
        if (lba >= maxlba || llen > maxlba || lba > (maxlba - llen)) {
                ISTGT_ERRLOG("end of media\n");
+               BUILD_SENSE(ILLEGAL_REQUEST, 0x21, 0x00);
                return -1;
        }
 
-- 
1.8.1.4

++++++ lu-perform-lba-range-check-before-0-byte-fastpath.patch ++++++
>From 87d106f8ab70594bb6456122da9b1f9e0d5328c9 Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Tue, 26 Mar 2013 18:14:50 +0100
Subject: [PATCH 2/7] lu: perform lba range check before 0 byte fastpath

0 byte IOs are subject to the same lba checks as normal IOs.
---
 src/istgt_lu_disk.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git src/istgt_lu_disk.c src/istgt_lu_disk.c
index 2850955..277e8d2 100644
--- src/istgt_lu_disk.c
+++ src/istgt_lu_disk.c
@@ -4020,12 +4020,6 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn 
__attribute__((__unused_
        uint64_t nbytes;
        int64_t rc;
 
-       if (len == 0) {
-               lu_cmd->data = NULL;
-               lu_cmd->data_len = 0;
-               return 0;
-       }
-
        maxlba = spec->blockcnt;
        llen = (uint64_t) len;
        blen = spec->blocklen;
@@ -4041,6 +4035,12 @@ istgt_lu_disk_lbread(ISTGT_LU_DISK *spec, CONN_Ptr conn 
__attribute__((__unused_
                return -1;
        }
 
+       if (len == 0) {
+               lu_cmd->data = NULL;
+               lu_cmd->data_len = 0;
+               return 0;
+       }
+
        if (nbytes > lu_cmd->iobufsize) {
                ISTGT_ERRLOG("nbytes(%zu) > iobufsize(%zu)\n",
                    (size_t) nbytes, lu_cmd->iobufsize);
@@ -4079,11 +4079,6 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr 
conn, ISTGT_LU_CMD_Ptr lu_cm
        uint64_t nbytes;
        int64_t rc;
 
-       if (len == 0) {
-               lu_cmd->data_len = 0;
-               return 0;
-       }
-
        maxlba = spec->blockcnt;
        llen = (uint64_t) len;
        blen = spec->blocklen;
@@ -4099,6 +4094,11 @@ istgt_lu_disk_lbwrite(ISTGT_LU_DISK *spec, CONN_Ptr 
conn, ISTGT_LU_CMD_Ptr lu_cm
                return -1;
        }
 
+       if (len == 0) {
+               lu_cmd->data_len = 0;
+               return 0;
+       }
+
        if (nbytes > lu_cmd->iobufsize) {
                ISTGT_ERRLOG("nbytes(%zu) > iobufsize(%zu)\n",
                    (size_t) nbytes, lu_cmd->iobufsize);
-- 
1.8.1.4

++++++ md5-add-RFC1321-based-RSA-free-MD5-library.patch ++++++
>From 901515c5a232f635a0fb0f38ca158c37f8993836 Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Fri, 5 Apr 2013 16:08:07 +0200
Subject: [PATCH 5/7] md5: add RFC1321-based (RSA-free) MD5 library

Obtained from http://libmd5-rfc.sourceforge.net/:
This is a very small C library implementing RFC1321, the MD5 message
digest function. Unlike the existing W3C libmd5, it was written from the
specifications (not the sample code) in RFC1321, and therefore is not
required to acknowledge RSA in any way.
---
 src/Makefile.in |   8 +-
 src/md5.c       | 381 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/md5.h       |  91 ++++++++++++++
 3 files changed, 476 insertions(+), 4 deletions(-)
 create mode 100644 src/md5.c
 create mode 100644 src/md5.h

diff --git src/Makefile.in src/Makefile.in
index ee223a3..efd7906 100644
--- src/Makefile.in
+++ src/Makefile.in
@@ -38,18 +38,18 @@ source   = istgt.c istgt_iscsi.c istgt_iscsi_param.c \
        istgt_lu.c istgt_lu_disk.c istgt_lu_disk_vbox.c \
        istgt_lu_dvd.c istgt_lu_tape.c istgt_lu_pass.c istgt_lu_ctl.c \
        istgt_log.c istgt_conf.c istgt_sock.c istgt_misc.c \
-       istgt_queue.c istgt_crc32c.c istgt_md5.c
+       istgt_queue.c istgt_crc32c.c istgt_md5.c md5.c
 header   = istgt_ver.h istgt.h istgt_iscsi.h istgt_iscsi_param.h \
        istgt_scsi.h istgt_proto.h istgt_lu.h \
        istgt_log.h istgt_conf.h istgt_sock.h \
-       istgt_misc.h istgt_queue.h istgt_crc32c.h istgt_md5.h
+       istgt_misc.h istgt_queue.h istgt_crc32c.h istgt_md5.h md5.h
 document = 
 sample   = 
 
 ctl_source = istgtcontrol.c istgt_conf.c istgt_log.c istgt_sock.c istgt_misc.c 
\
-       istgt_md5.c
+       istgt_md5.c md5.c
 ctl_header = istgt_ver.h istgt_conf.h istgt_log.h istgt_sock.h istgt_misc.h \
-       istgt_md5.h
+       istgt_md5.h md5.h
 
 ISTGT    = $(source:.c=.o)
 ISTGTCONTROL = $(ctl_source:.c=.o)
diff --git src/md5.c src/md5.c
new file mode 100644
index 0000000..c35d96c
--- /dev/null
+++ src/md5.c
@@ -0,0 +1,381 @@
+/*
+  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  L. Peter Deutsch
+  gh...@aladdin.com
+
+ */
+/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
+/*
+  Independent implementation of MD5 (RFC 1321).
+
+  This code implements the MD5 Algorithm defined in RFC 1321, whose
+  text is available at
+       http://www.ietf.org/rfc/rfc1321.txt
+  The code is derived from the text of the RFC, including the test suite
+  (section A.5) but excluding the rest of Appendix A.  It does not include
+  any code or documentation that is identified in the RFC as being
+  copyrighted.
+
+  The original and principal author of md5.c is L. Peter Deutsch
+  <gh...@aladdin.com>.  Other authors are noted in the change history
+  that follows (in reverse chronological order):
+
+  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
+       either statically or dynamically; added missing #include <string.h>
+       in library.
+  2002-03-11 lpd Corrected argument list for main(), and added int return
+       type, in test program and T value program.
+  2002-02-21 lpd Added missing #include <stdio.h> in test program.
+  2000-07-03 lpd Patched to eliminate warnings about "constant is
+       unsigned in ANSI C, signed in traditional"; made test program
+       self-checking.
+  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
+  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
+  1999-05-03 lpd Original version.
+ */
+
+#include "md5.h"
+#include <string.h>
+
+#undef BYTE_ORDER      /* 1 = big-endian, -1 = little-endian, 0 = unknown */
+#ifdef ARCH_IS_BIG_ENDIAN
+#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
+#else
+#  define BYTE_ORDER 0
+#endif
+
+#define T_MASK ((md5_word_t)~0)
+#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
+#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
+#define T3    0x242070db
+#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
+#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
+#define T6    0x4787c62a
+#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
+#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
+#define T9    0x698098d8
+#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
+#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
+#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
+#define T13    0x6b901122
+#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
+#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
+#define T16    0x49b40821
+#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
+#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
+#define T19    0x265e5a51
+#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
+#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
+#define T22    0x02441453
+#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
+#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
+#define T25    0x21e1cde6
+#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
+#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
+#define T28    0x455a14ed
+#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
+#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
+#define T31    0x676f02d9
+#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
+#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
+#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
+#define T35    0x6d9d6122
+#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
+#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
+#define T38    0x4bdecfa9
+#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
+#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
+#define T41    0x289b7ec6
+#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
+#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
+#define T44    0x04881d05
+#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
+#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
+#define T47    0x1fa27cf8
+#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
+#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
+#define T50    0x432aff97
+#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
+#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
+#define T53    0x655b59c3
+#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
+#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
+#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
+#define T57    0x6fa87e4f
+#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
+#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
+#define T60    0x4e0811a1
+#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
+#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
+#define T63    0x2ad7d2bb
+#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
+
+
+static void
+md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
+{
+    md5_word_t
+       a = pms->abcd[0], b = pms->abcd[1],
+       c = pms->abcd[2], d = pms->abcd[3];
+    md5_word_t t;
+#if BYTE_ORDER > 0
+    /* Define storage only for big-endian CPUs. */
+    md5_word_t X[16];
+#else
+    /* Define storage for little-endian or both types of CPUs. */
+    md5_word_t xbuf[16];
+    const md5_word_t *X;
+#endif
+
+    {
+#if BYTE_ORDER == 0
+       /*
+        * Determine dynamically whether this is a big-endian or
+        * little-endian machine, since we can use a more efficient
+        * algorithm on the latter.
+        */
+       static const int w = 1;
+
+       if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
+#endif
+#if BYTE_ORDER <= 0            /* little-endian */
+       {
+           /*
+            * On little-endian machines, we can process properly aligned
+            * data without copying it.
+            */
+           if (!((data - (const md5_byte_t *)0) & 3)) {
+               /* data are properly aligned */
+               X = (const md5_word_t *)data;
+           } else {
+               /* not aligned */
+               memcpy(xbuf, data, 64);
+               X = xbuf;
+           }
+       }
+#endif
+#if BYTE_ORDER == 0
+       else                    /* dynamic big-endian */
+#endif
+#if BYTE_ORDER >= 0            /* big-endian */
+       {
+           /*
+            * On big-endian machines, we must arrange the bytes in the
+            * right order.
+            */
+           const md5_byte_t *xp = data;
+           int i;
+
+#  if BYTE_ORDER == 0
+           X = xbuf;           /* (dynamic only) */
+#  else
+#    define xbuf X             /* (static only) */
+#  endif
+           for (i = 0; i < 16; ++i, xp += 4)
+               xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
+       }
+#endif
+    }
+
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+
+    /* Round 1. */
+    /* Let [abcd k s i] denote the operation
+       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
+#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + F(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+    /* Do the following 16 operations. */
+    SET(a, b, c, d,  0,  7,  T1);
+    SET(d, a, b, c,  1, 12,  T2);
+    SET(c, d, a, b,  2, 17,  T3);
+    SET(b, c, d, a,  3, 22,  T4);
+    SET(a, b, c, d,  4,  7,  T5);
+    SET(d, a, b, c,  5, 12,  T6);
+    SET(c, d, a, b,  6, 17,  T7);
+    SET(b, c, d, a,  7, 22,  T8);
+    SET(a, b, c, d,  8,  7,  T9);
+    SET(d, a, b, c,  9, 12, T10);
+    SET(c, d, a, b, 10, 17, T11);
+    SET(b, c, d, a, 11, 22, T12);
+    SET(a, b, c, d, 12,  7, T13);
+    SET(d, a, b, c, 13, 12, T14);
+    SET(c, d, a, b, 14, 17, T15);
+    SET(b, c, d, a, 15, 22, T16);
+#undef SET
+
+     /* Round 2. */
+     /* Let [abcd k s i] denote the operation
+          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
+#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + G(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  1,  5, T17);
+    SET(d, a, b, c,  6,  9, T18);
+    SET(c, d, a, b, 11, 14, T19);
+    SET(b, c, d, a,  0, 20, T20);
+    SET(a, b, c, d,  5,  5, T21);
+    SET(d, a, b, c, 10,  9, T22);
+    SET(c, d, a, b, 15, 14, T23);
+    SET(b, c, d, a,  4, 20, T24);
+    SET(a, b, c, d,  9,  5, T25);
+    SET(d, a, b, c, 14,  9, T26);
+    SET(c, d, a, b,  3, 14, T27);
+    SET(b, c, d, a,  8, 20, T28);
+    SET(a, b, c, d, 13,  5, T29);
+    SET(d, a, b, c,  2,  9, T30);
+    SET(c, d, a, b,  7, 14, T31);
+    SET(b, c, d, a, 12, 20, T32);
+#undef SET
+
+     /* Round 3. */
+     /* Let [abcd k s t] denote the operation
+          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + H(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  5,  4, T33);
+    SET(d, a, b, c,  8, 11, T34);
+    SET(c, d, a, b, 11, 16, T35);
+    SET(b, c, d, a, 14, 23, T36);
+    SET(a, b, c, d,  1,  4, T37);
+    SET(d, a, b, c,  4, 11, T38);
+    SET(c, d, a, b,  7, 16, T39);
+    SET(b, c, d, a, 10, 23, T40);
+    SET(a, b, c, d, 13,  4, T41);
+    SET(d, a, b, c,  0, 11, T42);
+    SET(c, d, a, b,  3, 16, T43);
+    SET(b, c, d, a,  6, 23, T44);
+    SET(a, b, c, d,  9,  4, T45);
+    SET(d, a, b, c, 12, 11, T46);
+    SET(c, d, a, b, 15, 16, T47);
+    SET(b, c, d, a,  2, 23, T48);
+#undef SET
+
+     /* Round 4. */
+     /* Let [abcd k s t] denote the operation
+          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))
+#define SET(a, b, c, d, k, s, Ti)\
+  t = a + I(b,c,d) + X[k] + Ti;\
+  a = ROTATE_LEFT(t, s) + b
+     /* Do the following 16 operations. */
+    SET(a, b, c, d,  0,  6, T49);
+    SET(d, a, b, c,  7, 10, T50);
+    SET(c, d, a, b, 14, 15, T51);
+    SET(b, c, d, a,  5, 21, T52);
+    SET(a, b, c, d, 12,  6, T53);
+    SET(d, a, b, c,  3, 10, T54);
+    SET(c, d, a, b, 10, 15, T55);
+    SET(b, c, d, a,  1, 21, T56);
+    SET(a, b, c, d,  8,  6, T57);
+    SET(d, a, b, c, 15, 10, T58);
+    SET(c, d, a, b,  6, 15, T59);
+    SET(b, c, d, a, 13, 21, T60);
+    SET(a, b, c, d,  4,  6, T61);
+    SET(d, a, b, c, 11, 10, T62);
+    SET(c, d, a, b,  2, 15, T63);
+    SET(b, c, d, a,  9, 21, T64);
+#undef SET
+
+     /* Then perform the following additions. (That is increment each
+        of the four registers by the value it had before this block
+        was started.) */
+    pms->abcd[0] += a;
+    pms->abcd[1] += b;
+    pms->abcd[2] += c;
+    pms->abcd[3] += d;
+}
+
+void
+md5_init(md5_state_t *pms)
+{
+    pms->count[0] = pms->count[1] = 0;
+    pms->abcd[0] = 0x67452301;
+    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
+    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
+    pms->abcd[3] = 0x10325476;
+}
+
+void
+md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
+{
+    const md5_byte_t *p = data;
+    int left = nbytes;
+    int offset = (pms->count[0] >> 3) & 63;
+    md5_word_t nbits = (md5_word_t)(nbytes << 3);
+
+    if (nbytes <= 0)
+       return;
+
+    /* Update the message length. */
+    pms->count[1] += nbytes >> 29;
+    pms->count[0] += nbits;
+    if (pms->count[0] < nbits)
+       pms->count[1]++;
+
+    /* Process an initial partial block. */
+    if (offset) {
+       int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
+
+       memcpy(pms->buf + offset, p, copy);
+       if (offset + copy < 64)
+           return;
+       p += copy;
+       left -= copy;
+       md5_process(pms, pms->buf);
+    }
+
+    /* Process full blocks. */
+    for (; left >= 64; p += 64, left -= 64)
+       md5_process(pms, p);
+
+    /* Process a final partial block. */
+    if (left)
+       memcpy(pms->buf, p, left);
+}
+
+void
+md5_finish(md5_state_t *pms, md5_byte_t digest[16])
+{
+    static const md5_byte_t pad[64] = {
+       0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    md5_byte_t data[8];
+    int i;
+
+    /* Save the length before padding. */
+    for (i = 0; i < 8; ++i)
+       data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
+    /* Pad to 56 bytes mod 64. */
+    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
+    /* Append the length. */
+    md5_append(pms, data, 8);
+    for (i = 0; i < 16; ++i)
+       digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
+}
diff --git src/md5.h src/md5.h
new file mode 100644
index 0000000..698c995
--- /dev/null
+++ src/md5.h
@@ -0,0 +1,91 @@
+/*
+  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  L. Peter Deutsch
+  gh...@aladdin.com
+
+ */
+/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
+/*
+  Independent implementation of MD5 (RFC 1321).
+
+  This code implements the MD5 Algorithm defined in RFC 1321, whose
+  text is available at
+       http://www.ietf.org/rfc/rfc1321.txt
+  The code is derived from the text of the RFC, including the test suite
+  (section A.5) but excluding the rest of Appendix A.  It does not include
+  any code or documentation that is identified in the RFC as being
+  copyrighted.
+
+  The original and principal author of md5.h is L. Peter Deutsch
+  <gh...@aladdin.com>.  Other authors are noted in the change history
+  that follows (in reverse chronological order):
+
+  2002-04-13 lpd Removed support for non-ANSI compilers; removed
+       references to Ghostscript; clarified derivation from RFC 1321;
+       now handles byte order either statically or dynamically.
+  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
+  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
+       added conditionalization for C++ compilation from Martin
+       Purschke <pursc...@bnl.gov>.
+  1999-05-03 lpd Original version.
+ */
+
+#ifndef md5_INCLUDED
+#  define md5_INCLUDED
+
+/*
+ * This package supports both compile-time and run-time determination of CPU
+ * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
+ * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
+ * defined as non-zero, the code will be compiled to run only on big-endian
+ * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
+ * run on either big- or little-endian CPUs, but will run slightly less
+ * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
+ */
+
+typedef unsigned char md5_byte_t; /* 8-bit byte */
+typedef unsigned int md5_word_t; /* 32-bit word */
+
+/* Define the state of the MD5 Algorithm. */
+typedef struct md5_state_s {
+    md5_word_t count[2];       /* message length in bits, lsw first */
+    md5_word_t abcd[4];                /* digest buffer */
+    md5_byte_t buf[64];                /* accumulate block */
+} md5_state_t;
+
+#ifdef __cplusplus
+extern "C" 
+{
+#endif
+
+/* Initialize the algorithm. */
+void md5_init(md5_state_t *pms);
+
+/* Append a string to the message. */
+void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
+
+/* Finish the message and return the digest. */
+void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
+
+#ifdef __cplusplus
+}  /* end extern "C" */
+#endif
+
+#endif /* md5_INCLUDED */
-- 
1.8.1.4

++++++ md5-use-in-tree-libmd5-rfc-rather-than-libcrypto.patch ++++++
>From aa3ef98403259dd6b03ea73161a7ef3c6bff478b Mon Sep 17 00:00:00 2001
From: David Disseldorp <dd...@suse.de>
Date: Fri, 5 Apr 2013 16:13:36 +0200
Subject: [PATCH 6/7] md5: use in tree libmd5-rfc, rather than libcrypto

Currently libcrypto (openssl) is linked purely for md5 calculation
utilities. Use the tiny in tree libmd5-rfc library instead, and do away
with the libcrypto dependency.
---
 configure       | 45 ---------------------------------------------
 configure.in    |  1 -
 src/istgt_md5.c | 20 +++++++-------------
 src/istgt_md5.h |  6 +++---
 4 files changed, 10 insertions(+), 62 deletions(-)

diff --git configure configure
index c4a9174..c46e423 100755
--- configure
+++ configure
@@ -3472,51 +3472,6 @@ _ACEOF
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5_Update in -lcrypto" 
>&5
-$as_echo_n "checking for MD5_Update in -lcrypto... " >&6; }
-if ${ac_cv_lib_crypto_MD5_Update+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lcrypto  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char MD5_Update ();
-int
-main ()
-{
-return MD5_Update ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_crypto_MD5_Update=yes
-else
-  ac_cv_lib_crypto_MD5_Update=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5_Update" 
>&5
-$as_echo "$ac_cv_lib_crypto_MD5_Update" >&6; }
-if test "x$ac_cv_lib_crypto_MD5_Update" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBCRYPTO 1
-_ACEOF
-
-  LIBS="-lcrypto $LIBS"
-
-fi
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cam_open_spec_device in 
-lcam" >&5
 $as_echo_n "checking for cam_open_spec_device in -lcam... " >&6; }
 if ${ac_cv_lib_cam_cam_open_spec_device+:} false; then :
diff --git configure.in configure.in
index 40ccecd..4eca28a 100644
--- configure.in
+++ configure.in
@@ -60,7 +60,6 @@ esac
 
 # Checks for libraries.
 AC_CHECK_LIB([pthread], [pthread_create])
-AC_CHECK_LIB([crypto], [MD5_Update])
 AC_CHECK_LIB([cam], [cam_open_spec_device])
 
 # Checks for header files.
diff --git src/istgt_md5.c src/istgt_md5.c
index 5a12abc..3e2f00f 100644
--- src/istgt_md5.c
+++ src/istgt_md5.c
@@ -33,42 +33,36 @@
 #include <stdint.h>
 
 #include <stddef.h>
-#include <openssl/md5.h>
 
 #include "istgt.h"
+#include "md5.h"
 #include "istgt_md5.h"
 
 int
 istgt_md5init(ISTGT_MD5CTX *md5ctx)
 {
-       int rc;
-
        if (md5ctx == NULL)
                return -1;
-       rc = MD5_Init(&md5ctx->md5ctx);
-       return rc;
+       md5_init(&md5ctx->state);
+       return 0;
 }
 
 int
 istgt_md5final(void *md5, ISTGT_MD5CTX *md5ctx)
 {
-       int rc;
-
        if (md5ctx == NULL || md5 == NULL)
                return -1;
-       rc = MD5_Final(md5, &md5ctx->md5ctx);
-       return rc;
+       md5_finish(&md5ctx->state, md5);
+       return 0;
 }
 
 int
 istgt_md5update(ISTGT_MD5CTX *md5ctx, const void *data, size_t len)
 {
-       int rc;
-
        if (md5ctx == NULL)
                return -1;
        if (data == NULL || len <= 0)
                return 0;
-       rc = MD5_Update(&md5ctx->md5ctx, data, len);
-       return rc;
+       md5_append(&md5ctx->state, (const md5_byte_t *)data, (int)len);
+       return 0;
 }
diff --git src/istgt_md5.h src/istgt_md5.h
index 2728e18..bd40fd6 100644
--- src/istgt_md5.h
+++ src/istgt_md5.h
@@ -30,12 +30,12 @@
 
 #include <stddef.h>
 
-#include <openssl/md5.h>
+#include "md5.h"
 
-#define ISTGT_MD5DIGEST_LEN MD5_DIGEST_LENGTH
+#define ISTGT_MD5DIGEST_LEN 16
 
 typedef struct istgt_md5ctx_t {
-       MD5_CTX md5ctx;
+       md5_state_t state;
 } ISTGT_MD5CTX;
 
 int istgt_md5init(ISTGT_MD5CTX *md5ctx);
-- 
1.8.1.4

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to