mirror of
https://github.com/systemd/systemd.git
synced 2024-11-05 23:51:28 +03:00
udev/net-id: check all snprintf return values
gcc-8 throws an error if it knows snprintf might truncate output and the return value is ignored: ../src/udev/udev-builtin-net_id.c: In function 'dev_pci_slot': ../src/udev/udev-builtin-net_id.c:297:47: error: '%s' directive output may be truncated writing up to 255 bytes into a region of size between 0 and 4095 [-Werror=format-truncation=] snprintf(str, sizeof str, "%s/%s/address", slots, dent->d_name); ^~ ../src/udev/udev-builtin-net_id.c:297:17: note: 'snprintf' output between 10 and 4360 bytes into a destination of size 4096 snprintf(str, sizeof str, "%s/%s/address", slots, dent->d_name); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors Let's check all return values. This actually makes the code better, because there's no point in trying to open a file when the name has been truncated, etc.
This commit is contained in:
parent
cc5bbdb274
commit
73fc96c8ac
@ -27,9 +27,11 @@
|
|||||||
|
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
|
|
||||||
#define xsprintf(buf, fmt, ...) \
|
#define snprintf_ok(buf, len, fmt, ...) \
|
||||||
assert_message_se((size_t) snprintf(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__) < ELEMENTSOF(buf), "xsprintf: " #buf "[] must be big enough")
|
((size_t) snprintf(buf, len, fmt, __VA_ARGS__) < (len))
|
||||||
|
|
||||||
|
#define xsprintf(buf, fmt, ...) \
|
||||||
|
assert_message_se(snprintf_ok(buf, ELEMENTSOF(buf), fmt, __VA_ARGS__), "xsprintf: " #buf "[] must be big enough")
|
||||||
|
|
||||||
#define VA_FORMAT_ADVANCE(format, ap) \
|
#define VA_FORMAT_ADVANCE(format, ap) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -274,7 +274,9 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
|
|||||||
if (!pci)
|
if (!pci)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
snprintf(slots, sizeof slots, "%s/slots", udev_device_get_syspath(pci));
|
if (!snprintf_ok(slots, sizeof slots, "%s/slots", udev_device_get_syspath(pci)))
|
||||||
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
dir = opendir(slots);
|
dir = opendir(slots);
|
||||||
if (!dir)
|
if (!dir)
|
||||||
return -errno;
|
return -errno;
|
||||||
@ -292,12 +294,11 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
|
|||||||
if (i < 1)
|
if (i < 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snprintf(str, sizeof str, "%s/%s/address", slots, dent->d_name);
|
if (snprintf_ok(str, sizeof str, "%s/%s/address", slots, dent->d_name) &&
|
||||||
if (read_one_line_file(str, &address) >= 0) {
|
read_one_line_file(str, &address) >= 0)
|
||||||
/* match slot address with device by stripping the function */
|
/* match slot address with device by stripping the function */
|
||||||
if (strneq(address, udev_device_get_sysname(names->pcidev), strlen(address)))
|
if (streq(address, udev_device_get_sysname(names->pcidev)))
|
||||||
hotplug_slot = i;
|
hotplug_slot = i;
|
||||||
}
|
|
||||||
|
|
||||||
if (hotplug_slot > 0)
|
if (hotplug_slot > 0)
|
||||||
break;
|
break;
|
||||||
@ -513,7 +514,6 @@ static int names_ccw(struct udev_device *dev, struct netnames *names) {
|
|||||||
const char *bus_id, *subsys;
|
const char *bus_id, *subsys;
|
||||||
size_t bus_id_len;
|
size_t bus_id_len;
|
||||||
size_t bus_id_start;
|
size_t bus_id_start;
|
||||||
int rc;
|
|
||||||
|
|
||||||
assert(dev);
|
assert(dev);
|
||||||
assert(names);
|
assert(names);
|
||||||
@ -555,9 +555,9 @@ static int names_ccw(struct udev_device *dev, struct netnames *names) {
|
|||||||
bus_id += bus_id_start < bus_id_len ? bus_id_start : bus_id_len - 1;
|
bus_id += bus_id_start < bus_id_len ? bus_id_start : bus_id_len - 1;
|
||||||
|
|
||||||
/* Store the CCW bus-ID for use as network device name */
|
/* Store the CCW bus-ID for use as network device name */
|
||||||
rc = snprintf(names->ccw_busid, sizeof(names->ccw_busid), "c%s", bus_id);
|
if (snprintf_ok(names->ccw_busid, sizeof(names->ccw_busid), "c%s", bus_id))
|
||||||
if (rc >= 0 && rc < (int)sizeof(names->ccw_busid))
|
|
||||||
names->type = NET_CCW;
|
names->type = NET_CCW;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -670,7 +670,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (err >= 0 && names.type == NET_CCW) {
|
if (err >= 0 && names.type == NET_CCW) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.ccw_busid) < (int)sizeof(str))
|
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.ccw_busid))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -680,7 +680,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (err >= 0 && names.type == NET_VIO) {
|
if (err >= 0 && names.type == NET_VIO) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.vio_slot) < (int)sizeof(str))
|
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.vio_slot))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -690,7 +690,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (err >= 0 && names.type == NET_PLATFORM) {
|
if (err >= 0 && names.type == NET_PLATFORM) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.platform_path) < (int)sizeof(str))
|
if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.platform_path))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -704,21 +704,21 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (names.type == NET_PCI) {
|
if (names.type == NET_PCI) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (names.pci_onboard[0])
|
if (names.pci_onboard[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.pci_onboard) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_onboard))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_ONBOARD", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_ONBOARD", str);
|
||||||
|
|
||||||
if (names.pci_onboard_label)
|
if (names.pci_onboard_label &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.pci_onboard_label) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_onboard_label))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_LABEL_ONBOARD", str);
|
udev_builtin_add_property(dev, test, "ID_NET_LABEL_ONBOARD", str);
|
||||||
|
|
||||||
if (names.pci_path[0])
|
if (names.pci_path[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.pci_path) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_path))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
|
|
||||||
if (names.pci_slot[0])
|
if (names.pci_slot[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s", prefix, names.pci_slot) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_slot))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -727,13 +727,13 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (err >= 0 && names.type == NET_USB) {
|
if (err >= 0 && names.type == NET_USB) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (names.pci_path[0])
|
if (names.pci_path[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_path, names.usb_ports) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_path, names.usb_ports))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
|
|
||||||
if (names.pci_slot[0])
|
if (names.pci_slot[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_slot, names.usb_ports) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_slot, names.usb_ports))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,13 +742,13 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
|
|||||||
if (err >= 0 && names.type == NET_BCMA) {
|
if (err >= 0 && names.type == NET_BCMA) {
|
||||||
char str[IFNAMSIZ];
|
char str[IFNAMSIZ];
|
||||||
|
|
||||||
if (names.pci_path[0])
|
if (names.pci_path[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_path, names.bcma_core) < (int)sizeof(str))
|
snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_path, names.bcma_core))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
|
|
||||||
if (names.pci_slot[0])
|
if (names.pci_slot[0] &&
|
||||||
if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_slot, names.bcma_core) < (int)sizeof(str))
|
snprintf(str, sizeof str, "%s%s%s", prefix, names.pci_slot, names.bcma_core))
|
||||||
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user