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