16cd6a6acSopenharmony_ci#include <sepol/debug.h>
26cd6a6acSopenharmony_ci#include <sepol/kernel_to_cil.h>
36cd6a6acSopenharmony_ci#include <sepol/kernel_to_conf.h>
46cd6a6acSopenharmony_ci#include <sepol/policydb/policydb.h>
56cd6a6acSopenharmony_ci
66cd6a6acSopenharmony_ciextern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
76cd6a6acSopenharmony_ci
86cd6a6acSopenharmony_cistatic int write_binary_policy(policydb_t *p, FILE *outfp)
96cd6a6acSopenharmony_ci{
106cd6a6acSopenharmony_ci	struct policy_file pf;
116cd6a6acSopenharmony_ci
126cd6a6acSopenharmony_ci	policy_file_init(&pf);
136cd6a6acSopenharmony_ci	pf.type = PF_USE_STDIO;
146cd6a6acSopenharmony_ci	pf.fp = outfp;
156cd6a6acSopenharmony_ci	return policydb_write(p, &pf);
166cd6a6acSopenharmony_ci}
176cd6a6acSopenharmony_ci
186cd6a6acSopenharmony_ciint LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
196cd6a6acSopenharmony_ci{
206cd6a6acSopenharmony_ci	policydb_t policydb = {};
216cd6a6acSopenharmony_ci	sidtab_t sidtab = {};
226cd6a6acSopenharmony_ci	struct policy_file pf;
236cd6a6acSopenharmony_ci	FILE *devnull = NULL;
246cd6a6acSopenharmony_ci
256cd6a6acSopenharmony_ci	sepol_debug(0);
266cd6a6acSopenharmony_ci
276cd6a6acSopenharmony_ci	policy_file_init(&pf);
286cd6a6acSopenharmony_ci	pf.type = PF_USE_MEMORY;
296cd6a6acSopenharmony_ci	pf.data = (char *) data;
306cd6a6acSopenharmony_ci	pf.len = size;
316cd6a6acSopenharmony_ci
326cd6a6acSopenharmony_ci	if (policydb_init(&policydb))
336cd6a6acSopenharmony_ci		goto exit;
346cd6a6acSopenharmony_ci
356cd6a6acSopenharmony_ci	if (policydb_read(&policydb, &pf, /*verbose=*/0))
366cd6a6acSopenharmony_ci		goto exit;
376cd6a6acSopenharmony_ci
386cd6a6acSopenharmony_ci	if (policydb_load_isids(&policydb, &sidtab))
396cd6a6acSopenharmony_ci		goto exit;
406cd6a6acSopenharmony_ci
416cd6a6acSopenharmony_ci	if (policydb.policy_type == POLICY_KERN)
426cd6a6acSopenharmony_ci		(void) policydb_optimize(&policydb);
436cd6a6acSopenharmony_ci
446cd6a6acSopenharmony_ci	devnull = fopen("/dev/null", "w");
456cd6a6acSopenharmony_ci	if (!devnull)
466cd6a6acSopenharmony_ci		goto exit;
476cd6a6acSopenharmony_ci
486cd6a6acSopenharmony_ci	(void) write_binary_policy(&policydb, devnull);
496cd6a6acSopenharmony_ci
506cd6a6acSopenharmony_ci	(void) sepol_kernel_policydb_to_conf(devnull, &policydb);
516cd6a6acSopenharmony_ci
526cd6a6acSopenharmony_ci	(void) sepol_kernel_policydb_to_cil(devnull, &policydb);
536cd6a6acSopenharmony_ci
546cd6a6acSopenharmony_ciexit:
556cd6a6acSopenharmony_ci	if (devnull != NULL)
566cd6a6acSopenharmony_ci		fclose(devnull);
576cd6a6acSopenharmony_ci
586cd6a6acSopenharmony_ci	policydb_destroy(&policydb);
596cd6a6acSopenharmony_ci	sepol_sidtab_destroy(&sidtab);
606cd6a6acSopenharmony_ci
616cd6a6acSopenharmony_ci	/* Non-zero return values are reserved for future use. */
626cd6a6acSopenharmony_ci	return 0;
636cd6a6acSopenharmony_ci}
64