/* usbredirfilterfuzz.cc -- fuzzing for usbredirfilter Copyright 2021 Michael Hanselmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, see . */ #include #include #include #include #include #include "usbredirfilter.h" namespace { struct FilterDeleter { void operator()(void *ptr) { usbredirfilter_free(ptr); } }; } extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { static FILE *dev_null = nullptr; if (dev_null == nullptr) { dev_null = fopen("/dev/null", "wb"); if (dev_null == nullptr) { perror("open /dev/null"); abort(); } } FuzzedDataProvider fdp{data, size}; std::unique_ptr rules; int ret, rules_count; const std::string token_sep = fdp.ConsumeBytesAsString(1), rule_sep = fdp.ConsumeBytesAsString(1); { usbredirfilter_rule *rules_ptr = nullptr; ret = usbredirfilter_string_to_rules( fdp.ConsumeRandomLengthString().c_str(), token_sep.c_str(), rule_sep.c_str(), &rules_ptr, &rules_count); if (ret != 0 || rules_ptr == nullptr) { return 1; } rules.reset(rules_ptr); } usbredirfilter_verify(rules.get(), rules_count); usbredirfilter_print(rules.get(), rules_count, dev_null); { std::unique_ptr str; str.reset(usbredirfilter_rules_to_string(rules.get(), rules_count, token_sep.c_str(), rule_sep.c_str())); } { const int interface_count = fdp.ConsumeIntegralInRange(1, 128); std::vector interface_class = fdp.ConsumeBytes(interface_count), interface_subclass = fdp.ConsumeBytes(interface_count), interface_protocol = fdp.ConsumeBytes(interface_count); // Fill with zeros up to the desired length interface_class.resize(interface_count, 0); interface_subclass.resize(interface_count, 0); interface_protocol.resize(interface_count, 0); usbredirfilter_check(rules.get(), rules_count, fdp.ConsumeIntegral(), fdp.ConsumeIntegral(), fdp.ConsumeIntegral(), &interface_class[0], &interface_subclass[0], &interface_protocol[0], interface_count, fdp.ConsumeIntegral(), fdp.ConsumeIntegral(), fdp.ConsumeIntegral(), fdp.ConsumeIntegral()); } return 0; } /* vim: set sw=4 sts=4 et : */