blob: fbbfaa941c6c0ec04b49499b89b4113a9357be0a [file] [log] [blame]
#include <cstddef>
#include <cstdint>
#include <lib/dnssd/minimal_mdns/Parser.h>
#include <lib/dnssd/minimal_mdns/RecordData.h>
namespace {
using namespace chip;
using namespace mdns::Minimal;
class FuzzDelegate : public ParserDelegate
{
public:
FuzzDelegate(const mdns::Minimal::BytesRange & packet) : mPacketRange(packet) {}
virtual ~FuzzDelegate() {}
void OnHeader(ConstHeaderRef & header) override {}
void OnQuery(const QueryData & data) override {}
void OnResource(ResourceType type, const ResourceData & data) override
{
switch (data.GetType())
{
case QType::SRV: {
mdns::Minimal::SrvRecord srv;
(void) srv.Parse(data.GetData(), mPacketRange);
break;
}
case QType::A: {
chip::Inet::IPAddress addr;
(void) mdns::Minimal::ParseARecord(data.GetData(), &addr);
break;
}
case QType::AAAA: {
chip::Inet::IPAddress addr;
(void) mdns::Minimal::ParseAAAARecord(data.GetData(), &addr);
break;
}
case QType::PTR: {
mdns::Minimal::SerializedQNameIterator name;
(void) mdns::Minimal::ParsePtrRecord(data.GetData(), mPacketRange, &name);
break;
}
default:
// nothing to do
break;
}
}
private:
mdns::Minimal::BytesRange mPacketRange;
};
} // namespace
extern "C" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t len)
{
BytesRange packet(data, data + len);
FuzzDelegate delegate(packet);
mdns::Minimal::ParsePacket(packet, &delegate);
return 0;
}