Merged update from upstream sources

This is an automated DistroBaker update from upstream sources.
If you do not know what this is about or would like to opt out,
contact the OSCI team.

Source: https://src.fedoraproject.org/rpms/fcoe-utils.git#957367e7d7102e9f7257ff1535854faddc86ba89
This commit is contained in:
DistroBaker 2021-02-05 18:59:08 +00:00
parent 9a6dfac8ec
commit 0e58890731
9 changed files with 25 additions and 734 deletions

View File

@ -1,444 +0,0 @@
From 329d7721a40e94547186bf680ba5ae033dda3006 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Fri, 18 Sep 2020 10:20:57 -0700
Subject: [PATCH 1/1] 21 string-op truncation, format truncation, and format
overflow errors
This isn't a full audit of the source, just addressing anything gcc 10.2 flagged.
There's two basic mitigations added, depending on the likelyhood and severity
of truncation to correct functioning.
1) When a truncation is unlikely (copy between two IFNAMSIZ buffers) or
non-critical (output formating) I forced a null-terminiation at the buffer end
after a strncpy to satisfy the compiler.
2) Where truncation needs proper detection and handling, I used snprintf and
corrected the error checking.
Signed-off-by: Chris Leech <cleech@redhat.com>
---
fcoeadm.c | 8 +++---
fcoeadm_display.c | 62 ++++++++++++++++++++++++++++++++++-------------
fcoemon.c | 44 ++++++++++++++++++++++++++-------
fipvlan.c | 5 +++-
lib/fcoe_utils.c | 17 ++++++-------
lib/sysfs_hba.c | 6 +++++
libopenfcoe.c | 4 ++-
7 files changed, 106 insertions(+), 40 deletions(-)
diff --git a/fcoeadm.c b/fcoeadm.c
index 776b4e32b2e..8b9112d63c3 100644
--- a/fcoeadm.c
+++ b/fcoeadm.c
@@ -185,9 +185,10 @@ fcoeadm_action(enum clif_action cmd, char *ifname, enum clif_flags flags)
struct clif_sock_info clif_info;
int rc;
- if (ifname)
- strncpy(data.ifname, ifname, sizeof(data.ifname));
- else
+ if (ifname) {
+ strncpy(data.ifname, ifname, IFNAMSIZ);
+ data.ifname[IFNAMSIZ - 1] = '\0';
+ } else
data.ifname[0] = '\0';
data.cmd = cmd;
data.flags = flags;
@@ -232,6 +233,7 @@ int main(int argc, char *argv[])
* expects progname to be valid.
*/
strncpy(progname, basename(argv[0]), sizeof(progname));
+ progname[sizeof(progname) - 1] = '\0';
/* check if we have sysfs */
if (fcoe_checkdir(SYSFS_MOUNT)) {
diff --git a/fcoeadm_display.c b/fcoeadm_display.c
index 7d29422e91f..4b1d358d1c8 100644
--- a/fcoeadm_display.c
+++ b/fcoeadm_display.c
@@ -188,6 +188,7 @@ static void sa_dir_crawl(char *dir_name,
struct dirent *dp;
void (*f)(char *dirname, enum disp_style style);
char path[1024];
+ int rc;
f = func;
@@ -199,8 +200,9 @@ static void sa_dir_crawl(char *dir_name,
if (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' ||
(dp->d_name[1] == '.' && dp->d_name[2] == '\0')))
continue;
- snprintf(path, sizeof(path), "%s/%s", dir_name, dp->d_name);
-
+ rc = snprintf(path, sizeof(path), "%s/%s", dir_name, dp->d_name);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ continue;
f(path, style);
}
closedir(dir);
@@ -254,10 +256,13 @@ static void show_full_lun_info(unsigned int hba, unsigned int port,
struct dirent *dp;
struct port_attributes *rport_attrs;
struct port_attributes *port_attrs;
+ int rc;
- snprintf(path, sizeof(path),
- "/sys/class/scsi_device/%u:%u:%u:%u",
- hba, port, tgt, lun);
+ rc = snprintf(path, sizeof(path),
+ "/sys/class/scsi_device/%u:%u:%u:%u",
+ hba, port, tgt, lun);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ return;
rport_attrs = get_rport_attribs_by_device(path);
if (!rport_attrs)
@@ -287,10 +292,14 @@ static void show_full_lun_info(unsigned int hba, unsigned int port,
osname = dp->d_name;
- snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ if (rc < 0 || (size_t) rc >= sizeof(npath))
+ continue;
sa_sys_read_u64(npath, "size", &lba);
- snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ if (rc < 0 || (size_t) rc >= sizeof(npath))
+ continue;
sa_sys_read_u32(npath, "hw_sector_size", &blksize);
}
@@ -340,10 +349,13 @@ static void show_short_lun_info(unsigned int hba, unsigned int port,
char *capstr = "Unknown";
char *osname = "Unknown";
uint64_t size;
+ int rc;
- snprintf(path, sizeof(path),
- "/sys/class/scsi_device/%u:%u:%u:%u/device/",
- hba, port, tgt, lun);
+ rc = snprintf(path, sizeof(path),
+ "/sys/class/scsi_device/%u:%u:%u:%u/device/",
+ hba, port, tgt, lun);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ return;
sa_sys_read_line(path, "rev", rev, sizeof(rev));
sa_sys_read_line(path, "model", model, sizeof(model));
@@ -363,10 +375,14 @@ static void show_short_lun_info(unsigned int hba, unsigned int port,
osname = dp->d_name;
- snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ if (rc < 0 || (size_t) rc >= sizeof(npath))
+ continue;
sa_sys_read_u64(npath, "size", &size);
- snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ if (rc < 0 || (size_t) rc >= sizeof(npath))
+ continue;
sa_sys_read_u32(npath, "hw_sector_size", &blksize);
}
@@ -419,8 +435,11 @@ static void list_luns_by_rport(char *rport, enum disp_style style)
char *substr;
int len;
int ret;
+ int rc;
- snprintf(path, sizeof(path), "/sys/class/fc_remote_ports/%s", rport);
+ rc = snprintf(path, sizeof(path), "/sys/class/fc_remote_ports/%s", rport);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ return;
ret = readlink(path, link, sizeof(link));
if (ret == -1)
@@ -430,7 +449,9 @@ static void list_luns_by_rport(char *rport, enum disp_style style)
link[ret] = '\0';
substr = strstr(link, "net");
- snprintf(path, sizeof(path), "/sys/class/%s", substr);
+ rc = snprintf(path, sizeof(path), "/sys/class/%s", substr);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ return;
substr = strstr(path, "fc_remote_ports");
@@ -560,11 +581,16 @@ static int get_host_from_vport(struct dirent *dp,
static int crawl_vports(struct dirent *dp, void *arg)
{
char *oldpath = arg;
+ int rc;
if (!strncmp(dp->d_name, "vport", strlen("vport"))) {
char path[1024];
- snprintf(path, sizeof(path), "%s/%s", oldpath, dp->d_name);
+ rc = snprintf(path, sizeof(path), "%s/%s", oldpath, dp->d_name);
+ if (rc < 0 || (size_t) rc >= sizeof(path)) {
+ // ignore error and continue
+ return 0;
+ }
sa_dir_read(path, get_host_from_vport, NULL);
}
return 0;
@@ -573,10 +599,12 @@ static int crawl_vports(struct dirent *dp, void *arg)
static void show_host_vports(const char *host)
{
char path[1024];
+ int rc;
- snprintf(path, sizeof(path), "%s/%s/device/", SYSFS_HOST_DIR, host);
+ rc = snprintf(path, sizeof(path), "%s/%s/device/", SYSFS_HOST_DIR, host);
+ if (rc < 0 || (size_t) rc >= sizeof(path))
+ return;
sa_dir_read(path, crawl_vports, path);
-
}
static enum fcoe_status display_one_adapter_info(char *ifname)
diff --git a/fcoemon.c b/fcoemon.c
index 60dbc1e444d..8c08bc5a032 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -518,6 +518,7 @@ static int fcm_read_config_files(void)
}
strncpy(file, CONFIG_DIR "/", sizeof(file));
strncat(file, dp->d_name, sizeof(file) - strlen(file));
+ file[sizeof(file) - 1] = '\0';
fp = fopen(file, "r");
if (!fp) {
FCM_LOG_ERR(errno, "Failed to read %s\n", file);
@@ -939,6 +940,7 @@ static struct fcoe_port *fcm_new_vlan(int ifindex, int vid, bool vn2vn)
[false] = CLIF_FLAGS_FABRIC,
[true] = CLIF_FLAGS_VN2VN,
};
+ int rc;
if (vn2vn)
FCM_LOG_DBG("Auto VLAN found vn2vn on VID %d\n", vid);
@@ -947,8 +949,15 @@ static struct fcoe_port *fcm_new_vlan(int ifindex, int vid, bool vn2vn)
if (rtnl_find_vlan(ifindex, vid, vlan_name)) {
rtnl_get_linkname(ifindex, real_name);
- snprintf(vlan_name, sizeof(vlan_name), FCOE_VLAN_FORMAT,
- real_name, vid);
+ rc = snprintf(vlan_name, sizeof(vlan_name), FCOE_VLAN_FORMAT,
+ real_name, vid);
+ if (rc < 0 || (size_t) rc >= sizeof(vlan_name)) {
+ FCM_LOG("Warning: Generating FCoE VLAN device name for"
+ "interface %s VLAN %d: format resulted in a"
+ "name larger than IFNAMSIZ\n", real_name, vid);
+ vlan_name[sizeof(vlan_name) - 1] = 0;
+ FCM_LOG("\tTruncating VLAN name to %s\n", vlan_name);
+ }
vlan_create(ifindex, vid, vlan_name);
}
rtnl_set_iff_up(0, vlan_name);
@@ -1077,6 +1086,7 @@ static void fcm_vlan_dev_real_dev(char *vlan_ifname, char *real_ifname)
{
int fd;
struct vlan_ioctl_args ifv;
+ int rc;
real_ifname[0] = '\0';
@@ -1093,9 +1103,18 @@ static void fcm_vlan_dev_real_dev(char *vlan_ifname, char *real_ifname)
FCM_LOG_ERR(ENOSPC, "no room for vlan ifname");
goto close_fd;
}
- strncpy(ifv.device1, vlan_ifname, sizeof(ifv.device1));
- if (ioctl(fd, SIOCGIFVLAN, &ifv) == 0)
- strncpy(real_ifname, ifv.u.device2, IFNAMSIZ-1);
+
+ rc = snprintf(ifv.device1, IFNAMSIZ, "%s", vlan_ifname);
+ if (rc < 0 || rc >= IFNAMSIZ)
+ goto close_fd;
+
+ if (ioctl(fd, SIOCGIFVLAN, &ifv) == 0) {
+ rc = snprintf(real_ifname, IFNAMSIZ, "%s", ifv.u.device2);
+ if (rc < 0 || rc >= IFNAMSIZ) {
+ real_ifname[0] = '\0';
+ goto close_fd;
+ }
+ }
close_fd:
close(fd);
}
@@ -1647,8 +1666,10 @@ static void fcm_process_link_msg(struct ifinfomsg *ip, int len, unsigned type)
/* try to find the real device name */
real_dev[0] = '\0';
fcm_vlan_dev_real_dev(ifname, real_dev);
- if (strlen(real_dev))
- strncpy(p->real_ifname, real_dev, IFNAMSIZ-1);
+ if (strlen(real_dev)) {
+ strncpy(p->real_ifname, real_dev, IFNAMSIZ);
+ p->real_ifname[IFNAMSIZ - 1] = '\0';
+ }
if (p->ready)
update_fcoe_port_state(p, type, operstate,
FCP_CFG_IFNAME);
@@ -1660,7 +1681,8 @@ static void fcm_process_link_msg(struct ifinfomsg *ip, int len, unsigned type)
if (p) {
p->ifindex = ifindex;
memcpy(p->mac, mac, ETHER_ADDR_LEN);
- strncpy(p->real_ifname, ifname, IFNAMSIZ-1);
+ strncpy(p->real_ifname, ifname, IFNAMSIZ);
+ p->real_ifname[IFNAMSIZ - 1] = '\0';
update_fcoe_port_state(p, type, operstate,
FCP_REAL_IFNAME);
}
@@ -1788,7 +1810,9 @@ static void fcm_process_ieee_msg(struct nlmsghdr *nlh)
if (rta_parent->rta_type != DCB_ATTR_IFNAME)
return;
- strncpy(ifname, NLA_DATA(rta_parent), sizeof(ifname));
+ strncpy(ifname, NLA_DATA(rta_parent), IFNAMSIZ);
+ ifname[IFNAMSIZ - 1] = '\0';
+
ff = fcm_netif_lookup_create(ifname);
if (!ff) {
FCM_LOG("Processing IEEE message: %s not found or created\n",
@@ -3699,6 +3723,8 @@ int main(int argc, char **argv)
memset(&fcoe_config, 0, sizeof(fcoe_config));
strncpy(progname, basename(argv[0]), sizeof(progname));
+ progname[sizeof(progname) - 1] = '\0';
+
sa_log_prefix = progname;
sa_log_flags = 0;
openlog(sa_log_prefix, LOG_CONS, LOG_DAEMON);
diff --git a/fipvlan.c b/fipvlan.c
index 2e9a8f2b047..c8a07339314 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -449,6 +449,7 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh)
iff->iflink = iff->ifindex;
memcpy(iff->mac_addr, RTA_DATA(ifla[IFLA_ADDRESS]), ETHER_ADDR_LEN);
strncpy(iff->ifname, RTA_DATA(ifla[IFLA_IFNAME]), IFNAMSIZ);
+ iff->ifname[IFNAMSIZ - 1] = '\0';
if (ifla[IFLA_LINKINFO]) {
parse_linkinfo(linkinfo, ifla[IFLA_LINKINFO]);
@@ -541,8 +542,10 @@ static void parse_cmdline(int argc, char **argv)
config.start = true;
break;
case 'f':
- if (optarg && strlen(optarg))
+ if (optarg && strlen(optarg)) {
strncpy(config.suffix, optarg, 256);
+ config.suffix[256 - 1] = '\0';
+ }
break;
case 'l':
config.link_retry = strtoul(optarg, NULL, 10);
diff --git a/lib/fcoe_utils.c b/lib/fcoe_utils.c
index 516eac5247d..4d13dd7ecf9 100644
--- a/lib/fcoe_utils.c
+++ b/lib/fcoe_utils.c
@@ -68,9 +68,10 @@ static int fcoe_check_fchost(const char *ifname, const char *dname)
enum fcoe_status fcoe_find_fchost(const char *ifname, char *fchost, int len)
{
- int n, dname_len, status;
+ int n, status;
struct dirent **namelist;
int rc = ENOFCOECONN;
+ int rrc;
status = n = scandir(SYSFS_FCHOST, &namelist, 0, alphasort);
@@ -78,19 +79,17 @@ enum fcoe_status fcoe_find_fchost(const char *ifname, char *fchost, int len)
if (rc) {
/* check symbolic name */
if (!fcoe_check_fchost(ifname, namelist[n]->d_name)) {
- dname_len = strnlen(namelist[n]->d_name, len);
-
- if (len > dname_len) {
- strncpy(fchost, namelist[n]->d_name,
- dname_len + 1);
- /* rc = 0 indicates found */
- rc = SUCCESS;
- } else {
+ rrc = snprintf(fchost, len, "%s", namelist[n]->d_name);
+ if (rrc < 0 || rrc >= len) {
+ fchost[0] = '\0';
/*
* The fc_host is too large
* for the buffer.
*/
rc = EINTERR;
+ } else {
+ /* rc = 0 indicates found */
+ rc = SUCCESS;
}
}
}
diff --git a/lib/sysfs_hba.c b/lib/sysfs_hba.c
index ce781e2e0ed..a8d557e92b5 100644
--- a/lib/sysfs_hba.c
+++ b/lib/sysfs_hba.c
@@ -215,6 +215,7 @@ static void get_pci_device_info(struct pci_device *dev, struct hba_info *info)
vname = unknown;
strncpy(info->manufacturer, vname, sizeof(info->manufacturer));
+ info->manufacturer[sizeof(info->manufacturer) - 1] = '\0';
dname = pci_device_get_device_name(dev);
if (!dname)
@@ -222,6 +223,7 @@ static void get_pci_device_info(struct pci_device *dev, struct hba_info *info)
strncpy(info->model_description, dname,
sizeof(info->model_description));
+ info->model_description[sizeof(info->model_description) - 1] = '\0';
pci_device_cfg_read_u8(dev, &revision, PCI_REVISION_ID);
snprintf(info->hardware_version, sizeof(info->hardware_version),
@@ -259,6 +261,7 @@ static void get_module_info(const char *pcidev, struct hba_info *info)
strncpy(info->driver_name,
strstr(buf, "module") + strlen("module") + 1,
sizeof(info->driver_name));
+ info->driver_name[sizeof(info->driver_name) - 1] = '\0';
}
@@ -316,6 +319,8 @@ struct port_attributes *get_rport_attribs(const char *rport)
goto free_path;
strncpy(pa->device_name, rport, sizeof(pa->device_name));
+ pa->device_name[sizeof(pa->device_name) - 1] = '\0';
+
sa_sys_read_line(path, "node_name", pa->node_name,
sizeof(pa->node_name));
sa_sys_read_line(path, "port_name", pa->port_name,
@@ -391,6 +396,7 @@ struct port_attributes *get_port_attribs(const char *host)
goto free_path;
strncpy(pa->device_name, host, sizeof(pa->device_name));
+ pa->device_name[sizeof(pa->device_name) - 1] = '\0';
sa_sys_read_line(path, "symbolic_name", pa->symbolic_name,
sizeof(pa->symbolic_name));
diff --git a/libopenfcoe.c b/libopenfcoe.c
index c3fd1b031f8..452ee803e63 100644
--- a/libopenfcoe.c
+++ b/libopenfcoe.c
@@ -207,7 +207,9 @@ static int read_fcoe_ctlr_device(struct dirent *dp, void *arg)
if (!rc)
goto fail;
- sprintf(hpath, "%s/%s/", SYSFS_FCHOST, fchost);
+ rc = snprintf(hpath, MAX_STR_LEN, "%s/%s/", SYSFS_FCHOST, fchost);
+ if (rc < 0 || rc >= MAX_STR_LEN)
+ goto fail;
rc = sa_sys_read_line(hpath, "symbolic_name", buf, sizeof(buf));
--
2.18.1

View File

@ -1,51 +0,0 @@
From 64254aee4509192831b9f9cf695abd81a9656f00 Mon Sep 17 00:00:00 2001
From: Chris Leech <cleech@redhat.com>
Date: Mon, 21 Sep 2020 09:33:23 -0700
Subject: [PATCH 2/2] use of uninitialized values detected during LTO
lto-wrapper build errors
Signed-off-by: Chris Leech <cleech@redhat.com>
---
fcoeadm_display.c | 2 +-
lib/sysfs_hba.c | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/fcoeadm_display.c b/fcoeadm_display.c
index 4b1d358d1c8..585ecfae54e 100644
--- a/fcoeadm_display.c
+++ b/fcoeadm_display.c
@@ -348,7 +348,7 @@ static void show_short_lun_info(unsigned int hba, unsigned int port,
uint32_t blksize = 0;
char *capstr = "Unknown";
char *osname = "Unknown";
- uint64_t size;
+ uint64_t size = 0;
int rc;
rc = snprintf(path, sizeof(path),
diff --git a/lib/sysfs_hba.c b/lib/sysfs_hba.c
index a8d557e92b5..381f335d7ea 100644
--- a/lib/sysfs_hba.c
+++ b/lib/sysfs_hba.c
@@ -528,7 +528,7 @@ char *get_host_by_fcid(uint32_t fcid)
DIR *dir;
char *host = NULL;
char path[1024];
- uint32_t port_id;
+ uint32_t port_id = 0;
dir = opendir(SYSFS_HOST_DIR);
if (!dir)
@@ -562,7 +562,7 @@ char *get_rport_by_fcid(uint32_t fcid)
DIR *dir;
char *rport = NULL;
char path[1024];
- uint32_t port_id;
+ uint32_t port_id = 0;
dir = opendir(SYSFS_RPORT_DIR);
if (!dir)
--
2.18.1

View File

@ -1,53 +0,0 @@
diff --git a/fipvlan.c b/fipvlan.c
index 7c00c7c..065b742 100644
--- a/fipvlan.c
+++ b/fipvlan.c
@@ -621,8 +621,10 @@ create_and_start_vlan(struct fcf *fcf, bool vn2vn)
real_dev->ifname, fcf->vlan, vlan->ifname);
rc = 0;
} else {
- snprintf(vlan_name, IFNAMSIZ, "%s.%d%s",
- real_dev->ifname, fcf->vlan, config.suffix);
+ rc = snprintf(vlan_name, IFNAMSIZ, "%s.%d%s",
+ real_dev->ifname, fcf->vlan, config.suffix);
+ if (rc >= IFNAMSIZ)
+ return -E2BIG;
rc = vlan_create(fcf->ifindex, fcf->vlan, vlan_name);
if (rc < 0)
printf("Failed to create VLAN device %s\n\t%s\n",
diff --git a/libopenfcoe.c b/libopenfcoe.c
index 07090d5..98fb975 100644
--- a/libopenfcoe.c
+++ b/libopenfcoe.c
@@ -59,6 +59,7 @@ static int add_fcoe_fcf_device(struct dirent *dp, void *arg)
{
struct fcoe_ctlr_device *ctlr = (struct fcoe_ctlr_device *)arg;
struct fcoe_fcf_device *fcf;
+ int rc;
if (!strstr(dp->d_name, "fcf") ||
(!strcmp(dp->d_name, "fcf_dev_loss_tmo")))
@@ -71,8 +72,10 @@ static int add_fcoe_fcf_device(struct dirent *dp, void *arg)
memset(fcf, 0, sizeof(struct fcoe_fcf_device));
/* Save the path */
- snprintf(fcf->path, sizeof(fcf->path),
- "%s/%s", ctlr->path, dp->d_name);
+ rc = snprintf(fcf->path, sizeof(fcf->path),
+ "%s/%s", ctlr->path, dp->d_name);
+ if (rc >= sizeof(fcf->path))
+ goto fail;
/* Use the index from the logical enumeration */
fcf->index = atoi(dp->d_name + sizeof("fcf_") - 1);
@@ -198,7 +201,9 @@ static int read_fcoe_ctlr_device(struct dirent *dp, void *arg)
sa_sys_read_line(ctlr->path, "mode", buf, sizeof(buf));
sa_enum_encode(fip_conn_type_table, buf, &ctlr->mode);
- snprintf(lesb_path, sizeof(lesb_path), "%s/lesb/", ctlr->path);
+ rc = snprintf(lesb_path, sizeof(lesb_path), "%s/lesb/", ctlr->path);
+ if (rc >= sizeof(lesb_path))
+ goto fail;
/* Get LESB statistics */
sa_sys_read_u32(lesb_path, "link_fail",

View File

@ -1,119 +0,0 @@
From: Chris Leech <cleech@redhat.com>
Subject: fix build warnings/errors with GCC format-truncation checks
diff --git a/fcoeadm_display.c b/fcoeadm_display.c
index 120c6084b7ca..f10cfb53d454 100644
--- a/fcoeadm_display.c
+++ b/fcoeadm_display.c
@@ -254,6 +254,7 @@ static void show_full_lun_info(unsigned int hba, unsigned int port,
struct dirent *dp;
struct port_attributes *rport_attrs;
struct port_attributes *port_attrs;
+ int rc;
snprintf(path, sizeof(path),
"/sys/class/scsi_device/%u:%u:%u:%u",
@@ -287,10 +288,18 @@ static void show_full_lun_info(unsigned int hba, unsigned int port,
osname = dp->d_name;
- snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ if (rc < 0 || rc >= sizeof(npath)) {
+ /* error or truncation, bailing out */
+ return;
+ }
sa_sys_read_u64(npath, "size", &lba);
- snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ if (rc < 0 || rc >= sizeof(npath)) {
+ /* error or truncation, bailing out */
+ return;
+ }
sa_sys_read_u32(npath, "hw_sector_size", &blksize);
}
@@ -340,6 +349,7 @@ static void show_short_lun_info(unsigned int hba, unsigned int port,
char *capstr = "Unknown";
char *osname = "Unknown";
uint64_t size;
+ int rc;
snprintf(path, sizeof(path),
"/sys/class/scsi_device/%u:%u:%u:%u/device/",
@@ -363,10 +373,18 @@ static void show_short_lun_info(unsigned int hba, unsigned int port,
osname = dp->d_name;
- snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/", path, osname);
+ if (rc < 0 || rc >= sizeof(npath)) {
+ /* error or truncation, bailing out */
+ return;
+ }
sa_sys_read_u64(npath, "size", &size);
- snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ rc = snprintf(npath, sizeof(npath), "%s/%s/queue/", path, osname);
+ if (rc < 0 || rc >= sizeof(npath)) {
+ /* error or truncation, bailing out */
+ return;
+ }
sa_sys_read_u32(npath, "hw_sector_size", &blksize);
}
diff --git a/fcoemon.c b/fcoemon.c
index 9a400c56b72a..bf73a0d4c89e 100644
--- a/fcoemon.c
+++ b/fcoemon.c
@@ -939,6 +939,7 @@ static struct fcoe_port *fcm_new_vlan(int ifindex, int vid, bool vn2vn)
[false] = CLIF_FLAGS_FABRIC,
[true] = CLIF_FLAGS_VN2VN,
};
+ int rc;
if (vn2vn)
FCM_LOG_DBG("Auto VLAN found vn2vn on VID %d\n", vid);
@@ -947,8 +948,15 @@ static struct fcoe_port *fcm_new_vlan(int ifindex, int vid, bool vn2vn)
if (rtnl_find_vlan(ifindex, vid, vlan_name)) {
rtnl_get_linkname(ifindex, real_name);
- snprintf(vlan_name, sizeof(vlan_name), FCOE_VLAN_FORMAT,
- real_name, vid);
+ rc = snprintf(vlan_name, sizeof(vlan_name), FCOE_VLAN_FORMAT,
+ real_name, vid);
+ if (rc >= sizeof(vlan_name)) {
+ FCM_LOG("Warning: Generating FCoE VLAN device name for"
+ "interface %s VLAN %d: format resulted in a"
+ "name larger than IFNAMSIZ\n", real_name, vid);
+ vlan_name[sizeof(vlan_name) - 1] = 0;
+ FCM_LOG("\tTruncating VLAN name to %s\n", vlan_name);
+ }
vlan_create(ifindex, vid, vlan_name);
}
rtnl_set_iff_up(0, vlan_name);
@@ -3549,7 +3557,7 @@ static void fcm_srv_receive(void *arg)
}
cmd = data->cmd;
- strncpy(ifname, data->ifname, sizeof(data->ifname));
+ strncpy(ifname, data->ifname, sizeof(ifname) - 1);
ifname[sizeof(data->ifname)] = 0;
if (cmd != CLIF_PID_CMD) {
diff --git a/libopenfcoe.c b/libopenfcoe.c
index 07090d5a09aa..c1190adc2328 100644
--- a/libopenfcoe.c
+++ b/libopenfcoe.c
@@ -179,7 +179,9 @@ static int read_fcoe_ctlr_device(struct dirent *dp, void *arg)
if (!rc)
goto fail;
- sprintf(hpath, "%s/%s/", SYSFS_FCHOST, fchost);
+ rc = snprintf(hpath, MAX_STR_LEN, "%s/%s/", SYSFS_FCHOST, fchost);
+ if (rc < 0 || rc >= MAX_STR_LEN)
+ goto fail;
rc = sa_sys_read_line(hpath, "symbolic_name", buf, sizeof(buf));

View File

@ -1,32 +1,26 @@
# https://fedoraproject.org/wiki/Packaging:Guidelines#Compiler_flags
%global _hardened_build 1
# v1.0.33-6-gfe376de5343
%global commit0 fe376de5343c58f108a14e67819626424054591b
# v1.0.33-9-g848bcc6ba8c
%global commit0 848bcc6ba8cda1f344663b4e73f1bc4857bcb4e3
%global shortcommit0 %(c=%{commit0}; echo ${c:0:7})
Name: fcoe-utils
Version: 1.0.33
Release: 3.git%{shortcommit0}%{?dist}
Release: 5.git%{shortcommit0}%{?dist}
Summary: Fibre Channel over Ethernet utilities
License: GPLv2
URL: http://www.open-fcoe.org
Source0: https://github.com/openSUSE/fcoe-utils/archive/%{commit0}.tar.gz#/%{name}-%{version}-%{shortcommit0}.tar.gz
Source1: quickstart.txt
Source2: fcoe.service
Source3: fcoe.config
ExcludeArch: ppc s390
Patch1: 0001-21-string-op-truncation-format-truncation-and-format.patch
Patch2: 0002-use-of-uninitialized-values-detected-during-LTO.patch
Patch3: %{name}-gcc11.patch
BuildRequires: autoconf
BuildRequires: automake
BuildRequires: libpciaccess-devel
BuildRequires: libtool
BuildRequires: libpciaccess-devel
BuildRequires: lldpad-devel >= 0.9.43
BuildRequires: systemd
BuildRequires: libbsd-devel
BuildRequires: make
BuildRequires: make
Requires: lldpad >= 0.9.43
Requires: iproute
Requires: device-mapper-multipath
@ -41,50 +35,56 @@ fcoemon - service to configure DCB Ethernet QOS filters, works with lldpad
%prep
%autosetup -p1 -n fcoe-utils-%{commit0}
cp -v %{SOURCE1} quickstart.txt
%if 0%{?rhel} >= 8
# RHEL dropped support for software fcoe (fcoe.ko)
sed -i 's/^\(SUPPORTED_DRIVERS\)=".*"$/\1="bnx2fc qedf"/' etc/config
# make the defaults sane for supported offload drivers
sed -i 's/^\(DCB_REQUIRED\)=".*"$/\1="no"/' etc/cfg-ethx
%endif
%build
./bootstrap.sh
%configure
%configure --with-systemdsystemunitdir=%{_unitdir}
make %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
rm -rf %{buildroot}/etc/init.d
mkdir -p %{buildroot}%{_sysconfdir}/sysconfig %{buildroot}%{_unitdir}
rm -f %{buildroot}%{_unitdir}/*
install -m 644 %{SOURCE2} %{buildroot}%{_unitdir}
install -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/sysconfig/fcoe
mkdir -p %{buildroot}%{_libexecdir}/fcoe
for file in \
contrib/*.sh \
debug/*sh
do install -m 755 ${file} %{buildroot}%{_libexecdir}/fcoe/
done
# We supply our own config for fcoe.service
rm -f %{buildroot}/%{_sysconfdir}/fcoe/config
%post
%systemd_post fcoe.service
%systemd_post fcoe.service fcoemon.socket
%preun
%systemd_preun fcoe.service
%systemd_preun fcoe.service fcoemon.socket
%postun
%systemd_postun_with_restart fcoe.service
%systemd_postun_with_restart fcoe.service fcoemon.socket
%files
%doc README COPYING QUICKSTART quickstart.txt
%doc README COPYING QUICKSTART
%{_sbindir}/*
%{_mandir}/man8/*
%{_unitdir}/fcoe.service
%{_unitdir}/fcoemon.socket
%{_sysconfdir}/fcoe/
%config(noreplace) %{_sysconfdir}/fcoe/cfg-ethx
%config(noreplace) %{_sysconfdir}/sysconfig/fcoe
%config(noreplace) %{_sysconfdir}/fcoe/config
%{_datadir}/bash-completion/completions/*
%{_libexecdir}/fcoe/
%changelog
* Tue Feb 02 2021 Chris Leech <cleech@redhat.com> - 1.0.33-5.git848bcc6
- add in RHEL conditional for removed fcoe.ko support
* Mon Feb 01 2021 Chris Leech <cleech@redhat.com> - 1.0.33-4.git848bcc6
- drop any differences with upstream service and config files
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.33-3.gitfe376de
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild

View File

@ -1,5 +0,0 @@
# All supported drivers listed here are loaded when service starts
SUPPORTED_DRIVERS="libfc fcoe bnx2fc"
# Add --debug to enable debug messages
FCOEMON_OPTS="--syslog"

View File

@ -1,12 +0,0 @@
[Unit]
Description=Open-FCoE Inititator.
After=syslog.target network.target lldpad.service
[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/fcoe
ExecStartPre=/sbin/modprobe -qa $SUPPORTED_DRIVERS
ExecStart=/usr/sbin/fcoemon $FCOEMON_OPTS
[Install]
WantedBy=multi-user.target

View File

@ -1,25 +0,0 @@
Quick Start guide for Open-FCoE
===============================
1. Install fcoe-utils package. This should also install dcbd, libhbaapi and
libhbalinux as dependencies.
2. Rename /etc/fcoe/cfg-ethx so it corresponds with name of your network
interface (e.g. /etc/fcoe/cfg-eth0). Copy and rename this file accordingly
if you have more interfaces, which should be fcoe-enabled
3. Modify configuration files to enable FCoE. Set FCOE_ENABLE="yes" and
DCB_REQUIRED="yes".
3. Run 'systemctl enable fcoe.service' to start FCoE per run level. This
will setup FCoE to start on reboot.
4. Run 'systemctl enable lldpad.service' to start LLDP agent per run
level. This will setup DCB to start on reboot.
5. Run 'systemctl start lldpad.service' to start LLDP agent.
6. Run 'dcbtool sc ethX dcb on; dcbtool sc ethX app:0 e:1;' for each fcoe-enabled
interface to setup DCB for FCoE.
7. Run 'systemctl start fcoe.sertvice' to start FCoE.

View File

@ -1 +1 @@
SHA512 (fcoe-utils-1.0.33-fe376de.tar.gz) = 76f4225b6a235f955fd39499987d5dfef0dfd5d00fe603770b3ff162348b962d2c11b8b567a389314ca8284f110e155fe5e31b78511ad129a636c88ed25d4f3d
SHA512 (fcoe-utils-1.0.33-848bcc6.tar.gz) = 1f591d4b950032f015399a56233510146791d6c0ac510c1c384ce430273445f4be94aaaeb144469b856830401f2089bb951ec3ee253b425ec9e02fbd8d639bda