etc.git


etc

~ scripts and random things
git clone https://github.com/djnnvx/etc.git
log | files | refs | archive

fuzz_bos.c (2072B)

      1 /*
      2  * Harness: BOS descriptor parsing + all 5 device-capability extractors.
      3  * Key bugs: platform bLength underflow (line 1268), SSPlus OOB (line 1115).
      4  */
      5 
      6 #include "fuzz-include/libusb_fuzz.h"
      7 #include "libusb-src/libusb/descriptor.c"
      8 
      9 static int fuzz_one(const uint8_t *data, size_t size)
     10 {
     11     if (size < 1)
     12         return 0;
     13 
     14     struct libusb_bos_descriptor *bos = NULL;
     15     int r = parse_bos(NULL, &bos,
     16         data, (int)(size > (size_t)INT_MAX ? INT_MAX : size));
     17     if (r != LIBUSB_SUCCESS || !bos)
     18         return 0;
     19 
     20     for (uint8_t i = 0; i < bos->bNumDeviceCaps; i++) {
     21         struct libusb_bos_dev_capability_descriptor *cap = bos->dev_capability[i];
     22 
     23         struct libusb_usb_2_0_extension_descriptor *usb20 = NULL;
     24         libusb_get_usb_2_0_extension_descriptor(NULL, cap, &usb20);
     25         if (usb20) libusb_free_usb_2_0_extension_descriptor(usb20);
     26 
     27         struct libusb_ss_usb_device_capability_descriptor *ss = NULL;
     28         libusb_get_ss_usb_device_capability_descriptor(NULL, cap, &ss);
     29         if (ss) libusb_free_ss_usb_device_capability_descriptor(ss);
     30 
     31         struct libusb_ssplus_usb_device_capability_descriptor *ssplus = NULL;
     32         libusb_get_ssplus_usb_device_capability_descriptor(NULL, cap, &ssplus);
     33         if (ssplus) libusb_free_ssplus_usb_device_capability_descriptor(ssplus);
     34 
     35         struct libusb_container_id_descriptor *cid = NULL;
     36         libusb_get_container_id_descriptor(NULL, cap, &cid);
     37         if (cid) libusb_free_container_id_descriptor(cid);
     38 
     39         struct libusb_platform_descriptor *plat = NULL;
     40         libusb_get_platform_descriptor(NULL, cap, &plat);
     41         if (plat) libusb_free_platform_descriptor(plat);
     42     }
     43 
     44     libusb_free_bos_descriptor(bos);
     45     return 0;
     46 }
     47 
     48 #ifdef __AFL_FUZZ_TESTCASE_LEN
     49 __AFL_FUZZ_INIT();
     50 int main(void)
     51 {
     52     __AFL_INIT();
     53     uint8_t *buf = __AFL_FUZZ_TESTCASE_BUF;
     54     while (__AFL_LOOP(10000))
     55         fuzz_one(buf, __AFL_FUZZ_TESTCASE_LEN);
     56     return 0;
     57 }
     58 #else
     59 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
     60 {
     61     return fuzz_one(data, size);
     62 }
     63 #endif