Fix get_device_list for realloc case
authorVasily Khoruzhick <anarsoul@gmail.com>
Sat, 15 Mar 2008 11:50:53 +0000 (13:50 +0200)
committerDaniel Drake <dsd@gentoo.org>
Sat, 15 Mar 2008 12:26:06 +0000 (12:26 +0000)
get_device_list can modify pointer passed to it with realloc, but this
case wasn't handled and caused crash on my machine. Fixed

Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
libusb/core.c
libusb/libusbi.h
libusb/os/linux_usbfs.c

index 68d32ce..63a7ecd 100644 (file)
@@ -134,7 +134,7 @@ API_EXPORTED int libusb_get_device_list(struct libusb_device ***list)
        if (!discdevs)
                return -ENOMEM;
 
-       r = usbi_backend->get_device_list(discdevs);
+       r = usbi_backend->get_device_list(&discdevs);
        if (r < 0)
                goto out;
 
index 2d56d64..0ff418b 100644 (file)
@@ -231,7 +231,7 @@ struct usbi_os_backend {
        int (*init)(void);
        void (*exit)(void);
 
-       int (*get_device_list)(struct discovered_devs *discdevs);
+       int (*get_device_list)(struct discovered_devs **discdevs);
 
        int (*open)(struct libusb_device_handle *handle);
        void (*close)(struct libusb_device_handle *handle);
index bfd526b..a64a7e7 100644 (file)
@@ -333,9 +333,10 @@ out:
        return r;
 }
 
-static int op_get_device_list(struct discovered_devs *discdevs)
+static int op_get_device_list(struct discovered_devs **_discdevs)
 {
        struct dirent *entry;
+       struct discovered_devs *discdevs = *_discdevs;
        int r = 0;
        DIR *buses = opendir(usbfs_path);
        if (!buses) {
@@ -364,6 +365,7 @@ static int op_get_device_list(struct discovered_devs *discdevs)
 
 out:
        closedir(buses);
+       *_discdevs = discdevs;
        return r;
 }