chiark / gitweb /
network-address,test-network: avoid undefined behaviour
[elogind.git] / src / udev / udev-builtin-net_id.c
index 96ac21c16771ff0f25cbb881e2e14049140f4e81..37ff1b800882a2a2d9c13a59d21c35d18bd23682 100644 (file)
@@ -149,25 +149,22 @@ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) {
 
 /* read the 256 bytes PCI configuration space to check the multi-function bit */
 static bool is_pci_multifunction(struct udev_device *dev) {
-        char filename[256];
-        FILE *f = NULL;
-        char config[64];
-        bool multi = false;
+        _cleanup_fclose_ FILE *f = NULL;
+        const char *filename;
+        uint8_t config[64];
 
-        snprintf(filename, sizeof(filename), "%s/config", udev_device_get_syspath(dev));
+        filename = strjoina(udev_device_get_syspath(dev), "/config");
         f = fopen(filename, "re");
         if (!f)
-                goto out;
+                return false;
         if (fread(&config, sizeof(config), 1, f) != 1)
-                goto out;
+                return false;
 
         /* bit 0-6 header type, bit 7 multi/single function device */
         if ((config[PCI_HEADER_TYPE] & 0x80) != 0)
-                multi = true;
-out:
-        if (f)
-                fclose(f);
-        return multi;
+                return true;
+
+        return false;
 }
 
 static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
@@ -194,12 +191,12 @@ static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
         s = names->pci_path;
         l = sizeof(names->pci_path);
         if (domain > 0)
-                l = strpcpyf(&s, l, "P%d", domain);
-        l = strpcpyf(&s, l, "p%ds%d", bus, slot);
+                l = strpcpyf(&s, l, "P%u", domain);
+        l = strpcpyf(&s, l, "p%us%u", bus, slot);
         if (func > 0 || is_pci_multifunction(names->pcidev))
-                l = strpcpyf(&s, l, "f%d", func);
+                l = strpcpyf(&s, l, "f%u", func);
         if (dev_port > 0)
-                l = strpcpyf(&s, l, "d%d", dev_port);
+                l = strpcpyf(&s, l, "d%u", dev_port);
         if (l == 0)
                 names->pci_path[0] = '\0';
 
@@ -310,7 +307,7 @@ static int names_usb(struct udev_device *dev, struct netnames *names) {
         s[0] = '\0';
         interf = s+1;
 
-        /* prefix every port number in the chain with "u"*/
+        /* prefix every port number in the chain with "u" */
         s = ports;
         while ((s = strchr(s, '.')))
                 s[0] = 'u';
@@ -565,5 +562,5 @@ out:
 const struct udev_builtin udev_builtin_net_id = {
         .name = "net_id",
         .cmd = builtin_net_id,
-        .help = "network device properties",
+        .help = "Network device properties",
 };