diff --git a/6000-Plugging-a-memory-leak-from-discovery.patch b/6000-Plugging-a-memory-leak-from-discovery.patch new file mode 100644 index 0000000..358e9c0 --- /dev/null +++ b/6000-Plugging-a-memory-leak-from-discovery.patch @@ -0,0 +1,32 @@ +From c388d9adae20b835731ac98776082c884617467d Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Thu, 30 Aug 2018 15:58:10 -0700 +Subject: [PATCH 45/91] Plugging a memory leak from discovery. + +During discovery the function get_op_params_text_keys() +can allocate a target_alias, but this is never freed. + +Discovered-by: zhangzujian.7@gmail.com +--- + usr/discovery.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/usr/discovery.c b/usr/discovery.c +index 8001af6..2147deb 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -1055,6 +1055,11 @@ static void iscsi_destroy_session(struct iscsi_session *session) + log_error("Could not safely destroy session %d (err %d)", + session->id, rc); + done: ++ if (session->target_alias) { ++ free(session->target_alias); ++ session->target_alias = NULL; ++ } ++ + if (conn->socket_fd >= 0) { + ipc->ctldev_close(); + conn->socket_fd = -1; +-- +1.8.3.1 + diff --git a/6001-Fix-bug-in-error-message-when-reading-sysfs-numbers.patch b/6001-Fix-bug-in-error-message-when-reading-sysfs-numbers.patch new file mode 100644 index 0000000..dab2f8d --- /dev/null +++ b/6001-Fix-bug-in-error-message-when-reading-sysfs-numbers.patch @@ -0,0 +1,28 @@ +From 8bf04a094e572c56d4f8bd30ff064c84c75a0247 Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Tue, 25 Sep 2018 09:53:55 -0700 +Subject: [PATCH 54/91] Fix bug in error message when reading sysfs numbers. + +The message printed when ENOENT was returned for +a number-type sysfs value was missing the attribute +name parameter. +--- + libopeniscsiusr/sysfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libopeniscsiusr/sysfs.c b/libopeniscsiusr/sysfs.c +index c4f89a3..5e6532e 100644 +--- a/libopeniscsiusr/sysfs.c ++++ b/libopeniscsiusr/sysfs.c +@@ -237,7 +237,7 @@ static int iscsi_sysfs_prop_get_ll(struct iscsi_context *ctx, + "Failed to read '%s': " + "File '%s' does not exists, using ", + "default value %lld", +- file_path, default_value); ++ prop_name, file_path, default_value); + *val = default_value; + goto out; + } +-- +1.8.3.1 + diff --git a/6002-Do-not-allow-multiple-sessions-when-nr_sessions-1.patch b/6002-Do-not-allow-multiple-sessions-when-nr_sessions-1.patch new file mode 100644 index 0000000..f3ec03c --- /dev/null +++ b/6002-Do-not-allow-multiple-sessions-when-nr_sessions-1.patch @@ -0,0 +1,37 @@ +From a37c4295a2e3f8712921a52db0d35d3506efb19b Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Thu, 4 Oct 2018 16:26:26 -0700 +Subject: [PATCH 60/91] Do not allow multiple sessions when nr_sessions=1 + +If a request is made to login to a target, creating +a session, then another request is submitted so quickly +that the first one has not completed, both requests +can succeed, despite having nr_sessions=1 configured. + +Only allow multiple login requests if nr_sessions is +greater than 1. +--- + usr/session_mgmt.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/usr/session_mgmt.c b/usr/session_mgmt.c +index 596085b..0500f15 100644 +--- a/usr/session_mgmt.c ++++ b/usr/session_mgmt.c +@@ -189,9 +189,11 @@ int iscsi_login_portal(void *data, struct list_head *list, struct node_rec *rec) + + /* + * Ensure the record's 'multiple' flag is set so __iscsi_login_portal +- * will allow multiple logins. ++ * will allow multiple logins, but only if configured for more ++ * than one + */ +- rec->session.multiple = 1; ++ if (rec->session.nr_sessions > 1) ++ rec->session.multiple = 1; + for (i = session_count; i < rec->session.nr_sessions; ++i) { + log_debug(1, "%s: Creating session %d/%d", rec->iface.name, + i + 1, rec->session.nr_sessions); +-- +1.8.3.1 + diff --git a/6003-Fix-possible-discovery-hang-when-timing-out.patch b/6003-Fix-possible-discovery-hang-when-timing-out.patch new file mode 100644 index 0000000..80b911e --- /dev/null +++ b/6003-Fix-possible-discovery-hang-when-timing-out.patch @@ -0,0 +1,28 @@ +From 4ee991b81194a7e3ebd7ff6ec4efc5509932389d Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Tue, 14 May 2019 14:12:25 -0700 +Subject: [PATCH 91/91] Fix possible discovery hang when timing out + +If session reopening failed during discovery, the CPU +could peg at 100% because the code that gives up when +tretires are exhausted was not setting an error +return value. +--- + usr/discovery.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/usr/discovery.c b/usr/discovery.c +index 2147deb..199c160 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -1355,6 +1355,7 @@ reconnect: + if (--session->reopen_cnt < 0) { + log_error("connection login retries (reopen_max) %d exceeded", + config->reopen_max); ++ rc = ISCSI_ERR_PDU_TIMEOUT; + goto login_failed; + } + +-- +1.8.3.1 + diff --git a/6004-Resource-leak-returning-without-freeing-netdev.patch b/6004-Resource-leak-returning-without-freeing-netdev.patch new file mode 100644 index 0000000..d057be3 --- /dev/null +++ b/6004-Resource-leak-returning-without-freeing-netdev.patch @@ -0,0 +1,35 @@ +From e13d2fe2b39d6a69b7a7c82cdc3185996bceaca2 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 11:06:07 -0700 +Subject: [PATCH 18/43] Resource leak: returning without freeing netdev + +--- + usr/iscsi_net_util.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c +index 6339082..a32b49c 100644 +--- a/usr/iscsi_net_util.c ++++ b/usr/iscsi_net_util.c +@@ -271,7 +271,8 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + log_error("Could not open socket to manage network " + "(err %d - %s)", errno, strerror(errno)); +- return errno; ++ ret = errno; ++ goto done; + } + + /* Bring up NIC with correct address - unless it +@@ -389,7 +390,8 @@ int net_setup_netdev(char *netdev, char *local_ip, char *mask, char *gateway, + ret = 0; + + done: +- close(sock); ++ if (sock >= 0) ++ close(sock); + if (vlan_id) + free(netdev); + return ret; +-- +2.21.0 diff --git a/6005-Out-of-bounds-write-Overrunning-array-link_target.patch b/6005-Out-of-bounds-write-Overrunning-array-link_target.patch new file mode 100644 index 0000000..bc738af --- /dev/null +++ b/6005-Out-of-bounds-write-Overrunning-array-link_target.patch @@ -0,0 +1,25 @@ +From 007d7832c631409e41bf5c473ca5dc7d114a67cb Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 11:13:44 -0700 +Subject: [PATCH 19/43] Out-of-bounds-write: Overrunning array link_target + +--- + usr/sysfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/sysfs.c b/usr/sysfs.c +index 48f3825..b3102f0 100644 +--- a/usr/sysfs.c ++++ b/usr/sysfs.c +@@ -134,7 +134,7 @@ int sysfs_resolve_link(char *devpath, size_t size) + + strlcpy(link_path, sysfs_path, sizeof(link_path)); + strlcat(link_path, devpath, sizeof(link_path)); +- len = readlink(link_path, link_target, sizeof(link_target)); ++ len = readlink(link_path, link_target, sizeof(link_target) - 1); + if (len <= 0) + return -1; + link_target[len] = '\0'; +-- +2.21.0 + diff --git a/6006-Resource-leak-Variable-rec-going-out-of-scope-leaks.patch b/6006-Resource-leak-Variable-rec-going-out-of-scope-leaks.patch new file mode 100644 index 0000000..207bc80 --- /dev/null +++ b/6006-Resource-leak-Variable-rec-going-out-of-scope-leaks.patch @@ -0,0 +1,34 @@ +From 0db12353efea69309a6a92f30f4e063b142359c4 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 11:27:07 -0700 +Subject: [PATCH 20/43] Resource leak: Variable rec going out of scope leaks + the storage it points to + +--- + usr/iscsiadm.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index 8de7a41..2ce6ae7 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -1044,7 +1044,7 @@ static int add_static_rec(int *found, char *targetname, int tpgt, + if (rc) { + log_error("Could not read iface %s. Error %d", + iface->name, rc); +- return rc; ++ goto free_drec; + } + + iface_copy(&rec->iface, iface); +@@ -1057,6 +1057,7 @@ static int add_static_rec(int *found, char *targetname, int tpgt, + rec->iface.transport_name, iface_str(&rec->iface), + ip, port, tpgt, targetname); + } ++free_drec: + free(drec); + free_rec: + free(rec); +-- +2.19.1 + diff --git a/6007-Out-of-bounds-write-Overrunning-array-link_target.patch b/6007-Out-of-bounds-write-Overrunning-array-link_target.patch new file mode 100644 index 0000000..4415d89 --- /dev/null +++ b/6007-Out-of-bounds-write-Overrunning-array-link_target.patch @@ -0,0 +1,43 @@ +From c03fbc1a112d3f808512351a62f4c5f593694003 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 11:29:56 -0700 +Subject: [PATCH 21/43] Out-of-bounds write: Overrunning array link_target + +--- + usr/sysfs.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/usr/sysfs.c b/usr/sysfs.c +index b3102f0..2488160 100644 +--- a/usr/sysfs.c ++++ b/usr/sysfs.c +@@ -225,7 +225,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + strlcpy(link_path, sysfs_path, sizeof(link_path)); + strlcat(link_path, dev->devpath, sizeof(link_path)); + strlcat(link_path, "/subsystem", sizeof(link_path)); +- len = readlink(link_path, link_target, sizeof(link_target)); ++ len = readlink(link_path, link_target, sizeof(link_target) - 1); + if (len > 0) { + /* get subsystem from "subsystem" link */ + link_target[len] = '\0'; +@@ -255,7 +255,7 @@ struct sysfs_device *sysfs_device_get(const char *devpath) + strlcpy(link_path, sysfs_path, sizeof(link_path)); + strlcat(link_path, dev->devpath, sizeof(link_path)); + strlcat(link_path, "/driver", sizeof(link_path)); +- len = readlink(link_path, link_target, sizeof(link_target)); ++ len = readlink(link_path, link_target, sizeof(link_target) - 1); + if (len > 0) { + link_target[len] = '\0'; + dbg("driver link '%s' points to '%s'", link_path, link_target); +@@ -363,7 +363,7 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name) + int len; + const char *pos; + +- len = readlink(path_full, link_target, sizeof(link_target)); ++ len = readlink(path_full, link_target, sizeof(link_target) - 1); + if (len > 0) { + link_target[len] = '\0'; + pos = strrchr(link_target, '/'); +-- +2.19.1 + diff --git a/6008-Buffer-not-null-terminated-Calling-strncpy.patch b/6008-Buffer-not-null-terminated-Calling-strncpy.patch new file mode 100644 index 0000000..528abd5 --- /dev/null +++ b/6008-Buffer-not-null-terminated-Calling-strncpy.patch @@ -0,0 +1,27 @@ +From 26bfa31349c410cacd22f9e8ea2ef4a82b221f13 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 11:44:18 -0700 +Subject: [PATCH 22/43] Buffer not null terminated: Calling strncpy with a + maximum size argument on destination array might leave the destination string + unterminated + +--- + usr/iscsi_sysfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c +index f79a1af..418f51b 100644 +--- a/usr/iscsi_sysfs.c ++++ b/usr/iscsi_sysfs.c +@@ -464,7 +464,7 @@ int iscsi_sysfs_get_flashnode_info(struct flashnode_rec *fnode, + log_debug(7, "could not get transport name for host%d", + host_no); + else +- strncpy(fnode->transport_name, t->name, ++ strlcpy(fnode->transport_name, t->name, + ISCSI_TRANSPORT_NAME_MAXLEN); + + snprintf(sess_id, sizeof(sess_id), ISCSI_FLASHNODE_SESS, host_no, +-- +2.21.0 + diff --git a/6009-Resource-leak-Variable-startup_cmd-going-out-of-scop.patch b/6009-Resource-leak-Variable-startup_cmd-going-out-of-scop.patch new file mode 100644 index 0000000..0f6daaa --- /dev/null +++ b/6009-Resource-leak-Variable-startup_cmd-going-out-of-scop.patch @@ -0,0 +1,26 @@ +From 5799a5a711a0347e353cfb61b8ea33eb9d38541e Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 12:03:59 -0700 +Subject: [PATCH 24/43] Resource leak: Variable startup_cmd going out of scope + leaks the storage it point to. + +--- + usr/iscsid_req.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index b6940db..427e894 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -55,6 +55,8 @@ static void iscsid_startup(void) + if (system(startup_cmd) < 0) + log_error("Could not execute '%s' (err %d)", + startup_cmd, errno); ++ ++ free(startup_cmd); + } + + #define MAXSLEEP 128 +-- +2.21.0 + diff --git a/6010-Buffer-not-null-terminated-Calling-strncpy.patch b/6010-Buffer-not-null-terminated-Calling-strncpy.patch new file mode 100644 index 0000000..0201b46 --- /dev/null +++ b/6010-Buffer-not-null-terminated-Calling-strncpy.patch @@ -0,0 +1,43 @@ +From aa0e934c3513ca8fac9de463e328b5a150d057f5 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 12:10:27 -0700 +Subject: [PATCH 25/43] Buffer not null terminated: Calling strncpy with a + maximum size argument on destination array + +--- + usr/iscsi_net_util.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c +index a32b49c..56d2f69 100644 +--- a/usr/iscsi_net_util.c ++++ b/usr/iscsi_net_util.c +@@ -193,7 +193,7 @@ static char *find_vlan_dev(char *netdev, int vlan_id) { + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + +- strncpy(if_hwaddr.ifr_name, netdev, IFNAMSIZ); ++ strlcpy(if_hwaddr.ifr_name, netdev, IFNAMSIZ); + ioctl(sockfd, SIOCGIFHWADDR, &if_hwaddr); + + if (if_hwaddr.ifr_hwaddr.sa_family != ARPHRD_ETHER) +@@ -201,14 +201,14 @@ static char *find_vlan_dev(char *netdev, int vlan_id) { + + ifni = if_nameindex(); + for (i = 0; ifni[i].if_index && ifni[i].if_name; i++) { +- strncpy(vlan_hwaddr.ifr_name, ifni[i].if_name, IFNAMSIZ); ++ strlcpy(vlan_hwaddr.ifr_name, ifni[i].if_name, IFNAMSIZ); + ioctl(sockfd, SIOCGIFHWADDR, &vlan_hwaddr); + + if (vlan_hwaddr.ifr_hwaddr.sa_family != ARPHRD_ETHER) + continue; + + if (!memcmp(if_hwaddr.ifr_hwaddr.sa_data, vlan_hwaddr.ifr_hwaddr.sa_data, ETH_ALEN)) { +- strncpy(vlanrq.device1, ifni[i].if_name, IFNAMSIZ); ++ strlcpy(vlanrq.device1, ifni[i].if_name, IFNAMSIZ); + rc = ioctl(sockfd, SIOCGIFVLAN, &vlanrq); + if ((rc == 0) && (vlanrq.u.VID == vlan_id)) { + vlan = strdup(vlanrq.device1); +-- +2.21.0 + diff --git a/6011-Uninitialized-scalar-variable.patch b/6011-Uninitialized-scalar-variable.patch new file mode 100644 index 0000000..0d63d6d --- /dev/null +++ b/6011-Uninitialized-scalar-variable.patch @@ -0,0 +1,25 @@ +From 65c06d977a012541fd6144d4452f5191081fdd44 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 12:11:42 -0700 +Subject: [PATCH 26/43] Uninitialized scalar variable + +--- + usr/host.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/host.c b/usr/host.c +index 62bf111..356650c 100644 +--- a/usr/host.c ++++ b/usr/host.c +@@ -217,7 +217,7 @@ static int print_host_iface(void *data, struct iface_rec *iface) + + static void print_host_ifaces(struct host_info *hinfo, char *prefix) + { +- int nr_found; ++ int nr_found = 0; + + iscsi_sysfs_for_each_iface_on_host(prefix, hinfo->host_no, &nr_found, + print_host_iface); +-- +2.21.0 + diff --git a/6012-Resource-leak-Handle-variable-sockfd-going-out-of-scope.patch b/6012-Resource-leak-Handle-variable-sockfd-going-out-of-scope.patch new file mode 100644 index 0000000..d6ce908 --- /dev/null +++ b/6012-Resource-leak-Handle-variable-sockfd-going-out-of-scope.patch @@ -0,0 +1,29 @@ +From 98738bc389c62cef05bff9e03d5172253ebc82af Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 13:46:37 -0700 +Subject: [PATCH 29/43] Resource leak: Handle variable sockfd going out of + scope leaks the handle. + +--- + usr/iscsi_net_util.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/usr/iscsi_net_util.c b/usr/iscsi_net_util.c +index 56d2f69..b5a910f 100644 +--- a/usr/iscsi_net_util.c ++++ b/usr/iscsi_net_util.c +@@ -196,8 +196,10 @@ static char *find_vlan_dev(char *netdev, int vlan_id) { + strlcpy(if_hwaddr.ifr_name, netdev, IFNAMSIZ); + ioctl(sockfd, SIOCGIFHWADDR, &if_hwaddr); + +- if (if_hwaddr.ifr_hwaddr.sa_family != ARPHRD_ETHER) ++ if (if_hwaddr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { ++ close(sockfd); + return NULL; ++ } + + ifni = if_nameindex(); + for (i = 0; ifni[i].if_index && ifni[i].if_name; i++) { +-- +2.21.0 + diff --git a/6013-Resource-leak-Variable-chap_info-going-out-of-scope.patch b/6013-Resource-leak-Variable-chap_info-going-out-of-scope.patch new file mode 100644 index 0000000..8ade94b --- /dev/null +++ b/6013-Resource-leak-Variable-chap_info-going-out-of-scope.patch @@ -0,0 +1,26 @@ +From 020d46c3cb95d627bd1246e6212981cf22adf651 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 13:50:22 -0700 +Subject: [PATCH 30/43] Resource leak: Variable chap_info going out of scope + leaks the storage it points to. + +--- + usr/iscsiadm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index 2ce6ae7..efc9f43 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -1734,7 +1734,7 @@ static int set_host_chap_info(uint32_t host_no, uint64_t chap_index, + rc = ISCSI_ERR; + } + +- goto exit_set_chap; ++ goto free_iovec; + } + + ipc->ctldev_close(); +-- +2.19.1 + diff --git a/6014-Resource-leak-Variable-matched_ses-going-out-of-scope.patch b/6014-Resource-leak-Variable-matched_ses-going-out-of-scope.patch new file mode 100644 index 0000000..ecedaba --- /dev/null +++ b/6014-Resource-leak-Variable-matched_ses-going-out-of-scope.patch @@ -0,0 +1,34 @@ +From 096fc3ca10492c0810f1aaf76266006a2a803109 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 13:54:27 -0700 +Subject: [PATCH 31/43] Resource leak: Variable matched_ses going out of scope + leaks the storage it points to. + +--- + usr/host.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/usr/host.c b/usr/host.c +index 356650c..c94b6d1 100644 +--- a/usr/host.c ++++ b/usr/host.c +@@ -262,14 +262,14 @@ static int host_info_print_tree(void *data, struct host_info *hinfo) + matched_ses[matched_se_count++] = ses[i]; + + if (!matched_se_count) +- return 0; ++ goto out; + + printf("\t*********\n"); + printf("\tSessions:\n"); + printf("\t*********\n"); + session_info_print_tree(matched_ses, matched_se_count, "\t", + session_info_flags, 0/* don't show password */); +- ++out: + free(matched_ses); + return 0; + } +-- +2.21.0 + diff --git a/6015-Resource-leak-Handle-variable-fd-going-out-of-scope.patch b/6015-Resource-leak-Handle-variable-fd-going-out-of-scope.patch new file mode 100644 index 0000000..72cdcfc --- /dev/null +++ b/6015-Resource-leak-Handle-variable-fd-going-out-of-scope.patch @@ -0,0 +1,29 @@ +From ca6eb221321c0e24b94f667ecc75a5fc17aa2018 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 13:59:31 -0700 +Subject: [PATCH 32/43] Resource leak: Handle variable fd going out of scope + leaks the handle. + +This is comming up in places where the error handling assumes that on a +failure there is no file descriptor to worry about. I don't think we +need to keep fd around when indicating a connection error. +--- + usr/iscsid_req.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index 427e894..d872eb7 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -97,6 +97,8 @@ static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) + if (nsec <= MAXSLEEP/2) + sleep(nsec); + } ++ close(*fd); ++ *fd = -1; + log_error("can not connect to iSCSI daemon (%d)!", errno); + return ISCSI_ERR_ISCSID_NOTCONN; + } +-- +2.21.0 + diff --git a/6016-Resource-leak-Handle-variable-fd-going-out-of-scope.patch b/6016-Resource-leak-Handle-variable-fd-going-out-of-scope.patch new file mode 100644 index 0000000..6e478f4 --- /dev/null +++ b/6016-Resource-leak-Handle-variable-fd-going-out-of-scope.patch @@ -0,0 +1,25 @@ +From 1a17ffcc07ff7021d66940f58f42bfaa78e763bf Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 14:08:57 -0700 +Subject: [PATCH 33/43] Resource leak: Handle variable fd going out of scope + leaks the handle. + +--- + usr/iscsi_util.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/usr/iscsi_util.c b/usr/iscsi_util.c +index 0570dd5..fd8fc0c 100644 +--- a/usr/iscsi_util.c ++++ b/usr/iscsi_util.c +@@ -62,6 +62,7 @@ void daemon_init(void) + setsid(); + if (chdir("/") < 0) + log_debug(1, "Could not chdir to /: %s", strerror(errno)); ++ close(fd); + } + + #define ISCSI_OOM_PATH_LEN 48 +-- +2.21.0 + diff --git a/6017-Out-of-bounds-read.patch b/6017-Out-of-bounds-read.patch new file mode 100644 index 0000000..f2ed69e --- /dev/null +++ b/6017-Out-of-bounds-read.patch @@ -0,0 +1,35 @@ +From de0680b4f46f767c34a4a503dadcb24135c21cb6 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Wed, 30 Oct 2019 14:12:16 -0700 +Subject: [PATCH 34/43] Out-of-bounds read: Overrunning array of 4 bytes at + byte offset 7 by dereferencing pointer + +--- + iscsiuio/src/unix/libs/qedi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/iscsiuio/src/unix/libs/qedi.c b/iscsiuio/src/unix/libs/qedi.c +index b7595d5..3414cb5 100644 +--- a/iscsiuio/src/unix/libs/qedi.c ++++ b/iscsiuio/src/unix/libs/qedi.c +@@ -442,7 +442,7 @@ static int qedi_open(nic_t *nic) + qedi_t *bp = NULL; + struct stat uio_stat; + int i, rc; +- int count; ++ size_t count; + uint32_t bus; + uint32_t slot; + uint32_t func; +@@ -666,7 +666,7 @@ static int qedi_open(nic_t *nic) + nic->mac_addr[0], nic->mac_addr[1], nic->mac_addr[2], + nic->mac_addr[3], nic->mac_addr[4], nic->mac_addr[5]); + +- qedi_get_library_name(&nic->library_name, (size_t *)&count); ++ qedi_get_library_name(&nic->library_name, &count); + LOG_INFO("%s: qedi initialized", nic->log_name); + + bp->flags |= QEDI_OPENED; +-- +2.21.0 + diff --git a/6018-fwparam_pcc-mulitple-resource-leaks.patch b/6018-fwparam_pcc-mulitple-resource-leaks.patch new file mode 100644 index 0000000..13fd987 --- /dev/null +++ b/6018-fwparam_pcc-mulitple-resource-leaks.patch @@ -0,0 +1,39 @@ +From f7d92a5f0a788179bf804dd898d2b5238da5d2d1 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Thu, 31 Oct 2019 14:24:53 -0700 +Subject: [PATCH 39/43] fwparam_pcc mulitple resource leaks + +Resource Leak: Variable mac_file going out of scope leaks the storage it points to. +Resource Leak: Handle variable mac_fd going out of scope leaks the storage it points to. +--- + utils/fwparam_ibft/fwparam_ppc.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/utils/fwparam_ibft/fwparam_ppc.c b/utils/fwparam_ibft/fwparam_ppc.c +index 52a5c50..429d45c 100644 +--- a/utils/fwparam_ibft/fwparam_ppc.c ++++ b/utils/fwparam_ibft/fwparam_ppc.c +@@ -132,6 +132,7 @@ static int locate_mac(const char *devtree, struct ofw_dev *ofwdev) + error = errno; + fprintf(stderr, "%s: open %s, %s\n", __func__, mac_file, + strerror(errno)); ++ free(mac_file); + goto lpm_bail; + } + +@@ -140,12 +141,10 @@ static int locate_mac(const char *devtree, struct ofw_dev *ofwdev) + error = EIO; + fprintf(stderr, "%s: read %s, %s\n", __func__, mac_file, + strerror(errno)); +- goto lpm_bail; + } + free(mac_file); + close(mac_fd); + +- + lpm_bail: + return error; + } +-- +2.21.0 + diff --git a/6019-Resource-leak-Handl-variable-fd.patch b/6019-Resource-leak-Handl-variable-fd.patch new file mode 100644 index 0000000..2cbabe0 --- /dev/null +++ b/6019-Resource-leak-Handl-variable-fd.patch @@ -0,0 +1,25 @@ +From 504b990bc886d708ae673ac1fa0e09e7911c2823 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Thu, 31 Oct 2019 15:08:40 -0700 +Subject: [PATCH 40/43] Resource leak: Handle variable fd going out of scope + leaks the handle. + +--- + iscsiuio/src/unix/main.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/iscsiuio/src/unix/main.c b/iscsiuio/src/unix/main.c +index 5168e4e..5e3f66c 100644 +--- a/iscsiuio/src/unix/main.c ++++ b/iscsiuio/src/unix/main.c +@@ -196,6 +196,7 @@ static void daemon_init() + dup2(fd, 2); + setsid(); + chdir("/"); ++ close(fd); + } + + #define ISCSI_OOM_PATH_LEN 48 +-- +2.21.0 + diff --git a/6020-Resource-leak-Variable-raw.patch b/6020-Resource-leak-Variable-raw.patch new file mode 100644 index 0000000..0201b0b --- /dev/null +++ b/6020-Resource-leak-Variable-raw.patch @@ -0,0 +1,25 @@ +From 860187423092ba43112f4c2d303978dda7254c58 Mon Sep 17 00:00:00 2001 +From: Chris Leech +Date: Thu, 31 Oct 2019 15:22:02 -0700 +Subject: [PATCH 42/43] Resource leak: Variable raw going out of scope leaks + the storage it points to. + +--- + iscsiuio/src/unix/nic_utils.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/iscsiuio/src/unix/nic_utils.c b/iscsiuio/src/unix/nic_utils.c +index aad679e..84ffc5c 100644 +--- a/iscsiuio/src/unix/nic_utils.c ++++ b/iscsiuio/src/unix/nic_utils.c +@@ -245,6 +245,7 @@ int nic_discover_iscsi_hosts() + "space for NIC %s " + "during scan", raw); + ++ free(raw); + rc = -ENOMEM; + break; + } +-- +2.21.0 + diff --git a/6021-Allow-reading-sysfs-port-to-fail-gracefully.patch b/6021-Allow-reading-sysfs-port-to-fail-gracefully.patch new file mode 100644 index 0000000..7c12f0e --- /dev/null +++ b/6021-Allow-reading-sysfs-port-to-fail-gracefully.patch @@ -0,0 +1,29 @@ +From d8298fc54eb69d3989878be46e9c7d6ec2055650 Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Mon, 24 Sep 2018 16:22:18 -0700 +Subject: [PATCH 05/87] Allow reading sysfs "port" to fail gracefully. + +Do not consider it a fatal error if reading sysfs value +for "port" fails, since we allow failure for "address". +--- + libopeniscsiusr/session.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libopeniscsiusr/session.c b/libopeniscsiusr/session.c +index a833939..f8c89c3 100644 +--- a/libopeniscsiusr/session.c ++++ b/libopeniscsiusr/session.c +@@ -205,8 +205,8 @@ int iscsi_session_get(struct iscsi_context *ctx, uint32_t sid, + _sysfs_prop_get_str(ctx, sysfs_con_dir_path, "address", (*se)->address, + sizeof((*se)->address) / sizeof(char), ""); + +- _good(_sysfs_prop_get_i32(ctx, sysfs_con_dir_path, "port", +- &((*se)->port), -1, false), rc, out); ++ _sysfs_prop_get_i32(ctx, sysfs_con_dir_path, "port", ++ &((*se)->port), -1, true); + + if ((strcmp((*se)->address, "") == 0) && + (strcmp((*se)->persistent_address, "") != 0)) +-- +1.8.3.1 + diff --git a/6022-Fix-incorrect-sysfs-logic-for-port-and-ip-address.patch b/6022-Fix-incorrect-sysfs-logic-for-port-and-ip-address.patch new file mode 100644 index 0000000..b0e5ab5 --- /dev/null +++ b/6022-Fix-incorrect-sysfs-logic-for-port-and-ip-address.patch @@ -0,0 +1,50 @@ +From 7df5edbb427c79337bdd651c2bcdda8eb05f077b Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Mon, 24 Sep 2018 16:30:34 -0700 +Subject: [PATCH 06/87] Fix incorrect sysfs logic for port and ip address. + +If "port" is available and "persistent_port" is not, then +correctly use the one that is present for both values. +Likewise for "address" and "persistent_address". +--- + libopeniscsiusr/session.c | 18 ++++++++---------- + 1 file changed, 8 insertions(+), 10 deletions(-) + +diff --git a/libopeniscsiusr/session.c b/libopeniscsiusr/session.c +index f8c89c3..98601dc 100644 +--- a/libopeniscsiusr/session.c ++++ b/libopeniscsiusr/session.c +@@ -208,22 +208,20 @@ int iscsi_session_get(struct iscsi_context *ctx, uint32_t sid, + _sysfs_prop_get_i32(ctx, sysfs_con_dir_path, "port", + &((*se)->port), -1, true); + +- if ((strcmp((*se)->address, "") == 0) && +- (strcmp((*se)->persistent_address, "") != 0)) +- _strncpy((*se)->persistent_address, (*se)->address, +- sizeof((*se)->persistent_address) / sizeof(char)); +- + if ((strcmp((*se)->address, "") != 0) && + (strcmp((*se)->persistent_address, "") == 0)) ++ _strncpy((*se)->persistent_address, (*se)->address, ++ sizeof((*se)->persistent_address) / sizeof(char)); ++ else if ((strcmp((*se)->address, "") == 0) && ++ (strcmp((*se)->persistent_address, "") != 0)) + _strncpy((*se)->address, (*se)->persistent_address, + sizeof((*se)->address) / sizeof(char)); + +- if (((*se)->persistent_port != -1) && +- ((*se)->port == -1)) ++ if (((*se)->persistent_port == -1) && ++ ((*se)->port != -1)) + (*se)->persistent_port = (*se)->port; +- +- if (((*se)->persistent_port != -1) && +- ((*se)->port == -1)) ++ else if (((*se)->persistent_port != -1) && ++ ((*se)->port == -1)) + (*se)->port = (*se)->persistent_port; + + _good(_iscsi_host_id_of_session(ctx, sid, &host_id), rc, out); +-- +1.8.3.1 + diff --git a/6023-Handle-ENOTCONN-error-separately-when-reading-sysfs.patch b/6023-Handle-ENOTCONN-error-separately-when-reading-sysfs.patch new file mode 100644 index 0000000..86ee901 --- /dev/null +++ b/6023-Handle-ENOTCONN-error-separately-when-reading-sysfs.patch @@ -0,0 +1,65 @@ +From ae0b2ceb620e2bf527c06d21c110791d1e0e8bf4 Mon Sep 17 00:00:00 2001 +From: Lee Duncan +Date: Tue, 25 Sep 2018 09:57:46 -0700 +Subject: [PATCH 10/87] Handle ENOTCONN error separately when reading sysfs + values. + +This error happens when the daemon is attempting to +reconnect a session when starting up, so should not +be considered an internal error. +--- + libopeniscsiusr/sysfs.c | 31 +++++++++++++++++++++++++++++++ + 1 file changed, 31 insertions(+) + +diff --git a/libopeniscsiusr/sysfs.c b/libopeniscsiusr/sysfs.c +index 5e6532e..2c3f077 100644 +--- a/libopeniscsiusr/sysfs.c ++++ b/libopeniscsiusr/sysfs.c +@@ -184,6 +184,21 @@ int _sysfs_prop_get_str(struct iscsi_context *ctx, const char *dir_path, + _error(ctx, "Failed to read '%s': " + "permission deny when reading '%s'", prop_name, + file_path); ++ } else if (errno_save == ENOTCONN) { ++ if (default_value == NULL) { ++ rc = LIBISCSI_ERR_SYSFS_LOOKUP; ++ _error(ctx, "Failed to read '%s': " ++ "error when reading '%s': " ++ "Target unavailable", ++ prop_name, file_path); ++ } else { ++ _info(ctx, "Failed to read '%s': " ++ "error when reading '%s': " ++ "Target unavailable, using default value '%s'", ++ prop_name, file_path, default_value); ++ memcpy(buff, (void *) default_value, ++ strlen(default_value) + 1); ++ } + } else { + rc = LIBISCSI_ERR_BUG; + _error(ctx, "Failed to read '%s': " +@@ -246,6 +261,22 @@ static int iscsi_sysfs_prop_get_ll(struct iscsi_context *ctx, + _error(ctx, "Permission deny when reading '%s'", + file_path); + goto out; ++ } else if (errno_save == ENOTCONN) { ++ if (!ignore_error) { ++ rc = LIBISCSI_ERR_SYSFS_LOOKUP; ++ _error(ctx, "Failed to read '%s': " ++ "error when reading '%s': " ++ "Target unavailable", ++ prop_name, file_path); ++ goto out; ++ } else { ++ _info(ctx, "Failed to read '%s': " ++ "error when reading '%s': " ++ "Target unavailable, using default value %lld", ++ prop_name, file_path, default_value); ++ *val = default_value; ++ goto out; ++ } + } else { + rc = LIBISCSI_ERR_BUG; + _error(ctx, "Error when reading '%s': %d", file_path, +-- +1.8.3.1 + diff --git a/6024-update-service-files.patch b/6024-update-service-files.patch new file mode 100644 index 0000000..5fc2fc5 --- /dev/null +++ b/6024-update-service-files.patch @@ -0,0 +1,123 @@ +From 74df2457ac1f91fa752d3143e2e6b6f99b67a0a8 Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Wed, 8 Jan 2020 03:26:02 -0500 +Subject: [PATCH] update service files + +--- + etc/systemd/iscsi.service | 18 ++++++++++++++++++ + etc/systemd/iscsid.service | 14 +++++++++----- + etc/systemd/iscsid.socket | 2 +- + etc/systemd/iscsiuio.service | 19 +++++++++++++++++++ + etc/systemd/iscsiuio.socket | 9 +++++++++ + 5 files changed, 56 insertions(+), 6 deletions(-) + create mode 100644 etc/systemd/iscsi.service + create mode 100644 etc/systemd/iscsiuio.service + create mode 100644 etc/systemd/iscsiuio.socket + +diff --git a/etc/systemd/iscsi.service b/etc/systemd/iscsi.service +new file mode 100644 +index 0000000..e475888 +--- /dev/null ++++ b/etc/systemd/iscsi.service +@@ -0,0 +1,18 @@ ++[Unit] ++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.service ++ConditionPathExists=/etc/iscsi/initiatorname.iscsi ++ ++[Service] ++Type=oneshot ++ExecStart=/sbin/iscsiadm -m node --loginall=automatic ++ExecStop=/sbin/iscsiadm -m node --logoutall=automatic ++ExecStop=/sbin/iscsiadm -m node --logoutall=manual ++SuccessExitStatus=21 ++RemainAfterExit=true ++ ++[Install] ++WantedBy=remote-fs.target +diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service +index 028e0b3..4fef168 100644 +--- a/etc/systemd/iscsid.service ++++ b/etc/systemd/iscsid.service +@@ -1,13 +1,17 @@ + [Unit] + Description=Open-iSCSI + Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) +-After=network.target NetworkManager-wait-online.service iscsiuio.service tgtd.service targetcli.service ++DefaultDependencies=no ++DefaultDependencies=no ++After=network.target iscsiuio.service ++Before=remote-fs-pre.target + + [Service] +-Type=forking +-PIDFile=/var/run/iscsid.pid +-ExecStart=/usr/sbin/iscsid +-ExecStop=/sbin/iscsiadm -k 0 2 ++Type=notify ++NotifyAccess=main ++ExecStart=/sbin/iscsid -f ++KillMode=mixed ++Restart=on-failure + + [Install] + WantedBy=multi-user.target ++Also=iscsid.socket +diff --git a/etc/systemd/iscsid.socket b/etc/systemd/iscsid.socket +index 832451d..58a8d12 100644 +--- a/etc/systemd/iscsid.socket ++++ b/etc/systemd/iscsid.socket +@@ -1,6 +1,6 @@ + [Unit] + Description=Open-iSCSI iscsid Socket +-Documentation=man:iscsid(8) man:iscsiuio(8) man:iscsiadm(8) ++Documentation=man:iscsid(8) man:iscsiadm(8) + + [Socket] + ListenStream=@ISCSIADM_ABSTRACT_NAMESPACE +diff --git a/etc/systemd/iscsiuio.service b/etc/systemd/iscsiuio.service +new file mode 100644 +index 0000000..e4d9fd0 +--- /dev/null ++++ b/etc/systemd/iscsiuio.service +@@ -0,0 +1,19 @@ ++[Unit] ++Description=iSCSI UserSpace I/O driver ++Documentation=man:iscsiuio(8) ++DefaultDependencies=no ++Conflicts=shutdown.target ++Requires=iscsid.service ++BindTo=iscsid.service ++After=network.target ++Before=remote-fs-pre.target iscsid.service ++ ++[Service] ++Type=notify ++NotifyAccess=main ++ExecStart=/sbin/iscsiuio -f ++KillMode=mixed ++Restart=on-failure ++ ++[Install] ++WantedBy=multi-user.target +diff --git a/etc/systemd/iscsiuio.socket b/etc/systemd/iscsiuio.socket +new file mode 100644 +index 0000000..d42cedc +--- /dev/null ++++ b/etc/systemd/iscsiuio.socket +@@ -0,0 +1,9 @@ ++[Unit] ++Description=Open-iSCSI iscsiuio Socket ++Documentation=man:iscsiuio(8) ++ ++[Socket] ++ListenStream=@ISCSID_UIP_ABSTRACT_NAMESPACE ++ ++[Install] ++WantedBy=sockets.target +-- +1.8.3.1 + diff --git a/9000-change-iscsi-iqn-default-value.patch b/9000-change-iscsi-iqn-default-value.patch new file mode 100644 index 0000000..8a5ecc7 --- /dev/null +++ b/9000-change-iscsi-iqn-default-value.patch @@ -0,0 +1,41 @@ +From 2fb5d2dbcfdc052881749e22268c06b1402257a7 Mon Sep 17 00:00:00 2001 +From: pengyeqing +Date: Sat, 26 Jan 2019 22:09:24 +0800 +Subject: [PATCH] iscsi-initiator-utils: change iscsi iqn default value + +reason:change iscsi iqn default value + +Signed-off-by: pengyeqing +--- + doc/iscsi-iname.8 | 2 +- + utils/iscsi-iname.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/doc/iscsi-iname.8 b/doc/iscsi-iname.8 +index a55d666d1af3..dd77ed9f3165 100644 +--- a/doc/iscsi-iname.8 ++++ b/doc/iscsi-iname.8 +@@ -14,7 +14,7 @@ generates a unique iSCSI node name on every invocation. + Display help + .TP + .BI [-p=]\fIprefix\fP +-Use the prefix passed in instead of the default "iqn.2005-03.org.open-iscsi" ++Use the prefix passed in instead of the default "iqn.2012-01.com.openeuler" + + .SH AUTHORS + Open-iSCSI project +diff --git a/utils/iscsi-iname.c b/utils/iscsi-iname.c +index cb2f6c8..926bf3a 100644 +--- a/utils/iscsi-iname.c ++++ b/utils/iscsi-iname.c +@@ -73,7 +73,7 @@ main(int argc, char *argv[]) + exit(0); + } + } else { +- prefix = "iqn.2005-03.org.open-iscsi"; ++ prefix = "iqn.2012-01.com.openeuler"; + } + + /* try to feed some entropy from the pool to MD5 in order to get +-- +1.8.3.1 diff --git a/9001-iscsid-Check-nr_sessions-when-creating-a-copy-of-exi.patch b/9001-iscsid-Check-nr_sessions-when-creating-a-copy-of-exi.patch new file mode 100644 index 0000000..6014793 --- /dev/null +++ b/9001-iscsid-Check-nr_sessions-when-creating-a-copy-of-exi.patch @@ -0,0 +1,109 @@ +From 47849daf73c1978491c05e9619063ff8a529ca48 Mon Sep 17 00:00:00 2001 +From: Tang Chen +Date: Thu, 12 Oct 2017 04:56:16 +0800 +Subject: [PATCH 1/1] iscsid: Check nr_sessions when creating a copy of + existing session + +For multipath configurations, you may want more than one session to be +created on each iface record. If node.session.nr_sessions is greater +than 1, performing a 'login' for that node will ensure that the +appropriate number of sessions is created. + + node.session.nr_sessions = 1 + +In iscsiadm command, we set session.multiple to 1, which means we can +create multiple copies of an existing session. + +iscsi_login_portal() +|--> rec->session.multiple = 1 + +But in iscsid, we didn't check nr_sessions when executing login task. + +__session_login_task() +|--> session_is_running() + |--> iscsi_sysfs_for_each_session() +|--> if (rec->session.multiple) + log_debug(2, "Adding a copy of an existing session"); + +So this patch adds a checking to iscsid login task. + +Signed-off-by: Tang Chen + +--- + usr/initiator.c | 31 ++++++++++++++++++------------- + 1 files changed, 18 insertions(+), 13 deletions(-) + +diff --git a/usr/initiator.c b/usr/initiator.c +index a86d1e6..9248962 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -1754,10 +1754,11 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context, + return 0; + } + +-static iscsi_session_t* session_find_by_rec(node_rec_t *rec) ++static int session_find_by_rec(node_rec_t *rec) + { + struct iscsi_transport *t; + iscsi_session_t *session; ++ int nr_found = 0; + + list_for_each_entry(t, &transports, list) { + list_for_each_entry(session, &t->sessions, list) { +@@ -1766,24 +1767,23 @@ static iscsi_session_t* session_find_by_rec(node_rec_t *rec) + session->nrec.conn[0].port, + &session->nrec.iface, + MATCH_ANY_SID)) +- return session; ++ nr_found++; + } + } +- return NULL; ++ return nr_found; + } + + /* + * a session could be running in the kernel but not in iscsid + * due to a resync or because some other app started the session + */ +-static int session_is_running(node_rec_t *rec) ++static int session_is_running(node_rec_t *rec, int *nr_found) + { +- int nr_found = 0; +- +- if (session_find_by_rec(rec)) ++ *nr_found = session_find_by_rec(rec); ++ if (*nr_found) + return 1; + +- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session, ++ if (iscsi_sysfs_for_each_session(rec, nr_found, iscsi_match_session, + 0)) + return 1; + +@@ -1795,12 +1795,17 @@ static int __session_login_task(node_rec_t *rec, queue_task_t *qtask) + iscsi_session_t *session; + iscsi_conn_t *conn; + struct iscsi_transport *t; +- int rc; +- +- if (session_is_running(rec)) { +- if (rec->session.multiple) ++ int rc, nr_found = 0; ++ ++ if (session_is_running(rec, &nr_found)) { ++ if (rec->session.multiple) { ++ if (nr_found >= rec->session.nr_sessions) { ++ log_debug(2, "Cannot add more copy of session," ++ " %d found.\n", nr_found); ++ return ISCSI_ERR_SESS_EXISTS; ++ } + log_debug(2, "Adding a copy of an existing session"); +- else ++ } else + return ISCSI_ERR_SESS_EXISTS; + } + +-- +1.8.3.1 + diff --git a/9002-add-sleep-for-service.patch b/9002-add-sleep-for-service.patch new file mode 100644 index 0000000..3acd92f --- /dev/null +++ b/9002-add-sleep-for-service.patch @@ -0,0 +1,23 @@ +From 8badb69eb47e3c93619fccf5667a0d681b5a34a6 Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Wed, 8 Jan 2020 03:33:14 -0500 +Subject: [PATCH] iscsi-initiator-utils: add sleep for service + +--- + etc/systemd/iscsid.service | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service +index 4fef168..8df224e 100644 +--- a/etc/systemd/iscsid.service ++++ b/etc/systemd/iscsid.service +@@ -9,6 +9,7 @@ Before=remote-fs-pre.target + Type=notify + NotifyAccess=main + ExecStart=/sbin/iscsid -f ++ExecStartPost=/usr/bin/sleep 1 + KillMode=mixed + Restart=on-failure + +-- +1.8.3.1 diff --git a/9003-not-send-stop-message-if-iscsid-absent.patch b/9003-not-send-stop-message-if-iscsid-absent.patch new file mode 100644 index 0000000..fdc2f15 --- /dev/null +++ b/9003-not-send-stop-message-if-iscsid-absent.patch @@ -0,0 +1,148 @@ +From 17764fc96f0ece0dca472d7f9b6105c62b4d7701 Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Wed, 8 Jan 2020 03:43:16 -0500 +Subject: [PATCH] iscsi-initiator-utils: not send stop message if iscsid absent + +--- + etc/systemd/iscsid.service | 1 + + etc/systemd/iscsiuio.service | 3 +- + usr/iscsiadm.c | 71 ++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 74 insertions(+), 1 deletion(-) + +diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service +index 8df224e..fd85d52 100644 +--- a/etc/systemd/iscsid.service ++++ b/etc/systemd/iscsid.service +@@ -12,6 +12,7 @@ ExecStart=/sbin/iscsid -f + ExecStartPost=/usr/bin/sleep 1 + KillMode=mixed + Restart=on-failure ++RestartSec=2s + + [Install] + WantedBy=multi-user.target +diff --git a/etc/systemd/iscsiuio.service b/etc/systemd/iscsiuio.service +index e4d9fd0..6bae65b 100644 +--- a/etc/systemd/iscsiuio.service ++++ b/etc/systemd/iscsiuio.service +@@ -4,7 +4,7 @@ Documentation=man:iscsiuio(8) + DefaultDependencies=no + Conflicts=shutdown.target + Requires=iscsid.service +-BindTo=iscsid.service ++BindsTo=iscsid.service + After=network.target + Before=remote-fs-pre.target iscsid.service + +@@ -14,6 +14,7 @@ NotifyAccess=main + ExecStart=/sbin/iscsiuio -f + KillMode=mixed + Restart=on-failure ++TimeoutStopSec=1 + + [Install] + WantedBy=multi-user.target +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index 4796c2f..8b5d5fe 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -69,6 +69,8 @@ static char program_name[] = "iscsiadm"; + static char config_file[TARGET_NAME_MAXLEN]; + extern struct iscsi_ipc *ipc; + ++#define ISCSIPID_LEN 256 ++ + enum iscsiadm_mode { + MODE_DISCOVERY, + MODE_DISCOVERYDB, +@@ -267,11 +269,52 @@ str_to_portal_type(char *str) + return ptype; + } + ++/** ++ * get_content() - Utility function to read hex values from sysfs ++ * @param pidfile - path to use ++ * @parm buf - this is the value returned from the entry ++ * @return 0 on success <0 on failure ++ * @note: buf[] return without '\0' ++ */ ++static int get_file_content(const char *pidfile, char buf[], int buflen) ++{ ++ int rc = 0; ++ FILE *fp = NULL; ++ size_t chars_read = 0; ++ ++ fp = fopen(pidfile, "r"); ++ if (fp == NULL) { ++ log_error("Could not open path: %s [%s]", ++ pidfile, strerror(errno)); ++ rc = -EIO; ++ goto error_fopen; ++ } ++ ++ chars_read = fread(buf, 1, buflen, fp); ++ if ((chars_read <= 0) && ferror(fp)) { ++ log_error("Could not read from: %s [%s]", ++ pidfile, strerror(ferror(fp))); ++ rc = -EIO; ++ goto error; ++ } ++ ++error: ++ fclose(fp); ++ ++error_fopen: ++ return rc; ++} ++ + static void kill_iscsid(int priority, int tmo) + { + iscsiadm_req_t req; + iscsiadm_rsp_t rsp; + int rc; ++ char *pTmp = NULL; ++ char iscsidpid[ISCSIPID_LEN] = {0}; ++ char procpid[ISCSIPID_LEN] = {0}; ++ char cmdline[ISCSIPID_LEN] = {0}; ++ char iscsidcmdline[ISCSIPID_LEN] = {0}; + + /* + * We only support SIGTERM like stoppage of iscsid for now. +@@ -287,6 +330,34 @@ static void kill_iscsid(int priority, int tmo) + return; + } + ++ /* if pid of iscsid is present, go on; or return directly */ ++ rc = get_file_content(PID_FILE, iscsidpid, ISCSIPID_LEN); ++ if (rc != 0) { ++ return; ++ } ++ ++ snprintf(procpid, ISCSIPID_LEN, "/proc/%ld/cmdline", atol(iscsidpid)); ++ ++ rc = get_file_content(procpid, cmdline, ISCSIPID_LEN); ++ if (rc != 0) { ++ return; ++ } ++ ++ snprintf(iscsidcmdline, ISCSIPID_LEN, "%s", cmdline); ++ ++ pTmp = strstr(iscsidcmdline, "iscsid"); ++ if (NULL == pTmp) { ++ log_error("iscsid pid mismatch proc cmdline, pid:%ld, cmdline:%s.\n", atol(iscsidpid), iscsidcmdline); ++ return; ++ } else { ++ rc = kill(atol(iscsidpid), 0); ++ if (ESRCH == rc) { ++ log_error("iscsid %d maybe in zombie.\n", atol(iscsidpid)); ++ return; ++ } ++ } ++ /* end */ ++ + memset(&req, 0, sizeof(req)); + req.command = MGMT_IPC_IMMEDIATE_STOP; + rc = iscsid_exec_req(&req, &rsp, 0, tmo); +-- +1.8.3.1 + diff --git a/9004-iscsid-SIGTERM-syncprocess-hang.patch b/9004-iscsid-SIGTERM-syncprocess-hang.patch new file mode 100644 index 0000000..f727aa3 --- /dev/null +++ b/9004-iscsid-SIGTERM-syncprocess-hang.patch @@ -0,0 +1,76 @@ +From 1f4eb61f62a4f4245ddfd61440eb679f65ae8194 Mon Sep 17 00:00:00 2001 +From: pengyeqing +Date: Sat, 26 Jan 2019 23:41:05 +0800 +Subject: [PATCH] iscsi-initiator-utils: iscsid SIGTERM syncprocess hang + +reason:iscsid SIGTERM syncprocess hang + +Signed-off-by: pengyeqing +--- + usr/iscsid.c | 2 ++ + usr/iscsid_req.c | 10 ++++++++++ + usr/iscsid_req.h | 1 + + 3 files changed, 13 insertions(+) + +diff --git a/usr/iscsid.c b/usr/iscsid.c +index b95917d..48d0f52 100644 +--- a/usr/iscsid.c ++++ b/usr/iscsid.c +@@ -39,6 +39,7 @@ + #include "mgmt_ipc.h" + #include "event_poll.h" + #include "iscsi_ipc.h" ++#include "iscsid_req.h" + #include "log.h" + #include "iscsi_util.h" + #include "initiator.h" +@@ -314,6 +315,7 @@ static void catch_signal(int signo) + switch (signo) { + case SIGTERM: + event_loop_exit(NULL); ++ signal_term_in(); + break; + default: + break; +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index d18b14d..76aa035 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -37,6 +37,13 @@ + #include "iscsid_req.h" + #include "uip_mgmt_ipc.h" + ++static int sigterm_in; ++ ++void signal_term_in() ++{ ++ sigterm_in= 1; ++} ++ + static void iscsid_startup(void) + { + char *startup_cmd; +@@ -145,6 +152,9 @@ int iscsid_response(int fd, iscsiadm_cmd_e cmd, iscsiadm_rsp_t *rsp, + while (len) { + struct pollfd pfd; + ++ if (sigterm_in) ++ return ISCSI_ERR_ISCSID_COMM_ERR; ++ + pfd.fd = fd; + pfd.events = POLLIN; + err = poll(&pfd, 1, timeout); +diff --git a/usr/iscsid_req.h b/usr/iscsid_req.h +index d580ed2..6f139a8 100644 +--- a/usr/iscsid_req.h ++++ b/usr/iscsid_req.h +@@ -41,5 +41,6 @@ extern int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid); + + extern int uip_broadcast(void *buf, size_t buf_len, int fd_flags, + uint32_t *status); ++extern void signal_term_in(void); + + #endif +-- +1.8.3.1 + diff --git a/9005-fix-timeout-setting-on-session-commands.patch b/9005-fix-timeout-setting-on-session-commands.patch new file mode 100644 index 0000000..8e1822a --- /dev/null +++ b/9005-fix-timeout-setting-on-session-commands.patch @@ -0,0 +1,29 @@ +From 3de6ac0237bf10e6ba60e72faa4c06cfb469e070 Mon Sep 17 00:00:00 2001 +From: pengyeqing +Date: Sat, 26 Jan 2019 23:53:37 +0800 +Subject: [PATCH] iscsi-initiator-utils: fix timeout setting on session + commands + +reason:fix timeout setting on session commands + +Signed-off-by: pengyeqing +--- + usr/iscsiadm.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c +index a6b9605..5d432cd 100644 +--- a/usr/iscsiadm.c ++++ b/usr/iscsiadm.c +@@ -4018,6 +4018,8 @@ main(int argc, char **argv) + goto out; + } + ++ info->iscsid_req_tmo = -1; ++ + rc = iscsi_sysfs_get_sessioninfo_by_id(info, session); + if (rc) { + log_error("Could not get session info for sid " +-- +1.8.3.1 + diff --git a/9006-restart-log-daemon-when-exited-abnormally.patch b/9006-restart-log-daemon-when-exited-abnormally.patch new file mode 100644 index 0000000..76b09fd --- /dev/null +++ b/9006-restart-log-daemon-when-exited-abnormally.patch @@ -0,0 +1,296 @@ +From 10886ac1cf645b7eefb113a03eb31ef7a49f5910 Mon Sep 17 00:00:00 2001 +From: wangjufeng +Date: Sat, 20 Oct 2018 14:50:28 +0800 +Subject: [PATCH] tt + +--- + usr/event_poll.c | 17 +++++++- + usr/iscsid.c | 2 +- + usr/log.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + usr/log.h | 6 +++ + 4 files changed, 140 insertions(+), 5 deletions(-) + +diff --git a/usr/event_poll.c b/usr/event_poll.c +index ac25044..a3a3676 100644 +--- a/usr/event_poll.c ++++ b/usr/event_poll.c +@@ -134,8 +134,11 @@ void event_loop_exit(queue_task_t *qtask) + + void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + { +- struct pollfd poll_array[POLL_MAX]; ++ struct pollfd poll_array[POLL_MAX + 1]; + int res, has_shutdown_children = 0; ++ int log_timerfd = log_get_timerfd(); ++ int pool_count = POLL_MAX; ++ int poll_timerfd_index = -1; + sigset_t sigset; + int sig_fd; + +@@ -157,6 +160,13 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + poll_array[POLL_ALARM].fd = sig_fd; + poll_array[POLL_ALARM].events = POLLIN; + ++ if (log_timerfd >= 0) { ++ poll_array[POLL_MAX].fd = log_timerfd; ++ poll_array[POLL_MAX].events = POLLIN; ++ poll_timerfd_index = POLL_MAX; ++ pool_count += 1; ++ } ++ + event_loop_stop = 0; + while (1) { + if (event_loop_stop) { +@@ -171,7 +181,7 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + /* Runs actors and may set alarm for future actors */ + actor_poll(); + +- res = poll(poll_array, POLL_MAX, reap_count ? REAP_WAKEUP : -1); ++ res = poll(poll_array, pool_count, reap_count ? REAP_WAKEUP : -1); + + if (res > 0) { + log_debug(6, "poll result %d", res); +@@ -181,6 +191,9 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd) + if (poll_array[POLL_IPC].revents) + mgmt_ipc_handle(mgmt_ipc_fd); + ++ if(log_timerfd >= 0 && poll_array[poll_timerfd_index].revents) ++ log_watchdog_handle(); ++ + if (poll_array[POLL_ALARM].revents) { + struct signalfd_siginfo si; + +diff --git a/usr/iscsid.c b/usr/iscsid.c +index 8202bc9..6329644 100644 +--- a/usr/iscsid.c ++++ b/usr/iscsid.c +@@ -59,7 +59,6 @@ struct iscsi_daemon_config daemon_config; + struct iscsi_daemon_config *dconfig = &daemon_config; + + static char program_name[] = "iscsid"; +-static pid_t log_pid; + static gid_t gid; + static int daemonize = 1; + static int mgmt_ipc_fd; +@@ -302,6 +301,7 @@ static void iscsid_shutdown(void) + log_debug(1, "daemon stopping"); + log_close(log_pid); + } ++ log_close_watchdog_timer(); + } + + static void catch_signal(int signo) +diff --git a/usr/log.c b/usr/log.c +index b730642..35d5564 100644 +--- a/usr/log.c ++++ b/usr/log.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include "iscsi_util.h" + #include "log.h" +@@ -33,6 +34,13 @@ + + char *log_name; + int log_level = 0; ++pid_t log_pid = -1; ++ ++static int default_watchdog_timeout = 4; ++static char program_name[] = "iscsid"; ++static int watchdog_timerfd = -1; ++static int last_watchdog_count = 0; ++static int watchdog_noupdate_count = 0; + + static int log_stop_daemon = 0; + static void (*log_func)(int prio, void *priv, const char *fmt, va_list ap); +@@ -141,6 +149,7 @@ static int logarea_init (int size) + la->shmid_buff = shmid; + la->ops[0].sem_num = 0; + la->ops[0].sem_flg = 0; ++ la->watchdog_count = 0; + + return 0; + +@@ -414,6 +423,105 @@ static void __log_close(void) + } + } + ++static int log_restart_daemon(void) ++{ ++ log_close(log_pid); ++ log_pid = log_init(program_name, DEFAULT_AREA_SIZE, log_do_log_daemon, NULL); ++ if (log_pid < 0) ++ return -1; ++ return 0; ++} ++ ++static int log_watchdog_setup(void) ++{ ++ int r; ++ struct itimerspec new_value; ++ uint32_t period_inus = 1 * 1000000; /*1 second*/ ++ uint32_t seconds; ++ uint32_t nanoseconds; ++ if (log_stop_daemon || watchdog_timerfd >= 0) ++ return 0; ++ ++ watchdog_timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); ++ if (watchdog_timerfd < 0) { ++ syslog(LOG_ERR, "Create watchdog timer failed. errno: %d", errno); ++ return -1; ++ } ++ seconds = period_inus / 1000000; ++ nanoseconds = (period_inus - (seconds * 1000000)) * 1000; ++ new_value.it_interval.tv_sec = seconds; ++ new_value.it_interval.tv_nsec = nanoseconds; ++ new_value.it_value.tv_sec = seconds; ++ new_value.it_value.tv_nsec = nanoseconds; ++ ++ r = timerfd_settime(watchdog_timerfd, 0, &new_value, NULL); ++ if (r < 0) { ++ syslog(LOG_ERR, "Set watchdog timer failed. errno: %d", errno); ++ log_close_watchdog_timer(); ++ return -1; ++ } ++ return 0; ++} ++ ++static int log_read_comm_frpm_pid(pid_t pid, char *buffer, int len) ++{ ++ char comm_file[256]; ++ char comm_content[1024]; ++ int r; ++ FILE *fd = NULL; ++ buffer[0] = '\0'; ++ snprintf(comm_file, sizeof(comm_file), "/proc/%i/comm", pid); ++ fd = fopen(comm_file, "r"); ++ if (!fd) ++ return -1; ++ if (!fgets(buffer, len, fd)) { ++ log_warning("Can not read file. File:%s.", comm_file); ++ fclose(fd); ++ fd = NULL; ++ return -1; ++ } ++ fclose(fd); ++ fd = NULL; ++ return 0; ++} ++ ++int log_get_timerfd(void) ++{ ++ return watchdog_timerfd; ++} ++ ++void log_close_watchdog_timer(void) ++{ ++ if(watchdog_timerfd >= 0) { ++ close(watchdog_timerfd); ++ watchdog_timerfd = -1; ++ } ++} ++ ++void log_watchdog_handle(void) ++{ ++ uint64_t expir = 0; ++ int len; ++ int new_watchdog_count; ++ len = read(watchdog_timerfd, &expir, sizeof(uint64_t)); ++ if(len > 0 && expir > 0) { ++ if (la && !log_stop_daemon) { ++ new_watchdog_count = la->watchdog_count; ++ if (new_watchdog_count == last_watchdog_count) { ++ watchdog_noupdate_count++; ++ if (watchdog_noupdate_count >= default_watchdog_timeout) { ++ watchdog_noupdate_count = 0; ++ syslog(LOG_ERR, "log daemon is not alive, try to restart."); ++ log_restart_daemon(); ++ } ++ } else { ++ watchdog_noupdate_count = 0; ++ last_watchdog_count = new_watchdog_count; ++ } ++ } ++ } ++} ++ + int log_init(char *program_name, int size, + void (*func)(int prio, void *priv, const char *fmt, va_list ap), + void *priv) +@@ -436,6 +540,8 @@ int log_init(char *program_name, int size, + return -1; + } + ++ log_watchdog_setup(); ++ + pid = fork(); + if (pid < 0) { + syslog(LOG_ERR, "starting logger failed"); +@@ -456,6 +562,8 @@ int log_init(char *program_name, int size, + sigaction(SIGTERM, &sa_new, &sa_old ); + + while(1) { ++ if (la) ++ la->watchdog_count++; + log_flush(); + sleep(1); + +@@ -480,7 +588,15 @@ void log_close(pid_t pid) + } + + if (pid > 0) { +- kill(pid, SIGTERM); +- waitpid(pid, &status, 0); ++ char comm[1024]; ++ int r; ++ r = log_read_comm_frpm_pid(pid, comm, sizeof(comm)); ++ if (!r && strstr(comm, "iscsid")) { ++ syslog(LOG_WARNING, "Send SIGTERM to iSCSI logger, pid=%i.", pid); ++ kill(pid, SIGTERM); ++ waitpid(pid, &status, 0); ++ } else { ++ syslog(LOG_WARNING, "iSCSI logger with pid=%i already exited.", pid); ++ } + } + } +diff --git a/usr/log.h b/usr/log.h +index 486a08e..d4f8b80 100644 +--- a/usr/log.h ++++ b/usr/log.h +@@ -28,6 +28,7 @@ + + #include + #include ++#include + #include "iscsid.h" + + union semun { +@@ -42,6 +43,7 @@ union semun { + #define MAX_MSG_SIZE 256 + + extern int log_level; ++extern pid_t log_pid; + + struct logmsg { + short int prio; +@@ -62,10 +64,14 @@ struct logarea { + struct sembuf ops[1]; + int semid; + union semun semarg; ++ uint64_t watchdog_count; + }; + + struct logarea *la; + ++extern int log_get_timerfd(void); ++extern void log_close_watchdog_timer(void); ++extern void log_watchdog_handle(void); + extern int log_init(char *program_name, int size, + void (*func)(int prio, void *priv, const char *fmt, va_list ap), + void *priv); +-- +1.8.3.1 + diff --git a/9007-check-initiator-name-out-of-range.patch b/9007-check-initiator-name-out-of-range.patch new file mode 100644 index 0000000..917399a --- /dev/null +++ b/9007-check-initiator-name-out-of-range.patch @@ -0,0 +1,36 @@ +From 9d9ca10db994082a58eaf98de3e1e0a4eb7c930c Mon Sep 17 00:00:00 2001 +From: pengyeqing +Date: Sun, 27 Jan 2019 00:01:32 +0800 +Subject: [PATCH] iscsi-initiator-utils: check initiator name out of range + +reason:check initiator name out of range + +Signed-off-by: pengyeqing +--- + usr/mgmt_ipc.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/usr/mgmt_ipc.c b/usr/mgmt_ipc.c +index 1ffcda9..ce4defb 100644 +--- a/usr/mgmt_ipc.c ++++ b/usr/mgmt_ipc.c +@@ -168,8 +168,15 @@ mgmt_ipc_session_sync(queue_task_t *qtask) + static int + mgmt_ipc_cfg_initiatorname(queue_task_t *qtask) + { +- if (dconfig->initiator_name) ++ if (dconfig->initiator_name) { ++ if (VALUE_MAXLEN <= strlen(dconfig->initiator_name)){ ++ log_error("iscsid: len[%d] of initiator name out of range, max len %d.", strlen(dconfig->initiator_name), VALUE_MAXLEN-1); ++ return ISCSI_ERR_INVAL; ++ } ++ + strcpy(qtask->rsp.u.config.var, dconfig->initiator_name); ++ } ++ + mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS); + return ISCSI_SUCCESS; + } +-- +1.8.3.1 + diff --git a/9008-do-not-sync-session-when-a-session-is-already-created.patch b/9008-do-not-sync-session-when-a-session-is-already-created.patch new file mode 100644 index 0000000..65c5d2d --- /dev/null +++ b/9008-do-not-sync-session-when-a-session-is-already-created.patch @@ -0,0 +1,46 @@ +From 93d217ce22e7668abfc5e6dbc015b37b20174b09 Mon Sep 17 00:00:00 2001 +From: huangkaibin +Date: Fri, 19 Jan 2018 03:00:17 +0800 +Subject: [PATCH] iscsid: Do not sync session when a session is already created + for a remote device + +Do not sync session when a session is already created for a remote device +1. In the following scenarios, two or more sessions will be created and open for one remote device +a) two or more sync sessions are requested from the sync process for the same remote device. +this may occur when iscsid is restarted, one is requested by the previous started sync process but not handled, and another +is requested by the newly started sync process. +b) one is created in sync session, the other is created in __session_login_task. +2. If two or more sessions are created for one remote device, and there are connection problems on the remote device, +these sessions will be reopen again, and will cause one to close the connection while the other to set param for the remote device +in kernel, and will cause kernel to panic. +3. this patch fix this problem by not sync session when a session is already created for a remote device +--- + usr/initiator.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/usr/initiator.c b/usr/initiator.c +index 60bd2b7..4a48bf5 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -2097,11 +2097,18 @@ iscsi_sync_session(node_rec_t *rec, queue_task_t *qtask, uint32_t sid) + iscsi_session_t *session; + struct iscsi_transport *t; + int err; ++ int nr_found; + + t = iscsi_sysfs_get_transport_by_name(rec->iface.transport_name); + if (!t) + return ISCSI_ERR_TRANS_NOT_FOUND; + ++ nr_found = session_find_by_rec(rec); ++ if(nr_found > 0) { ++ log_error("session is already created. sid: %d, name: %s.\n", sid, rec->name); ++ return ISCSI_ERR_SESS_EXISTS; ++ } ++ + session = __session_create(rec, t, &err); + if (!session) + return ISCSI_ERR_LOGIN; +-- +1.8.3.1 + diff --git a/9009-fix-default-file-corrupt.patch b/9009-fix-default-file-corrupt.patch new file mode 100644 index 0000000..6256f1e --- /dev/null +++ b/9009-fix-default-file-corrupt.patch @@ -0,0 +1,60 @@ +From 9c5a21d14a2dff91b56574842218cc11e7457dfa Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Wed, 8 Jan 2020 04:13:29 -0500 +Subject: [PATCH] iscsi-initiator-utils: fix default file corrupt + +--- + usr/idbm.c | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +diff --git a/usr/idbm.c b/usr/idbm.c +index 830189f..7ed0ce9 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -2006,6 +2006,7 @@ static int idbm_rec_write(node_rec_t *rec) + struct stat statb; + FILE *f; + char *portal; ++ char *portalDef = NULL; + int rc = 0; + + portal = malloc(PATH_MAX); +@@ -2092,7 +2093,7 @@ mkdir_portal: + } + } + +- snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR, ++ snprintf(portal, PATH_MAX, "%s/%s/%s,%d,%d/%s_bak", NODE_CONFIG_DIR, + rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt, + rec->iface.name); + open_conf: +@@ -2105,6 +2106,27 @@ open_conf: + + idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); + fclose(f); ++ ++ /* add for default_bak -> default */ ++ portalDef = malloc(PATH_MAX); ++ if (!portalDef) { ++ log_error("Could not alloc default\n"); ++ rc = ISCSI_ERR_IDBM; ++ goto free_portal; ++ } ++ ++ snprintf(portalDef, PATH_MAX, "%s/%s/%s,%d,%d/%s", NODE_CONFIG_DIR, ++ rec->name, rec->conn[0].address, rec->conn[0].port, rec->tpgt, ++ rec->iface.name); ++ /* Renaming default_bak->default. */ ++ if (rename(portal, portalDef) < 0) { ++ log_error("Cannot rename %s -> %s\n", portal, portalDef); ++ rc = ISCSI_ERR_IDBM; ++ goto free_portalDef; ++ } ++ ++free_portalDef: ++ free(portalDef); + unlock: + idbm_unlock(); + free_portal: +-- +1.8.3.1 diff --git a/9010-iscsiadm-fix-infinite-loop-while-recv-returns-0.patch b/9010-iscsiadm-fix-infinite-loop-while-recv-returns-0.patch new file mode 100644 index 0000000..7f20b91 --- /dev/null +++ b/9010-iscsiadm-fix-infinite-loop-while-recv-returns-0.patch @@ -0,0 +1,30 @@ +From d91000561f82b5fd73fa22d23232ed99d647b962 Mon Sep 17 00:00:00 2001 +From: Wanlong Gao +Date: Thu, 22 Mar 2018 13:16:47 +0000 +Subject: [PATCH] iscsiadm: fix infinite loop while recv() returns 0 + +[Changelog]: fix infinite loop while recv() returns 0 +[Author]: Jiao Jianbing + +Signed-off-by: Jiao Jianbing +Signed-off-by: Wanlong Gao +--- + usr/iscsid_req.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index f0b474f..808d5fe 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -173,7 +173,7 @@ int iscsid_response(int fd, iscsiadm_cmd_e cmd, iscsiadm_rsp_t *rsp, + return ISCSI_ERR_ISCSID_COMM_ERR; + } else if (pfd.revents & POLLIN) { + err = recv(fd, rsp, sizeof(*rsp), MSG_WAITALL); +- if (err < 0) { ++ if (err <= 0) { + log_error("read error (%d/%d), daemon died?", + err, errno); + break; +-- +1.8.3.1 + diff --git a/9011-fix-iscsiadm-logout-timeout.patch b/9011-fix-iscsiadm-logout-timeout.patch new file mode 100644 index 0000000..949f51c --- /dev/null +++ b/9011-fix-iscsiadm-logout-timeout.patch @@ -0,0 +1,48 @@ +From 521637e6e1274fbecd8c588681b24f628e2eec97 Mon Sep 17 00:00:00 2001 +From: pengyeqing +Date: Sun, 27 Jan 2019 00:16:18 +0800 +Subject: [PATCH] iscsi-initiator-utils: fix iscsiadm logout timeout + +reason:fix iscsiadm logout timeout + +Signed-off-by: pengyeqing +--- + usr/iscsid_req.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/usr/iscsid_req.c b/usr/iscsid_req.c +index 78000f4..18bb9db 100644 +--- a/usr/iscsid_req.c ++++ b/usr/iscsid_req.c +@@ -64,6 +64,7 @@ static void iscsid_startup(void) + } + + #define MAXSLEEP 128 ++#define ISCSID_IPC_WAIT_RESPOND 300 + + static int ipc_connect(int *fd, char *unix_sock_name, int start_iscsid) + { +@@ -147,7 +148,7 @@ int iscsid_response(int fd, iscsiadm_cmd_e cmd, iscsiadm_rsp_t *rsp, + + if (timeout == -1) { + timeout = ISCSID_REQ_TIMEOUT; +- poll_wait = 1; ++ poll_wait = ISCSID_IPC_WAIT_RESPOND; + } + while (len) { + struct pollfd pfd; +@@ -159,8 +160,10 @@ int iscsid_response(int fd, iscsiadm_cmd_e cmd, iscsiadm_rsp_t *rsp, + pfd.events = POLLIN; + err = poll(&pfd, 1, timeout); + if (!err) { +- if (poll_wait) ++ if (poll_wait--) + continue; ++ log_warning("wait %d seconds timeout, try again?", ++ ISCSID_IPC_WAIT_RESPOND); + return ISCSI_ERR_ISCSID_NOTCONN; + } else if (err < 0) { + if (errno == EINTR) +-- +1.8.3.1 + diff --git a/9012-default-file-zero-after-power-outage.patch b/9012-default-file-zero-after-power-outage.patch new file mode 100644 index 0000000..a5f7f46 --- /dev/null +++ b/9012-default-file-zero-after-power-outage.patch @@ -0,0 +1,49 @@ +From afc39d6f627f1e870883e8a6851f7a20f9700801 Mon Sep 17 00:00:00 2001 +From: sangxu +Date: Wed, 30 May 2018 15:54:53 +0800 +Subject: [PATCH]fix default file zero after power outage, fsync file immediately and use correct parameters info when removing old file. + +--- + usr/idbm.c | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +diff --git a/usr/idbm.c b/usr/idbm.c +index 5437f45..c01c4fe 100644 +--- a/usr/idbm.c ++++ b/usr/idbm.c +@@ -2074,6 +2074,23 @@ mkdir_portal: + } + + idbm_print(IDBM_PRINT_TYPE_NODE, rec, 1, f); ++ ++ rc = fflush(f); ++ if (rc){ ++ log_error("Could not fflush %s: %s\n", portal, strerror(errno)); ++ rc = ISCSI_ERR_IDBM; ++ fclose(f); ++ goto free_portal; ++ ++ } ++ ++ if (fsync(fileno(f)) < 0){ ++ log_error("Could not fsync %s: %s\n", portal, strerror(errno)); ++ rc = ISCSI_ERR_IDBM; ++ fclose(f); ++ goto free_portal; ++ } ++ + fclose(f); + + /* add for default_bak -> default */ +@@ -2392,7 +2409,7 @@ int idbm_add_node(node_rec_t *newrec, discovery_rec_t *drec, int overwrite) + if (!overwrite) + return 0; + +- rc = idbm_delete_node(&rec); ++ rc = idbm_delete_node(newrec); + if (rc) + return rc; + log_debug(7, "overwriting existing record"); +-- +1.8.3.1 + diff --git a/9013-modify-utils-iscsi-iname.patch b/9013-modify-utils-iscsi-iname.patch new file mode 100644 index 0000000..15baca8 --- /dev/null +++ b/9013-modify-utils-iscsi-iname.patch @@ -0,0 +1,27 @@ +From e1d19f028533f5cc20d61121b425891009eddd48 Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Fri, 23 Aug 2019 19:12:13 +0800 +Subject: [PATCH] modify iscsi initiatorname + +--- + utils/iscsi-iname.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/utils/iscsi-iname.c b/utils/iscsi-iname.c +index 6347edc..ebcf96c 100644 +--- a/utils/iscsi-iname.c ++++ b/utils/iscsi-iname.c +@@ -132,8 +132,8 @@ main(int argc, char *argv[]) + } + + /* print the prefix followed by 6 bytes of the MD5 hash */ +- sprintf(iname, "%s:%x%x%x%x%x%x", prefix, +- bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]); ++ sprintf(iname, "%s:node", prefix); ++ + + iname[sizeof (iname) - 1] = '\0'; + printf("%s\n", iname); +-- +1.8.3.1 + diff --git a/9014-iscsi-iname-p-name-occur-buffer-overflow.patch b/9014-iscsi-iname-p-name-occur-buffer-overflow.patch new file mode 100644 index 0000000..cca2608 --- /dev/null +++ b/9014-iscsi-iname-p-name-occur-buffer-overflow.patch @@ -0,0 +1,62 @@ +From bbcbb04329e75fc91e2d9dc015fbb0efc7dd2ddd Mon Sep 17 00:00:00 2001 +From: openEuler Buildteam +Date: Sat, 9 Nov 2019 02:41:28 -0500 +Subject: [PATCH] iscsi-iname -p xxxx resulting in buffer overflow + +if the name is longer than 256 characters, when exec iscsi-iname -p name. +occur buffer overflow + +such as follow: +iscsi-iname -p aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +*** buffer overflow detected ***: iscsi-iname terminated +Aborted (core dumped) + +--- + utils/iscsi-iname.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff -Nur a/utils/iscsi-iname.c b/utils/iscsi-iname.c +--- a/utils/iscsi-iname.c 2019-12-23 08:00:50.000000000 +0000 ++++ b/utils/iscsi-iname.c 2019-12-23 08:05:09.000000000 +0000 +@@ -50,6 +50,9 @@ + int e; + int fd; + char *prefix; ++ char *prefix_node = ":node"; ++ char *buffer = NULL; ++ int reserved_len; + + /* initialize */ + memset(iname, 0, sizeof (iname)); +@@ -76,6 +79,13 @@ + prefix = "iqn.2012-01.com.openeuler"; + } + ++ if (strlen(prefix) >= (sizeof(iname) - strlen(prefix_node))) { ++ printf("\nInput a unique iSCSI node name error. " ++ "The maximum length is less than %lu\n", ++ sizeof(iname) - strlen(prefix_node)); ++ exit(0); ++ } ++ + /* try to feed some entropy from the pool to MD5 in order to get + * uniqueness properties + */ +@@ -132,8 +142,10 @@ + } + + /* print the prefix followed by 6 bytes of the MD5 hash */ +- sprintf(iname, "%s:node", prefix); +- ++ buffer = iname; ++ reserved_len = strlen(prefix_node); ++ snprintf(buffer, sizeof(iname) - reserved_len, "%s", prefix); ++ strncat(buffer, prefix_node, reserved_len); + + iname[sizeof (iname) - 1] = '\0'; + printf("%s\n", iname); diff --git a/open-iscsi-f3c8e90.tar.gz b/open-iscsi-f3c8e90.tar.gz new file mode 100644 index 0000000..d7785c5 Binary files /dev/null and b/open-iscsi-f3c8e90.tar.gz differ diff --git a/open-iscsi.spec b/open-iscsi.spec new file mode 100644 index 0000000..06dc60c --- /dev/null +++ b/open-iscsi.spec @@ -0,0 +1,220 @@ +%global _hardened_build 1 +%global service_enable() /bin/systemctl enable %1.service >/dev/null 2>&1 || : +%global socket_enable() /bin/systemctl enable %1.socket >/dev/null 2>&1 || : + +Name: open-iscsi +Version: 2.0.876 +Release: 13 +Summary: ISCSI software initiator daemon and utility programs +License: GPLv2+ and BSD +URL: http://www.open-iscsi.org +Source0: https://github.com/open-iscsi/open-iscsi/archive/f3c8e90fc0894c088950a15ee6618b427f9e2457.tar.gz#/open-iscsi-f3c8e90.tar.gz + +Patch6000: 6000-Plugging-a-memory-leak-from-discovery.patch +Patch6001: 6001-Fix-bug-in-error-message-when-reading-sysfs-numbers.patch +Patch6002: 6002-Do-not-allow-multiple-sessions-when-nr_sessions-1.patch +Patch6003: 6003-Fix-possible-discovery-hang-when-timing-out.patch +Patch6004: 6004-Resource-leak-returning-without-freeing-netdev.patch +Patch6005: 6005-Out-of-bounds-write-Overrunning-array-link_target.patch +Patch6006: 6006-Resource-leak-Variable-rec-going-out-of-scope-leaks.patch +Patch6007: 6007-Out-of-bounds-write-Overrunning-array-link_target.patch +Patch6008: 6008-Buffer-not-null-terminated-Calling-strncpy.patch +Patch6009: 6009-Resource-leak-Variable-startup_cmd-going-out-of-scop.patch +Patch6010: 6010-Buffer-not-null-terminated-Calling-strncpy.patch +Patch6011: 6011-Uninitialized-scalar-variable.patch +Patch6012: 6012-Resource-leak-Handle-variable-sockfd-going-out-of-scope.patch +Patch6013: 6013-Resource-leak-Variable-chap_info-going-out-of-scope.patch +Patch6014: 6014-Resource-leak-Variable-matched_ses-going-out-of-scope.patch +Patch6015: 6015-Resource-leak-Handle-variable-fd-going-out-of-scope.patch +Patch6016: 6016-Resource-leak-Handle-variable-fd-going-out-of-scope.patch +Patch6017: 6017-Out-of-bounds-read.patch +Patch6018: 6018-fwparam_pcc-mulitple-resource-leaks.patch +Patch6019: 6019-Resource-leak-Handl-variable-fd.patch +Patch6020: 6020-Resource-leak-Variable-raw.patch +Patch6021: 6021-Allow-reading-sysfs-port-to-fail-gracefully.patch +Patch6022: 6022-Fix-incorrect-sysfs-logic-for-port-and-ip-address.patch +Patch6023: 6023-Handle-ENOTCONN-error-separately-when-reading-sysfs.patch +Patch6024: 6024-update-service-files.patch + +Patch9000: 9000-change-iscsi-iqn-default-value.patch +Patch9001: 9001-iscsid-Check-nr_sessions-when-creating-a-copy-of-exi.patch +Patch9002: 9002-add-sleep-for-service.patch +Patch9003: 9003-not-send-stop-message-if-iscsid-absent.patch +Patch9004: 9004-iscsid-SIGTERM-syncprocess-hang.patch +Patch9005: 9005-fix-timeout-setting-on-session-commands.patch +Patch9006: 9006-restart-log-daemon-when-exited-abnormally.patch +Patch9007: 9007-check-initiator-name-out-of-range.patch +Patch9008: 9008-do-not-sync-session-when-a-session-is-already-created.patch +Patch9009: 9009-fix-default-file-corrupt.patch +Patch9010: 9010-iscsiadm-fix-infinite-loop-while-recv-returns-0.patch +Patch9011: 9011-fix-iscsiadm-logout-timeout.patch +Patch9012: 9012-default-file-zero-after-power-outage.patch +Patch9013: 9013-modify-utils-iscsi-iname.patch +Patch9014: 9014-iscsi-iname-p-name-occur-buffer-overflow.patch + +BuildRequires: flex bison doxygen kmod-devel systemd-units gcc git isns-utils-devel +BuildRequires: autoconf automake libtool libmount-devel openssl-devel pkg-config + +Provides: iscsi-initiator-utils +Obsoletes: iscsi-initiator-utils +Provides: iscsi-initiator-utils-iscsiuio +Obsoletes: iscsi-initiator-utils-iscsiuio +Provides: libbopeniscsiusr +Obsoletes: libbopeniscsiusr +Obsoletes: %{name}-devel < %{version}-%{release} +%{?systemd_requires} + +%description +The Open-iSCSI project is a high-performance, transport independent, +multi-platform implementation of RFC3720 iSCSI. + +Open-iSCSI is partitioned into user and kernel parts. + +The kernel portion of Open-iSCSI is a from-scratch code +licensed under GPL. The kernel part implements iSCSI data path +(that is, iSCSI Read and iSCSI Write), and consists of three +loadable modules: scsi_transport_iscsi.ko, libiscsi.ko and iscsi_tcp.ko. + +User space contains the entire control plane: configuration +manager, iSCSI Discovery, Login and Logout processing, +connection-level error processing, Nop-In and Nop-Out handling, +and (in the future:) Text processing, iSNS, SLP, Radius, etc. + +The user space Open-iSCSI consists of a daemon process called +iscsid, and a management utility iscsiadm. + +%package devel +Summary: Development files for %{name} +Provides: libopeniscsiusr-devel +Obsoletes: libopeniscsiusr-devel +Requires: %{name} = %{version}-%{release} + +%description devel +This package contains libraries and include files for %{name}. + +%package help +Summary: Including man files for %{name}. +Requires: man + +%description help +This contains man files for the using of %{name}. + +%prep +%autosetup -n open-iscsi-f3c8e90fc0894c088950a15ee6618b427f9e2457 -p1 +perl -i -pe 's|^exec_prefix = /$|exec_prefix = %{_exec_prefix}|' Makefile + +%build +cd iscsiuio +touch AUTHORS NEWS +autoreconf --install +%{configure} +cd .. + +%make_build OPTFLAGS="%{optflags} %{?__global_ldflags} -DUSE_KMOD -lkmod" LIB_DIR=%{_libdir} + + +%install +make DESTDIR=%{?buildroot} LIB_DIR=%{_libdir} \ + install_programs \ + install_doc \ + install_etc \ + install_iname \ + install_iface \ + install_libopeniscsiusr + +install -pm 755 usr/iscsistart $RPM_BUILD_ROOT%{_sbindir} +install -d $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +install -pm 644 iscsiuio/iscsiuiolog $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +install -d $RPM_BUILD_ROOT%{_sharedstatedir}/{iscsi,iscsi/nodes,iscsi/send_targets,iscsi/static,iscsi/isns,iscsi/slp,iscsi/ifaces} +install -d $RPM_BUILD_ROOT/var/lock/iscsi +touch $RPM_BUILD_ROOT/var/lock/iscsi/lock + +install -d $RPM_BUILD_ROOT%{_unitdir} +install -d $RPM_BUILD_ROOT%{_libexecdir} +install -d $RPM_BUILD_ROOT%{_libdir} +install -d $RPM_BUILD_ROOT%{_includedir} +install -d $RPM_BUILD_ROOT%{_tmpfilesdir} +install -pm 644 etc/systemd/*.service $RPM_BUILD_ROOT%{_unitdir} +install -pm 644 etc/systemd/*.socket $RPM_BUILD_ROOT%{_unitdir} + + +%post +/sbin/ldconfig +%systemd_post iscsi.service iscsi-shutdown.service iscsid.service iscsiuio.service iscsid.socket iscsiuio.socket + +if [ $1 -eq 1 ]; then + if [ ! -f %{_sysconfdir}/iscsi/initiatorname.iscsi ]; then + echo "InitiatorName=`%{_sbindir}/iscsi-iname`" > %{_sysconfdir}/iscsi/initiatorname.iscsi + fi + %service_enable iscsi + %socket_enable iscsid +fi + +%preun +%systemd_preun iscsi.service +%systemd_preun iscsi-shutdown.service >/dev/null 2>&1 +%systemd_preun iscsid.service iscsiuio.service iscsid.socket iscsiuio.socket + +%postun +/sbin/ldconfig +%systemd_postun iscsi.service iscsi-shutdown.service iscsid.service iscsiuio.service iscsid.socket iscsiuio.socket + +%files +%doc README COPYING +%dir %{_sharedstatedir}/iscsi +%dir %{_sharedstatedir}/iscsi/* +%ghost %{_var}/lock/iscsi + %{_unitdir}/* + %{_sbindir}/* + %{_libdir}/libopeniscsiusr.so.* + +%dir %{_sysconfdir}/iscsi +%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/iscsi/iscsid.conf + %config(noreplace) %{_sysconfdir}/logrotate.d/iscsiuiolog + %config %{_sysconfdir}/iscsi/ifaces/iface.example +%ghost %{_sysconfdir}/iscsi/initiatorname.iscsi + +%files devel + %{_includedir}/*.h + %{_libdir}/libopeniscsiusr.so + %{_libdir}/pkgconfig/libopeniscsiusr.pc + +%files help +%{_mandir}/man8/* + +%changelog +* Wed Jan 9 2020 openEuler Buildteam - 2.0.876-13 +- Type:enhancement +- ID:NA +- SUG:restart +- DESC:update package + +* Tue Dec 31 2019 openEuler Buildteam - 2.0.876-12 +- Type:enhancement +- ID:NA +- SUG:restart +- DESC:use openEuler version to match RPM package version + +* Mon Dec 30 2019 openEuler Buildteam - 2.0.876-11 +- Type:enhancement +- ID:NA +- SUG:restart +- DESC:change iscsi iqn default value + +* Sun Dec 29 2019 openEuler Buildteam - 2.0.876-10 +- Type:enhancement +- ID:NA +- SUG:restart +- DESC:do not display the fail info while uninstalling + +* Mon Dec 23 2019 openEuler Buildteam - 2.0.876-9 +- Type:bugfix +- ID:NA +- SUG:restart +- DESC:backport patches for fix bug + +* Tue Oct 29 2019 openEuler Buildteam - 2.0.876-8 +- Add %systemd_postun parameter. + +* Fri Sep 20 2019 openEuler Buildteam - 2.0.876-7 +- Package init