1 /*
2    Fuzzing for oLschema2ldif
3    Copyright (C) Michael Hanselmann 2019
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "includes.h"
20 #include "fuzzing.h"
21 #include "utils/oLschema2ldif/lib.h"
22 
23 static FILE *devnull;
24 
LLVMFuzzerInitialize(int * argc,char *** argv)25 int LLVMFuzzerInitialize(int *argc, char ***argv)
26 {
27 	devnull = fopen("/dev/null", "w");
28 
29 	return 0;
30 }
31 
LLVMFuzzerTestOneInput(uint8_t * buf,size_t len)32 int LLVMFuzzerTestOneInput(uint8_t *buf, size_t len)
33 {
34 	TALLOC_CTX *mem_ctx;
35 	struct conv_options opt;
36 
37 	if (len == 0) {
38 		/*
39 		 * Otherwise fmemopen() will return null and set errno
40 		 * to EINVAL
41 		 */
42 		return 0;
43 	}
44 
45 	mem_ctx = talloc_init(__FUNCTION__);
46 	if (mem_ctx == NULL) {
47 		return 0;
48 	}
49 
50 	opt.in = fmemopen(buf, len, "r");
51 	opt.out = devnull;
52 	opt.ldb_ctx = ldb_init(mem_ctx, NULL);
53 	if (opt.ldb_ctx == NULL || opt.in == NULL) {
54 		talloc_free(mem_ctx);
55 		return 0;
56 	}
57 
58 	opt.basedn = ldb_dn_new(mem_ctx, opt.ldb_ctx, "");
59 	if (opt.basedn == NULL) {
60 		talloc_free(mem_ctx);
61 		return 0;
62 	}
63 
64 	process_file(mem_ctx, &opt);
65 
66 	fclose(opt.in);
67 
68 	talloc_free(mem_ctx);
69 
70 	return 0;
71 }
72