xref: /aosp_15_r20/external/selinux/semodule-utils/semodule_package/semodule_package.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /* Authors: Karl MacMillan <[email protected]>
2*2d543d20SAndroid Build Coastguard Worker  *
3*2d543d20SAndroid Build Coastguard Worker  * Copyright (C) 2004 Tresys Technology, LLC
4*2d543d20SAndroid Build Coastguard Worker  *	This program is free software; you can redistribute it and/or modify
5*2d543d20SAndroid Build Coastguard Worker  *  	it under the terms of the GNU General Public License as published by
6*2d543d20SAndroid Build Coastguard Worker  *	the Free Software Foundation, version 2.
7*2d543d20SAndroid Build Coastguard Worker  */
8*2d543d20SAndroid Build Coastguard Worker 
9*2d543d20SAndroid Build Coastguard Worker #include <sepol/module.h>
10*2d543d20SAndroid Build Coastguard Worker #include <getopt.h>
11*2d543d20SAndroid Build Coastguard Worker #include <fcntl.h>
12*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
13*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
14*2d543d20SAndroid Build Coastguard Worker #include <string.h>
15*2d543d20SAndroid Build Coastguard Worker #include <unistd.h>
16*2d543d20SAndroid Build Coastguard Worker #include <sys/types.h>
17*2d543d20SAndroid Build Coastguard Worker #include <sys/stat.h>
18*2d543d20SAndroid Build Coastguard Worker #include <sys/mman.h>
19*2d543d20SAndroid Build Coastguard Worker #include <fcntl.h>
20*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
21*2d543d20SAndroid Build Coastguard Worker 
usage(const char * prog)22*2d543d20SAndroid Build Coastguard Worker static void usage(const char *prog)
23*2d543d20SAndroid Build Coastguard Worker {
24*2d543d20SAndroid Build Coastguard Worker 	printf("usage: %s -o <output file> -m <module> [-f <file contexts>]\n",
25*2d543d20SAndroid Build Coastguard Worker 	       prog);
26*2d543d20SAndroid Build Coastguard Worker 	printf("Options:\n");
27*2d543d20SAndroid Build Coastguard Worker 	printf("  -o --outfile		Output file (required)\n");
28*2d543d20SAndroid Build Coastguard Worker 	printf("  -m --module		Module file (required)\n");
29*2d543d20SAndroid Build Coastguard Worker 	printf("  -f --fc		File contexts file\n");
30*2d543d20SAndroid Build Coastguard Worker 	printf("  -s --seuser		Seusers file (only valid in base)\n");
31*2d543d20SAndroid Build Coastguard Worker 	printf
32*2d543d20SAndroid Build Coastguard Worker 	    ("  -u --user_extra	user_extra file (only valid in base)\n");
33*2d543d20SAndroid Build Coastguard Worker 	printf("  -n --nc		Netfilter contexts file\n");
34*2d543d20SAndroid Build Coastguard Worker 	printf("  -h --help		Show this help message\n");
35*2d543d20SAndroid Build Coastguard Worker }
36*2d543d20SAndroid Build Coastguard Worker 
file_to_data(const char * path,char ** data,size_t * len,const char * progname)37*2d543d20SAndroid Build Coastguard Worker static int file_to_data(const char *path, char **data, size_t * len, const char *progname)
38*2d543d20SAndroid Build Coastguard Worker {
39*2d543d20SAndroid Build Coastguard Worker 	int fd;
40*2d543d20SAndroid Build Coastguard Worker 	struct stat sb;
41*2d543d20SAndroid Build Coastguard Worker 	fd = open(path, O_RDONLY | O_CLOEXEC);
42*2d543d20SAndroid Build Coastguard Worker 	if (fd < 0) {
43*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Failed to open %s:  %s\n", progname, path,
44*2d543d20SAndroid Build Coastguard Worker 			strerror(errno));
45*2d543d20SAndroid Build Coastguard Worker 		return -1;
46*2d543d20SAndroid Build Coastguard Worker 	}
47*2d543d20SAndroid Build Coastguard Worker 	if (fstat(fd, &sb) < 0) {
48*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Failed to fstat %s:  %s\n", progname,
49*2d543d20SAndroid Build Coastguard Worker 			path, strerror(errno));
50*2d543d20SAndroid Build Coastguard Worker 		goto err;
51*2d543d20SAndroid Build Coastguard Worker 	}
52*2d543d20SAndroid Build Coastguard Worker 	if (!sb.st_size) {
53*2d543d20SAndroid Build Coastguard Worker 		close(fd);
54*2d543d20SAndroid Build Coastguard Worker 		*len = 0;
55*2d543d20SAndroid Build Coastguard Worker 		return 0;
56*2d543d20SAndroid Build Coastguard Worker 	}
57*2d543d20SAndroid Build Coastguard Worker 
58*2d543d20SAndroid Build Coastguard Worker 	*data = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
59*2d543d20SAndroid Build Coastguard Worker 	if (*data == MAP_FAILED) {
60*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Failed to mmap %s:  %s\n", progname, path,
61*2d543d20SAndroid Build Coastguard Worker 			strerror(errno));
62*2d543d20SAndroid Build Coastguard Worker 		goto err;
63*2d543d20SAndroid Build Coastguard Worker 	}
64*2d543d20SAndroid Build Coastguard Worker 	*len = sb.st_size;
65*2d543d20SAndroid Build Coastguard Worker 	close(fd);
66*2d543d20SAndroid Build Coastguard Worker 	return 0;
67*2d543d20SAndroid Build Coastguard Worker       err:
68*2d543d20SAndroid Build Coastguard Worker 	close(fd);
69*2d543d20SAndroid Build Coastguard Worker 	return -1;
70*2d543d20SAndroid Build Coastguard Worker }
71*2d543d20SAndroid Build Coastguard Worker 
main(int argc,char ** argv)72*2d543d20SAndroid Build Coastguard Worker int main(int argc, char **argv)
73*2d543d20SAndroid Build Coastguard Worker {
74*2d543d20SAndroid Build Coastguard Worker 	struct sepol_module_package *pkg = NULL;
75*2d543d20SAndroid Build Coastguard Worker 	struct sepol_policy_file *mod = NULL, *out = NULL;
76*2d543d20SAndroid Build Coastguard Worker 	FILE *fp = NULL;
77*2d543d20SAndroid Build Coastguard Worker 	char *module = NULL, *file_contexts = NULL, *seusers =
78*2d543d20SAndroid Build Coastguard Worker 	    NULL, *user_extra = NULL;
79*2d543d20SAndroid Build Coastguard Worker 	char *fcdata = NULL, *outfile = NULL, *seusersdata =
80*2d543d20SAndroid Build Coastguard Worker 	    NULL, *user_extradata = NULL;
81*2d543d20SAndroid Build Coastguard Worker 	char *netfilter_contexts = NULL, *ncdata = NULL;
82*2d543d20SAndroid Build Coastguard Worker 	size_t fclen = 0, seuserslen = 0, user_extralen = 0, nclen = 0;
83*2d543d20SAndroid Build Coastguard Worker 	int i, ret;
84*2d543d20SAndroid Build Coastguard Worker 
85*2d543d20SAndroid Build Coastguard Worker 	const struct option opts[] = {
86*2d543d20SAndroid Build Coastguard Worker 		{"module", required_argument, NULL, 'm'},
87*2d543d20SAndroid Build Coastguard Worker 		{"fc", required_argument, NULL, 'f'},
88*2d543d20SAndroid Build Coastguard Worker 		{"seuser", required_argument, NULL, 's'},
89*2d543d20SAndroid Build Coastguard Worker 		{"user_extra", required_argument, NULL, 'u'},
90*2d543d20SAndroid Build Coastguard Worker 		{"nc", required_argument, NULL, 'n'},
91*2d543d20SAndroid Build Coastguard Worker 		{"outfile", required_argument, NULL, 'o'},
92*2d543d20SAndroid Build Coastguard Worker 		{"help", 0, NULL, 'h'},
93*2d543d20SAndroid Build Coastguard Worker 		{NULL, 0, NULL, 0}
94*2d543d20SAndroid Build Coastguard Worker 	};
95*2d543d20SAndroid Build Coastguard Worker 
96*2d543d20SAndroid Build Coastguard Worker 	while ((i = getopt_long(argc, argv, "m:f:s:u:o:n:h", opts, NULL)) != -1) {
97*2d543d20SAndroid Build Coastguard Worker 		switch (i) {
98*2d543d20SAndroid Build Coastguard Worker 		case 'h':
99*2d543d20SAndroid Build Coastguard Worker 			usage(argv[0]);
100*2d543d20SAndroid Build Coastguard Worker 			return EXIT_SUCCESS;
101*2d543d20SAndroid Build Coastguard Worker 		case 'm':
102*2d543d20SAndroid Build Coastguard Worker 			if (module) {
103*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
104*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one module\n");
105*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
106*2d543d20SAndroid Build Coastguard Worker 			}
107*2d543d20SAndroid Build Coastguard Worker 			module = strdup(optarg);
108*2d543d20SAndroid Build Coastguard Worker 			if (!module) {
109*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
110*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
111*2d543d20SAndroid Build Coastguard Worker 			}
112*2d543d20SAndroid Build Coastguard Worker 			break;
113*2d543d20SAndroid Build Coastguard Worker 		case 'f':
114*2d543d20SAndroid Build Coastguard Worker 			if (file_contexts) {
115*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
116*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one file context file\n");
117*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
118*2d543d20SAndroid Build Coastguard Worker 			}
119*2d543d20SAndroid Build Coastguard Worker 			file_contexts = strdup(optarg);
120*2d543d20SAndroid Build Coastguard Worker 			if (!file_contexts) {
121*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
122*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
123*2d543d20SAndroid Build Coastguard Worker 			}
124*2d543d20SAndroid Build Coastguard Worker 			break;
125*2d543d20SAndroid Build Coastguard Worker 		case 'o':
126*2d543d20SAndroid Build Coastguard Worker 			if (outfile) {
127*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
128*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one output file\n");
129*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
130*2d543d20SAndroid Build Coastguard Worker 			}
131*2d543d20SAndroid Build Coastguard Worker 			outfile = strdup(optarg);
132*2d543d20SAndroid Build Coastguard Worker 			if (!outfile) {
133*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
134*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
135*2d543d20SAndroid Build Coastguard Worker 			}
136*2d543d20SAndroid Build Coastguard Worker 			break;
137*2d543d20SAndroid Build Coastguard Worker 		case 's':
138*2d543d20SAndroid Build Coastguard Worker 			if (seusers) {
139*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
140*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one seuser file\n");
141*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
142*2d543d20SAndroid Build Coastguard Worker 			}
143*2d543d20SAndroid Build Coastguard Worker 			seusers = strdup(optarg);
144*2d543d20SAndroid Build Coastguard Worker 			if (!seusers) {
145*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
146*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
147*2d543d20SAndroid Build Coastguard Worker 			}
148*2d543d20SAndroid Build Coastguard Worker 			break;
149*2d543d20SAndroid Build Coastguard Worker 		case 'u':
150*2d543d20SAndroid Build Coastguard Worker 			if (user_extra) {
151*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
152*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one user_extra file\n");
153*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
154*2d543d20SAndroid Build Coastguard Worker 			}
155*2d543d20SAndroid Build Coastguard Worker 			user_extra = strdup(optarg);
156*2d543d20SAndroid Build Coastguard Worker 			if (!user_extra) {
157*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
158*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
159*2d543d20SAndroid Build Coastguard Worker 			}
160*2d543d20SAndroid Build Coastguard Worker 			break;
161*2d543d20SAndroid Build Coastguard Worker 		case 'n':
162*2d543d20SAndroid Build Coastguard Worker 			if (netfilter_contexts) {
163*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr,
164*2d543d20SAndroid Build Coastguard Worker 					"May not specify more than one netfilter contexts file\n");
165*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
166*2d543d20SAndroid Build Coastguard Worker 			}
167*2d543d20SAndroid Build Coastguard Worker 			netfilter_contexts = strdup(optarg);
168*2d543d20SAndroid Build Coastguard Worker 			if (!netfilter_contexts) {
169*2d543d20SAndroid Build Coastguard Worker 				fprintf(stderr, "%s:  Out of memory\n", argv[0]);
170*2d543d20SAndroid Build Coastguard Worker 				return EXIT_FAILURE;
171*2d543d20SAndroid Build Coastguard Worker 			}
172*2d543d20SAndroid Build Coastguard Worker 			break;
173*2d543d20SAndroid Build Coastguard Worker 		default:
174*2d543d20SAndroid Build Coastguard Worker 			usage(argv[0]);
175*2d543d20SAndroid Build Coastguard Worker 			return EXIT_FAILURE;
176*2d543d20SAndroid Build Coastguard Worker 		}
177*2d543d20SAndroid Build Coastguard Worker 	}
178*2d543d20SAndroid Build Coastguard Worker 
179*2d543d20SAndroid Build Coastguard Worker 	if (optind < argc) {
180*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Superfluous command line arguments: ", argv[0]);
181*2d543d20SAndroid Build Coastguard Worker 		while (optind < argc)
182*2d543d20SAndroid Build Coastguard Worker 			 fprintf(stderr, "%s ", argv[optind++]);
183*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "\n");
184*2d543d20SAndroid Build Coastguard Worker 		usage(argv[0]);
185*2d543d20SAndroid Build Coastguard Worker 		return EXIT_FAILURE;
186*2d543d20SAndroid Build Coastguard Worker 	}
187*2d543d20SAndroid Build Coastguard Worker 
188*2d543d20SAndroid Build Coastguard Worker 	if (!module || !outfile) {
189*2d543d20SAndroid Build Coastguard Worker 		usage(argv[0]);
190*2d543d20SAndroid Build Coastguard Worker 		return EXIT_FAILURE;
191*2d543d20SAndroid Build Coastguard Worker 	}
192*2d543d20SAndroid Build Coastguard Worker 
193*2d543d20SAndroid Build Coastguard Worker 	if (file_contexts && file_to_data(file_contexts, &fcdata, &fclen, argv[0]))
194*2d543d20SAndroid Build Coastguard Worker 		goto failure;
195*2d543d20SAndroid Build Coastguard Worker 
196*2d543d20SAndroid Build Coastguard Worker 	if (seusers && file_to_data(seusers, &seusersdata, &seuserslen, argv[0]))
197*2d543d20SAndroid Build Coastguard Worker 		goto failure;
198*2d543d20SAndroid Build Coastguard Worker 
199*2d543d20SAndroid Build Coastguard Worker 	if (user_extra && file_to_data(user_extra, &user_extradata, &user_extralen, argv[0]))
200*2d543d20SAndroid Build Coastguard Worker 		goto failure;
201*2d543d20SAndroid Build Coastguard Worker 
202*2d543d20SAndroid Build Coastguard Worker 	if (netfilter_contexts && file_to_data(netfilter_contexts, &ncdata, &nclen, argv[0]))
203*2d543d20SAndroid Build Coastguard Worker 		goto failure;
204*2d543d20SAndroid Build Coastguard Worker 
205*2d543d20SAndroid Build Coastguard Worker 	if (sepol_policy_file_create(&mod)) {
206*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Out of memory\n", argv[0]);
207*2d543d20SAndroid Build Coastguard Worker 		goto failure;
208*2d543d20SAndroid Build Coastguard Worker 	}
209*2d543d20SAndroid Build Coastguard Worker 
210*2d543d20SAndroid Build Coastguard Worker 	fp = fopen(module, "re");
211*2d543d20SAndroid Build Coastguard Worker 	if (!fp) {
212*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Could not open file %s:  %s\n", argv[0],
213*2d543d20SAndroid Build Coastguard Worker 			module, strerror(errno));
214*2d543d20SAndroid Build Coastguard Worker 		goto failure;
215*2d543d20SAndroid Build Coastguard Worker 	}
216*2d543d20SAndroid Build Coastguard Worker 	sepol_policy_file_set_fp(mod, fp);
217*2d543d20SAndroid Build Coastguard Worker 
218*2d543d20SAndroid Build Coastguard Worker 	if (sepol_module_package_create(&pkg)) {
219*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Out of memory\n", argv[0]);
220*2d543d20SAndroid Build Coastguard Worker 		goto failure;
221*2d543d20SAndroid Build Coastguard Worker 	}
222*2d543d20SAndroid Build Coastguard Worker 
223*2d543d20SAndroid Build Coastguard Worker 	if (sepol_policydb_read(sepol_module_package_get_policy(pkg), mod)) {
224*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,
225*2d543d20SAndroid Build Coastguard Worker 			"%s:  Error while reading policy module from %s\n",
226*2d543d20SAndroid Build Coastguard Worker 			argv[0], module);
227*2d543d20SAndroid Build Coastguard Worker 		goto failure;
228*2d543d20SAndroid Build Coastguard Worker 	}
229*2d543d20SAndroid Build Coastguard Worker 
230*2d543d20SAndroid Build Coastguard Worker 	fclose(fp);
231*2d543d20SAndroid Build Coastguard Worker 	fp = NULL;
232*2d543d20SAndroid Build Coastguard Worker 
233*2d543d20SAndroid Build Coastguard Worker 	if (fclen && sepol_module_package_set_file_contexts(pkg, fcdata, fclen)) {
234*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Error while setting file contexts\n", argv[0]);
235*2d543d20SAndroid Build Coastguard Worker 		goto failure;
236*2d543d20SAndroid Build Coastguard Worker 	}
237*2d543d20SAndroid Build Coastguard Worker 
238*2d543d20SAndroid Build Coastguard Worker 	if (seuserslen && sepol_module_package_set_seusers(pkg, seusersdata, seuserslen)) {
239*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Error while setting seusers\n", argv[0]);
240*2d543d20SAndroid Build Coastguard Worker 		goto failure;
241*2d543d20SAndroid Build Coastguard Worker 	}
242*2d543d20SAndroid Build Coastguard Worker 
243*2d543d20SAndroid Build Coastguard Worker 	if (user_extra && sepol_module_package_set_user_extra(pkg, user_extradata, user_extralen)) {
244*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Error while setting extra users\n", argv[0]);
245*2d543d20SAndroid Build Coastguard Worker 		goto failure;
246*2d543d20SAndroid Build Coastguard Worker 	}
247*2d543d20SAndroid Build Coastguard Worker 
248*2d543d20SAndroid Build Coastguard Worker 	if (nclen && sepol_module_package_set_netfilter_contexts(pkg, ncdata, nclen)) {
249*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Error while setting netfilter contexts\n", argv[0]);
250*2d543d20SAndroid Build Coastguard Worker 		goto failure;
251*2d543d20SAndroid Build Coastguard Worker 	}
252*2d543d20SAndroid Build Coastguard Worker 
253*2d543d20SAndroid Build Coastguard Worker 	if (sepol_policy_file_create(&out)) {
254*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Out of memory\n", argv[0]);
255*2d543d20SAndroid Build Coastguard Worker 		goto failure;
256*2d543d20SAndroid Build Coastguard Worker 	}
257*2d543d20SAndroid Build Coastguard Worker 
258*2d543d20SAndroid Build Coastguard Worker 	fp = fopen(outfile, "we");
259*2d543d20SAndroid Build Coastguard Worker 	if (!fp) {
260*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Could not open file %s:  %s\n", argv[0],
261*2d543d20SAndroid Build Coastguard Worker 			outfile, strerror(errno));
262*2d543d20SAndroid Build Coastguard Worker 		goto failure;
263*2d543d20SAndroid Build Coastguard Worker 	}
264*2d543d20SAndroid Build Coastguard Worker 	sepol_policy_file_set_fp(out, fp);
265*2d543d20SAndroid Build Coastguard Worker 
266*2d543d20SAndroid Build Coastguard Worker 	if (sepol_module_package_write(pkg, out)) {
267*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr,
268*2d543d20SAndroid Build Coastguard Worker 			"%s:  Error while writing module package to %s\n",
269*2d543d20SAndroid Build Coastguard Worker 			argv[0], argv[1]);
270*2d543d20SAndroid Build Coastguard Worker 		goto failure;
271*2d543d20SAndroid Build Coastguard Worker 	}
272*2d543d20SAndroid Build Coastguard Worker 
273*2d543d20SAndroid Build Coastguard Worker 	ret = fclose(fp);
274*2d543d20SAndroid Build Coastguard Worker 	fp = NULL;
275*2d543d20SAndroid Build Coastguard Worker 	if (ret) {
276*2d543d20SAndroid Build Coastguard Worker 		fprintf(stderr, "%s:  Could not close file %s:  %s\n", argv[0],
277*2d543d20SAndroid Build Coastguard Worker 			outfile, strerror(errno));
278*2d543d20SAndroid Build Coastguard Worker 		goto failure;
279*2d543d20SAndroid Build Coastguard Worker 	}
280*2d543d20SAndroid Build Coastguard Worker 
281*2d543d20SAndroid Build Coastguard Worker 	ret = EXIT_SUCCESS;
282*2d543d20SAndroid Build Coastguard Worker 	goto cleanup;
283*2d543d20SAndroid Build Coastguard Worker 
284*2d543d20SAndroid Build Coastguard Worker failure:
285*2d543d20SAndroid Build Coastguard Worker 	ret = EXIT_FAILURE;
286*2d543d20SAndroid Build Coastguard Worker 
287*2d543d20SAndroid Build Coastguard Worker cleanup:
288*2d543d20SAndroid Build Coastguard Worker 	if (fp)
289*2d543d20SAndroid Build Coastguard Worker 		fclose(fp);
290*2d543d20SAndroid Build Coastguard Worker 	sepol_policy_file_free(out);
291*2d543d20SAndroid Build Coastguard Worker 	if (nclen)
292*2d543d20SAndroid Build Coastguard Worker 		munmap(ncdata, nclen);
293*2d543d20SAndroid Build Coastguard Worker 	if (user_extradata)
294*2d543d20SAndroid Build Coastguard Worker 		munmap(user_extradata, user_extralen);
295*2d543d20SAndroid Build Coastguard Worker 	if (seuserslen)
296*2d543d20SAndroid Build Coastguard Worker 		munmap(seusersdata, seuserslen);
297*2d543d20SAndroid Build Coastguard Worker 	if (fclen)
298*2d543d20SAndroid Build Coastguard Worker 		munmap(fcdata, fclen);
299*2d543d20SAndroid Build Coastguard Worker 	sepol_module_package_free(pkg);
300*2d543d20SAndroid Build Coastguard Worker 	sepol_policy_file_free(mod);
301*2d543d20SAndroid Build Coastguard Worker 	free(netfilter_contexts);
302*2d543d20SAndroid Build Coastguard Worker 	free(user_extra);
303*2d543d20SAndroid Build Coastguard Worker 	free(seusers);
304*2d543d20SAndroid Build Coastguard Worker 	free(outfile);
305*2d543d20SAndroid Build Coastguard Worker 	free(file_contexts);
306*2d543d20SAndroid Build Coastguard Worker 	free(module);
307*2d543d20SAndroid Build Coastguard Worker 
308*2d543d20SAndroid Build Coastguard Worker 	return ret;
309*2d543d20SAndroid Build Coastguard Worker }
310