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