etc.git


etc

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

fuzz_usbfs.c (1673B)

      1 /*
      2  * Harness: linux_usbfs parse_config_descriptors via direct priv injection.
      3  * Input: raw descriptor blob — 18-byte device desc + config descriptors.
      4  */
      5 
      6 #include "fuzz-include/libusb_fuzz.h"
      7 #include "libusb-src/libusb/libusbi.h"
      8 
      9 int fuzz_parse_config_descriptors(struct libusb_device *dev);
     10 
     11 /* Must match layout in fuzz_usbfs_shim.c */
     12 struct linux_device_priv {
     13     char   *sysfs_dir;
     14     void   *descriptors;
     15     size_t  descriptors_len;
     16     void   *config_descriptors;
     17     int     active_config;
     18 };
     19 
     20 static int fuzz_one(const uint8_t *data, size_t size)
     21 {
     22     if (size < LIBUSB_DT_DEVICE_SIZE)
     23         return 0;
     24 
     25     size_t dev_padded = PTR_ALIGN(sizeof(struct libusb_device));
     26     uint8_t *block = calloc(1, dev_padded + sizeof(struct linux_device_priv));
     27     if (!block)
     28         return 0;
     29 
     30     struct libusb_device     *dev  = (struct libusb_device *)block;
     31     struct linux_device_priv *priv = (struct linux_device_priv *)(block + dev_padded);
     32 
     33     memcpy(&dev->device_descriptor, data, LIBUSB_DT_DEVICE_SIZE);
     34 
     35     priv->descriptors = malloc(size);
     36     if (!priv->descriptors) { free(block); return 0; }
     37     memcpy(priv->descriptors, data, size);
     38     priv->descriptors_len = size;
     39 
     40     fuzz_parse_config_descriptors(dev);
     41 
     42     free(priv->config_descriptors);
     43     free(priv->descriptors);
     44     free(block);
     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