summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/systemd/iscsi-init.service8
-rw-r--r--etc/systemd/iscsi.service6
-rw-r--r--include/iscsi_if.h4
-rw-r--r--iscsiuio/src/uip/ipv6.c2
-rw-r--r--iscsiuio/src/unix/nic_utils.c20
-rw-r--r--usr/initiator.c6
-rw-r--r--usr/iscsid.c7
-rw-r--r--utils/fwparam_ibft/fwparam_ibft.c1
-rw-r--r--utils/fwparam_ibft/fwparam_sysfs.c5
9 files changed, 41 insertions, 18 deletions
diff --git a/etc/systemd/iscsi-init.service b/etc/systemd/iscsi-init.service
new file mode 100644
index 0000000..e058ff0
--- /dev/null
+++ b/etc/systemd/iscsi-init.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=One time configuration for iscsi.service
+ConditionPathExists=!/etc/iscsi/initiatorname.iscsi
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/sh -c 'echo "InitiatorName=`/usr/sbin/iscsi-iname`" > /etc/iscsi/initiatorname.iscsi'
diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service
index 1c286d1..2f2bf81 100644
--- a/etc/systemd/iscsi.service
+++ b/etc/systemd/iscsi.service
@@ -2,9 +2,9 @@
Description=Login and scanning of iSCSI devices
Documentation=man:iscsiadm(8) man:iscsid(8)
Before=remote-fs.target
-After=network.target network-online.target iscsid.service
-Requires=iscsid.socket
-ConditionPathExists=/etc/iscsi/initiatorname.iscsi
+After=network.target network-online.target
+After=iscsid.service iscsi-init.service
+Requires=iscsid.socket iscsi-init.service
[Service]
Type=oneshot
diff --git a/include/iscsi_if.h b/include/iscsi_if.h
index 2d46214..5a1c614 100644
--- a/include/iscsi_if.h
+++ b/include/iscsi_if.h
@@ -841,7 +841,7 @@ struct iscsi_stats {
* up to ISCSI_STATS_CUSTOM_MAX
*/
uint32_t custom_length;
- struct iscsi_stats_custom custom[0]
+ struct iscsi_stats_custom custom[]
__attribute__ ((aligned (sizeof(uint64_t))));
};
@@ -972,7 +972,7 @@ struct iscsi_offload_host_stats {
* up to ISCSI_HOST_STATS_CUSTOM_MAX
*/
uint32_t custom_length;
- struct iscsi_host_stats_custom custom[0]
+ struct iscsi_host_stats_custom custom[]
__attribute__ ((aligned (sizeof(uint64_t))));
};
diff --git a/iscsiuio/src/uip/ipv6.c b/iscsiuio/src/uip/ipv6.c
index 05efa73..11cb4e9 100644
--- a/iscsiuio/src/uip/ipv6.c
+++ b/iscsiuio/src/uip/ipv6.c
@@ -519,7 +519,7 @@ static void ipv6_insert_protocol_chksum(struct ipv6_hdr *ipv6)
* SRC IP, DST IP, Protocol Data Length, and Next Header.
*/
sum = 0;
- ptr = (u16_t *)&ipv6->ipv6_src;
+ ptr = (u16_t *)&ipv6->ipv6_src.addr16[0];
for (i = 0; i < sizeof(struct ipv6_addr); i++) {
sum += HOST_TO_NET16(*ptr);
diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c
index ec3b915..ec4535d 100644
--- a/iscsiuio/src/unix/nic_utils.c
+++ b/iscsiuio/src/unix/nic_utils.c
@@ -603,7 +603,10 @@ static int from_uio_find_associated_host(nic_t *nic, int uio_minor,
search_filters[path_iterator], alphasort);
switch (count) {
- case 1:
+ case 1: {
+ char *parsed_src;
+ size_t parsed_size;
+
parsed_name = (*extract_name[path_iterator]) (files);
if (!parsed_name) {
LOG_WARN(PFX "Couldn't find delimiter in: %s",
@@ -612,15 +615,22 @@ static int from_uio_find_associated_host(nic_t *nic, int uio_minor,
break;
}
- strncpy(name,
- parsed_name +
- extract_name_offset[path_iterator], name_size);
+ parsed_src = parsed_name + extract_name_offset[path_iterator];
+ parsed_size = strlen(parsed_src);
+ if (parsed_size >= name_size) {
+ LOG_WARN(PFX "uio device name too long: %s (max %d)",
+ parsed_src, (int)name_size - 1);
+ rc = -EINVAL;
+ } else {
+ strncpy(name, parsed_src, name_size);
+ rc = 0;
+ }
free(files[0]);
free(files);
- rc = 0;
break;
+ }
case 0:
rc = -EINVAL;
diff --git a/usr/initiator.c b/usr/initiator.c
index a07f9aa..5f4bdca 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -711,11 +711,7 @@ static void iscsi_login_eh(struct iscsi_conn *conn, struct queue_task *qtask,
!iscsi_retry_initial_login(conn))
session_conn_shutdown(conn, qtask, err);
else {
- session->reopen_cnt++;
- session->t->template->ep_disconnect(conn);
- if (iscsi_conn_connect(conn, qtask))
- queue_delayed_reopen(qtask,
- ISCSI_CONN_ERR_REOPEN_DELAY);
+ session_conn_reopen(conn, qtask, STOP_CONN_TERM);
}
break;
case R_STAGE_SESSION_REDIRECT:
diff --git a/usr/iscsid.c b/usr/iscsid.c
index 99d27ab..e501498 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -310,7 +310,12 @@ static void iscsid_shutdown(void)
static void catch_signal(int signo)
{
- log_debug(1, "pid %d caught signal %d", getpid(), signo);
+ /*
+ * Do not try to call log_debug() if there is a PIPE error
+ * because we can get caught in a PIPE error loop.
+ */
+ if (signo != SIGPIPE)
+ log_debug(1, "pid %d caught signal %d", getpid(), signo);
/* In foreground mode, treat SIGINT like SIGTERM */
if (!daemonize && signo == SIGINT)
diff --git a/utils/fwparam_ibft/fwparam_ibft.c b/utils/fwparam_ibft/fwparam_ibft.c
index 52edac1..e68e503 100644
--- a/utils/fwparam_ibft/fwparam_ibft.c
+++ b/utils/fwparam_ibft/fwparam_ibft.c
@@ -463,6 +463,7 @@ fwparam_ibft(struct boot_context *context, const char *filepath)
if (stat(filename, &buf)!=0) {
fprintf(stderr, "Could not stat file %s: %s (%d)\n",
filename, strerror(errno), errno);
+ close(fd);
return -1;
}
/* And if not zero use that size */
diff --git a/utils/fwparam_ibft/fwparam_sysfs.c b/utils/fwparam_ibft/fwparam_sysfs.c
index a0cd1c7..87fd6d4 100644
--- a/utils/fwparam_ibft/fwparam_sysfs.c
+++ b/utils/fwparam_ibft/fwparam_sysfs.c
@@ -115,8 +115,11 @@ static int get_iface_from_device(char *id, struct boot_context *context)
break;
}
- if (sscanf(dent->d_name, "net:%s", context->iface) != 1)
+ if (sscanf(dent->d_name, "net:%s", context->iface) != 1) {
rc = EINVAL;
+ break;
+ }
+
rc = 0;
break;
} else {