Hello community, here is the log from the commit of package istgt.3333 for openSUSE:13.1:Update checked in at 2014-12-27 21:03:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:13.1:Update/istgt.3333 (Old) and /work/SRC/openSUSE:13.1:Update/.istgt.3333.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "istgt.3333" Changes: -------- New Changes file: --- /dev/null 2014-12-25 22:38:16.200041506 +0100 +++ /work/SRC/openSUSE:13.1:Update/.istgt.3333.new/istgt.changes 2014-12-27 21:03:45.000000000 +0100 @@ -0,0 +1,149 @@ +------------------------------------------------------------------- +Tue Dec 16 00:11:14 UTC 2014 - [email protected] + +- Fix paths in sample conf and doc files; (boo#910112). + +------------------------------------------------------------------- +Wed Jul 10 14:03:25 UTC 2013 - [email protected] + +- 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 + +------------------------------------------------------------------- +Tue Apr 9 22:55:33 UTC 2013 - [email protected] + +- Move configure run to %build section + +------------------------------------------------------------------- +Tue Nov 6 13:07:35 UTC 2012 - [email protected] + +- Update to upstream istgt-20121028.tar.gz release. + +- Japanese -> English ChangeLog.jp via Google Translate: + + Modified to return the (Changeable values) PC = 01b in MODE_SENSE + and modified to use NOTE_LOWAT SO_RCVLOWAT + + Fixed issue an error if you specify no authentication: istgtcontrol + + modified to abort initialization error: istgtcontrol + + Socket system displays an error + + Iqn Show at the PDU error + + Add a time-out error log + + Add the batch code using readv / writev + +------------------------------------------------------------------- +Mon Sep 3 16:18:19 UTC 2012 - [email protected] + +- Update to upstream istgt-20120901.tar.gz release. + + Remove linux init script patches, now upstream. + +- Japanese -> English ChangeLog.jp via Google Translate: + + Changed to return INVALID FIELD IN CDB to MODE_SENSE unsupported + + Change so as to release resources after the end of the confirmation signal + thread + + Changed to not issue a malloc each time ATS + + Add (12) READ DEFECT DATA (10) / READ DEFECT DATA + + Add (12) (16) / ATA PASS-THROUGH ATA PASS-THROUGH dummy + + Add LOG_SELECT / LOG_SENSE of dummy + + Add the init scripts of Linux + + If you fail at reload of LU added the processing settings back + + Add qcow, qcow2, qed, an extension to handle vhdx + + 4.2.X VirtualBox support + + Add a poll to display when not in use kqueue + + Record usage of atomic functions at startup + + investigation gcc configure the built-in function + + Fix leak of mutex change + + Mistake correction of the error message + + Add a dummy signal function + + Change the position of the command loop termination + + Since the built-in function exclusion gcc gives an error on i386 + + Fixed a warning will be issued in the gcc parts + +------------------------------------------------------------------- +Mon Aug 13 09:24:38 UTC 2012 - [email protected] + +- Update to upstream istgt-20120811.tar.gz release, which adds support for + VirtualBox VirtualDisks. + +- Japanese -> English ChangeLog.jp via Google Translate: + + separated by a vbox for a shutdown function + + Modified to specify the mutex ADAPTIVE_NP to some of the + + Corresponding to the virtual drive using a shared library of VirtualBox + +- Add no_CMPXCHG_on_i386.patch. + +------------------------------------------------------------------- +Wed Aug 8 11:36:48 UTC 2012 - [email protected] + +- Update to upstream istgt-20120807.tar.gz release. + +- Japanese -> English ChangeLog.jp via Google Translate: + + Fix transfer locked position + + Add a task buffer allocation size + + Forgetting to fix error handling when + + Modified to log the number of leave to reload + + Modified so that it can continue with the error when reload + + EV_SET of NetBSD fix a warning + + add a function to get status of using the built-in functions since gcc4.1 + + Organize and unnecessary variable function + + Fixed memory leak at the end of + + Change if there is more than one LUN queue to run twice in a loop + + Add (except during the connection) process of changing the LU + + Modified so as to keep the number of elements in the queue + + Reduce the time lock of the queue, so as not to fix in the PG SendTargets inaccessible + + Change does not come out of the loop as to when a configuration error PG + + Issue a stop request to accept loop when receiving SIGTERM / INT + + Issues a connection request to stop all threads at the end + + Change so as to perform without a lock at the end of the state + + Add a script for NetBSD + + Add syslogd mountlate: LOGIN, REQUIRE: BEFORE the startup script + + Fix configure.in / Makefile.in + + fix the warning is in gcc and clang + + -Wextra-Wformat compiler warnings, such as adding + +- Install Linux rc script into /etc/init.d rather than /etc/rc.d + +------------------------------------------------------------------- +Wed Aug 1 09:35:45 UTC 2012 - [email protected] + +- Remove unnecessary %clean section from spec file. + +------------------------------------------------------------------- +Mon Jul 30 11:42:49 UTC 2012 - [email protected] + +- Remove fix-autosize.patch catering for symlinked devices. + + Symlink devices can be enabled with the '--enable-symlink-device' + configure option. + +------------------------------------------------------------------- +Mon Jul 30 11:39:42 UTC 2012 - [email protected] + +- Add support for (force-)reload init script arguments. + + Sends a SIGHUP to the istgt daemon. + +------------------------------------------------------------------- +Thu Jul 26 13:59:41 UTC 2012 - [email protected] + +- Update to upstream istgt-20120726.tar.gz tarball. + + Drop unneeded fix-as-needed-build.patch & fix-mandir.patch patches. + +------------------------------------------------------------------- +Fri Jun 1 11:10:20 UTC 2012 - [email protected] + +- Add Linux style System-V init scipt. + +------------------------------------------------------------------- +Thu May 31 13:41:56 UTC 2012 - [email protected] + +- Initial check in with istgt-20111008.tar.gz from + http://shell.peach.ne.jp/aoyama/archives/1741 and patches from Debian. + + See istgt-20111008/ChangeLog.jp in the source package for a summary of + changes up until now. New: ---- add-istgtcontrol-manpage.patch disk-support-0-len-read-and-write-CBDs.patch fix-installdir.patch iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch istgt-20121028.tar.gz istgt.changes istgt.spec 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 ++++++ # # spec file for package istgt # # Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ # Name: istgt Version: 0.10 Release: 0 %define upstreamrel 20121028 Summary: Userspace iSCSI Target License: BSD-2-Clause Group: Productivity/Networking/Other Url: http://www.peach.ne.jp/archives/istgt/ Source: istgt-%{upstreamrel}.tar.gz Requires: bash BuildRequires: autoconf 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 (refer to RFC3720 about iSCSI) developed for FreeBSD. It includes iSCSI protocol processor and SPC-3 (SCSI Primary Commands - 3) based logical unit emulation. Key Features: * MCS/MPIO for failover (up to 255 concurrent sessions) * Multipath I/O (only support Microsoft MPIO/VMware ESXi) * SPC-3 Persistent Reservation for cluster nodes * 64bit LBA for over 2TB * Header/Data digest by CRC32C * CHAP w/Mutual authentication * Multiple LUNs and ACLs for portals * IPv6/IPv4 dual support %prep %setup -q -n istgt-%{upstreamrel} %patch1 -p1 %patch2 -p1 %patch3 -p0 %patch4 -p0 %patch5 -p0 %patch6 -p0 %patch7 -p0 %patch8 -p0 autoconf %build %configure --with-configdir=%{_sysconfdir}/istgt make %install make install DESTDIR=$RPM_BUILD_ROOT %post /sbin/ldconfig %preun %{?stop_on_removal:%{stop_on_removal istgt}} %postun /sbin/ldconfig %{?restart_on_update:%{restart_on_update istgt}} %{?insserv_cleanup:%{insserv_cleanup}} %files %defattr(-,root,root) %{_sbindir}/istgt %{_sbindir}/istgtcontrol %dir %{_sysconfdir}/istgt/ %config %{_sysconfdir}/istgt/*.conf.sample %{_sysconfdir}/init.d/istgt %doc %{_mandir}/man1/istgt.1.gz %doc %{_mandir}/man1/istgtcontrol.1.gz %changelog ++++++ add-istgtcontrol-manpage.patch ++++++ Description: Add istgtcontrol manpage Add the manpages for the istgtcontrol.1 command. Modified files: . * doc/istgtcontrol.1.in - new file * doc/Makefile.in - change Makefile to make use of the Makefile Forwarded: Yes Author: Arno Töll <[email protected]> Applied-Upstream: not yet Last-Update: 2012-07-26 Index: istgt-20120807/doc/Makefile.in =================================================================== --- istgt-20120807.orig/doc/Makefile.in +++ istgt-20120807/doc/Makefile.in @@ -22,8 +22,9 @@ MKDIR_P = @MKDIR_P@ source = header = -document = QUICKSTART QUICKSTART.jp istgt.1.in +document = QUICKSTART QUICKSTART.jp sample = +MANPAGES = $(patsubst %.1.in, %.1, $(wildcard *.1.in)) DISTDIR = $(top_srcdir)/`cat $(top_srcdir)/distdir` DISTFILES = Makefile.in \ @@ -33,12 +34,12 @@ DISTFILES = Makefile.in \ ######################################################################### .PHONY: all install install-doc install-dirs install-doc-dirs -all: istgt.1 +all: $(MANPAGES) -istgt.1: +$(MANPAGES): $(SED) -e 's:%%PREFIX%%:$(prefix):g' \ -e 's:%%CONFIGDIR%%:$(configdir):g' \ - -e 's:%%MEDIADIR%%:$(mediadir):g' < istgt.1.in > $@ + -e 's:%%MEDIADIR%%:$(mediadir):g' < $(patsubst %.1, %.1.in, $@) > $@ dist: $(DISTFILES) $(MKDIR_P) $(DISTDIR)/$(subdir) @@ -48,9 +49,13 @@ dist: $(DISTFILES) done install: install-dirs - $(INSTALL) -m 0644 istgt.1 $(DESTDIR)$(mandir)/man1/ - -rm -f $(DESTDIR)$(mandir)/man1/istgt.1.gz - gzip -9 $(DESTDIR)$(mandir)/man1/istgt.1 + set -e + for file in $(MANPAGES) ; \ + do \ + $(INSTALL) -m 0644 $$file $(DESTDIR)$(mandir)/man1/ ; \ + rm -f $(DESTDIR)$(mandir)/man1/$$file.gz ; \ + gzip -9 $(DESTDIR)$(mandir)/man1/$$file ; \ + done install-doc: install-doc-dirs $(INSTALL) -m 0644 $(top_srcdir)/README $(DESTDIR)$(datadir)/doc/istgt/ @@ -66,7 +71,7 @@ install-doc-dirs: .PHONY: clean distclean depend clean: - -rm -f istgt.1 + -rm -f $(MANPAGES) -rm -f a.out *.o *.core -rm -f *~ Index: istgt-20120807/doc/istgtcontrol.1.in =================================================================== --- /dev/null +++ istgt-20120807/doc/istgtcontrol.1.in @@ -0,0 +1,140 @@ +.TH istgtcontrol 1 "Oct 07, 2011" "istgtcontrol" +.SH NAME +istgtcontrol \- istgt iSCSI target command utility +.SH SYNOPSIS +.B istgtcontrol +[options] <command> [<file>] +.SH DESCRIPTION +\fBistgtcontrol\fP is a command and control utility for \fBistgt\fP(1). +It can be used to query and change the status of a local or remote +\fBistgt\fP instance. +.PP +\fBistgtcontrol\fP supports the commands denoted below to interact with +the \fBistgt\fP instance. By default it connects and authenticates to +the iSCSI target portal specified in the \fBistgtcontrol.conf\fP +configuration file and uses CHAP credentials denoted there, if any. +Both can be overridden by using the respecitve command line arguments. +.SH COMMANDS + +\fBistgtcontrol\fP understands the following commands which can be +forwarded to \fBistgt\fP: + +.TP +.BI "noop" +Do not actually do anything, but test responsiveness of the portal and +test CHAP credentials only. +.TP +.BI "version" +Retrieve the \fBistgt\fP version number providing the iSCSI +portal \fBistgtcontrol\fP connected to. +.TP +.BI "list" +List all, or the specified targets only, which shared by the portal. +.TP +.BI "load" +Load a new media to the specified unit. This command issues the same +command as if a drive tray had been closed on a SCSI device. + +.TP +.BI "unload" +Unload a media from the specified unit. This command issues the same +command as if the drive tray had been opened from a SCSI device. + +.TP +.BI "change" " \fIfile\fP" +Change the loaded media by the specified unit. This command is +equivalent as if a new media (for example a DVD-ROM or tape cartridge) had +been inserted in the SCSI drive. The "\fIfile\fP" argument is interpreted +as filename to be loaded. + +.TP +.BI "reset" +Reset the specified LUN of the portal. +.TP +.BI "info" +Display all connections of the portal + +.SH OPTIONS +.TP +.BI \-c " \fIconfig\fP" +Use specified file as configuration file instead of the default file. +.TP + +.BI -h " \fIhost\fP" +Override the target portal by the specified host name or IP address. This +defaults to "localhost" if no other host was specified in the +configuration file. +.TP +.BI -p " \fIport\fP" +Override the target portal port by the specified port number. This defaults +to "3261" if no other port was specified in the configuration file. +.TP +.BI -t " \fItarget\fP" +Specifies the target IQN which should be affected by the command given. +There may be a default given in the configuration file. The keyword +"\fIall\fP" is accepted by some commands and matches all exported volumes. +.TP +.BI -l " \fIlun\fP" +Specifies the target LUN which should be affected by the command given. +This defaults to "0" unless another default was provided in the configuration +file. +.TP +.BI -f " \fIflags\fP" +Specifies flags passed to the portal when loading a new media. This +defaults to "ro". Supported \fIflags\fP are: "ro", "rw", "extend" and +"dynamic". +.TP +.BI -s " \fIsize\fP" +Specifies the size of the meda to be loaded. The default is to auto-detect the +media size. +.TP +.BI -q +Quiet mode, supress non-critical outputs. +.TP +.BI -v +Verbose mode, gives more output during operations. +.TP +.BI -A " \fImethod\fP" +Sets the preferred authentication method for logging in to the portal. This +overrides any method specified in the configuration file. Supported +methods are either CHAP/Mutual or CHAP/Auto. +.TP +.BI -U " \fIuser\fP" +Sets the user to authenticate on the portal. This overrides any username +specified in the configuration file. +.TP +.BI -S " \fIsecret\fP" +Set the secret used to authenticate on the portal. This overrides any +secret specified in the configuration file. +.TP +.BI -M " \fImuser\fP" +Set the mutual authentication user. This overrides any user specified in +the configuration file. +.TP +.BI -R " \fImsecret\fP" +Set the mutual authentication secret. This overrides any secret +specified in the configuration file. +.TP +.BI -H +Display a brief usage summary and exit. +.TP +.BI -V +Display the \fBistgtcontrol\fP version number and exit. +.TP + + +.SH FILES +.PD 0 +.TP +.I %%CONFIGDIR%%/istgtcontrol.conf +Configuration file + +.PD +.SH SEE ALSO +\fBistgt\fP(1) +.PD +.SH AUTHORS +Daisuke Aoyama <[email protected]> + +This manual page was written by Arno Töll (<[email protected]>) for the Debian +GNU/kFreeBSD system (but may be used by others). ++++++ disk-support-0-len-read-and-write-CBDs.patch ++++++ >From 4441406e6bfd8de8fedde118bc08346e449c9eb4 Mon Sep 17 00:00:00 2001 From: David Disseldorp <[email protected]> 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 ++++++ fix-installdir.patch ++++++ Description: Install binaries to $PREFIX/sbin instead of $PREFIX/bin . * src/Makefile.in: Fix paths hardcoded to the install target * doc/istgt.1.in: Reflect change in resulting man page Forwarded: not-needed Author: Arno Töll <[email protected]> Index: istgt-20120807/src/Makefile.in =================================================================== --- istgt-20120807.orig/src/Makefile.in +++ istgt-20120807/src/Makefile.in @@ -88,11 +88,11 @@ istgtcontrol: $(ISTGTCONTROL) $(CC) $(LDFLAGS) -o $@ $(ISTGTCONTROL) $(LIBS) install: install-dirs - $(INSTALL) -m 0755 istgt $(DESTDIR)$(bindir) - $(INSTALL) -m 0755 istgtcontrol $(DESTDIR)$(bindir) + $(INSTALL) -m 0755 istgt $(DESTDIR)$(sbindir) + $(INSTALL) -m 0755 istgtcontrol $(DESTDIR)$(sbindir) install-dirs: - $(MKDIR_P) $(DESTDIR)$(bindir) + $(MKDIR_P) $(DESTDIR)$(sbindir) .PHONY: dist clean distclean depend dist: $(DISTFILES) ++++++ iscsi-cancel-conn-worker-threads-using-the-task_pipe.patch ++++++ >From 88f929d2c17739e88eaed15fe22c6c898c7dde4d Mon Sep 17 00:00:00 2001 From: David Disseldorp <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 + [email protected] + + */ +/* $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 + <[email protected]>. 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 + [email protected] + + */ +/* $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 + <[email protected]>. 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 <[email protected]>. + 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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
