pci: fix musl crash 41/37841/3
authorBenoît Ganne <bganne@cisco.com>
Mon, 19 Dec 2022 17:23:03 +0000 (18:23 +0100)
committerDave Wallace <dwallacelf@gmail.com>
Wed, 18 Jan 2023 00:38:09 +0000 (00:38 +0000)
The musl libc does not support closedir(0) resulting in a crash. Only
call closedir() if we successfully opened it.

Type: fix

Change-Id: I3198454f44735501047afc42b94b2fea273212f4
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/vlib/linux/pci.c

index 83e9dde..75d9edf 100644 (file)
@@ -486,7 +486,7 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
                                         "is bound to IOMMU group and "
                                         "vfio-pci driver is not loaded",
                                         format_vlib_pci_addr, addr);
-             goto done;
+             goto err0;
            }
          else
            uio_drv_name = "vfio-pci";
@@ -507,7 +507,7 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
              error = clib_error_return (0, "Skipping PCI device %U: missing "
                                         "kernel VFIO or UIO driver",
                                         format_vlib_pci_addr, addr);
-             goto done;
+             goto err0;
            }
          clib_error_free (error);
        }
@@ -521,7 +521,7 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
       ((strcmp ("vfio-pci", (char *) driver_name) == 0) ||
        (strcmp ("uio_pci_generic", (char *) driver_name) == 0) ||
        (strcmp ("igb_uio", (char *) driver_name) == 0)))
-    goto done;
+    goto err0;
 
   if (!force)
     {
@@ -536,14 +536,14 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
                                     "Skipping PCI device %U: failed to "
                                     "read /sys/class/net",
                                     format_vlib_pci_addr, addr);
-         goto done;
+         goto err0;
        }
 
       fd = socket (PF_INET, SOCK_DGRAM, 0);
       if (fd < 0)
        {
          error = clib_error_return_unix (0, "socket");
-         goto done;
+         goto err1;
        }
 
       while ((e = readdir (dir)))
@@ -580,7 +580,7 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
              error = clib_error_return_unix (0, "ioctl fetch intf %s flags",
                                              e->d_name);
              close (fd);
-             goto done;
+             goto err1;
            }
 
          if (ifr.ifr_flags & IFF_UP)
@@ -590,7 +590,7 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
                        "interface %s is up",
                        format_vlib_pci_addr, addr, e->d_name);
              close (fd);
-             goto done;
+             goto err1;
            }
        }
 
@@ -628,8 +628,9 @@ vlib_pci_bind_to_uio (vlib_main_t *vm, vlib_pci_addr_t *addr,
       vec_reset_length (s);
     }
 
-done:
+err1:
   closedir (dir);
+err0:
   vec_free (s);
   vec_free (dev_dir_name);
   vec_free (driver_name);