1 /*
2  * This file is part of PowerDNS or dnsdist.
3  * Copyright -- PowerDNS.COM B.V. and its contributors
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * In addition, for the avoidance of any doubt, permission is granted to
10  * link this program with OpenSSL and to (re)distribute the binaries
11  * produced as the result of such linking.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
22 
23 #include "dnsname.hh"
24 #include "dnsparser.hh"
25 #include "dnsrecords.hh"
26 #include "statbag.hh"
27 #include "zoneparser-tng.hh"
28 
29 StatBag S;
30 
init()31 static void init()
32 {
33   reportAllTypes();
34 }
35 
36 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
37 
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)38 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
39   static bool initialized = false;
40 
41   if (!initialized) {
42     init();
43     initialized = true;
44   }
45 
46   try {
47     std::vector<std::string> lines;
48     std::string tmp(reinterpret_cast<const char*>(data), size);
49     boost::split(lines, tmp, boost::is_any_of("\n"));
50 
51     ZoneParserTNG zpt(lines, g_rootdnsname);
52     /* limit the number of steps for '$GENERATE' entries */
53     zpt.setMaxGenerateSteps(10000);
54     DNSResourceRecord drr;
55     while (zpt.get(drr)) {
56     }
57   }
58   catch(const std::exception& e) {
59   }
60   catch(const PDNSException& e) {
61   }
62 
63   return 0;
64 }
65