From 48b9694bce4e53dc6ceadb51423def5a546efef9 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 13 Feb 2017 13:43:18 +0100 Subject: add cve-2017-5898.c --- usb.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 usb.c (limited to 'usb.c') diff --git a/usb.c b/usb.c new file mode 100644 index 0000000..d212f85 --- /dev/null +++ b/usb.c @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "usb.h" + +static libusb_context *ctx; +libusb_device *dev; +libusb_device_handle *hdev; + +void find_device(char *name, + unsigned int vendor, + unsigned int device) +{ + struct libusb_device_descriptor ddesc; + libusb_device **devs = NULL; + int rc, i, n; + + if (!ctx) { + rc = libusb_init(&ctx); + if (rc != 0) { + fprintf(stderr, "libusb_init failed (%d)\n", rc); + exit(1); + } + libusb_set_debug(ctx, LIBUSB_LOG_LEVEL_INFO); + } + + n = libusb_get_device_list(ctx, &devs); + for (i = 0; i < n; i++) { + rc = libusb_get_device_descriptor(devs[i], &ddesc); + if (rc != 0) { + fprintf(stderr, "libusb_get_device_descriptor failed (%d)\n", rc); + exit(1); + } + if (vendor != ddesc.idVendor) + continue; + if (device != ddesc.idProduct) + continue; + dev = devs[i]; + fprintf(stderr, "%s found at %d:%d\n", name, + libusb_get_bus_number(dev), + libusb_get_device_address(dev)); + libusb_free_device_list(devs, 1); + + rc = libusb_open(dev, &hdev); + if (rc != 0) { + fprintf(stderr, "libusb_open failed (%d)\n", rc); + exit(1); + } + libusb_set_auto_detach_kernel_driver(hdev, 1); + rc = libusb_claim_interface(hdev, 0); + if (rc != 0) { + fprintf(stderr, "libusb_claim_interface failed (%d)\n", rc); + exit(1); + } + return; + } + fprintf(stderr, "%s not found\n", name); + exit(1); +} -- cgit