xref: /aosp_15_r20/external/selinux/libsemanage/src/modules.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /* Author: Joshua Brindle <[email protected]
2*2d543d20SAndroid Build Coastguard Worker  *	   Jason Tang	  <[email protected]>
3*2d543d20SAndroid Build Coastguard Worker  *	   Caleb Case	  <[email protected]>
4*2d543d20SAndroid Build Coastguard Worker  *
5*2d543d20SAndroid Build Coastguard Worker  * Copyright (C) 2004-2005,2009 Tresys Technology, LLC
6*2d543d20SAndroid Build Coastguard Worker  *
7*2d543d20SAndroid Build Coastguard Worker  *  This library is free software; you can redistribute it and/or
8*2d543d20SAndroid Build Coastguard Worker  *  modify it under the terms of the GNU Lesser General Public
9*2d543d20SAndroid Build Coastguard Worker  *  License as published by the Free Software Foundation; either
10*2d543d20SAndroid Build Coastguard Worker  *  version 2.1 of the License, or (at your option) any later version.
11*2d543d20SAndroid Build Coastguard Worker  *
12*2d543d20SAndroid Build Coastguard Worker  *  This library is distributed in the hope that it will be useful,
13*2d543d20SAndroid Build Coastguard Worker  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14*2d543d20SAndroid Build Coastguard Worker  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15*2d543d20SAndroid Build Coastguard Worker  *  Lesser General Public License for more details.
16*2d543d20SAndroid Build Coastguard Worker  *
17*2d543d20SAndroid Build Coastguard Worker  *  You should have received a copy of the GNU Lesser General Public
18*2d543d20SAndroid Build Coastguard Worker  *  License along with this library; if not, write to the Free Software
19*2d543d20SAndroid Build Coastguard Worker  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20*2d543d20SAndroid Build Coastguard Worker  */
21*2d543d20SAndroid Build Coastguard Worker 
22*2d543d20SAndroid Build Coastguard Worker /* This file implements only the publicly-visible module functions to libsemanage. */
23*2d543d20SAndroid Build Coastguard Worker 
24*2d543d20SAndroid Build Coastguard Worker #include "direct_api.h"
25*2d543d20SAndroid Build Coastguard Worker #include "modules.h"
26*2d543d20SAndroid Build Coastguard Worker #include "semanage_conf.h"
27*2d543d20SAndroid Build Coastguard Worker #include "semanage_store.h"
28*2d543d20SAndroid Build Coastguard Worker 
29*2d543d20SAndroid Build Coastguard Worker #include <stdarg.h>
30*2d543d20SAndroid Build Coastguard Worker #include <assert.h>
31*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
32*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
33*2d543d20SAndroid Build Coastguard Worker #include <string.h>
34*2d543d20SAndroid Build Coastguard Worker #include <limits.h>
35*2d543d20SAndroid Build Coastguard Worker #include <fcntl.h>
36*2d543d20SAndroid Build Coastguard Worker #include <sys/types.h>
37*2d543d20SAndroid Build Coastguard Worker #include <sys/stat.h>
38*2d543d20SAndroid Build Coastguard Worker #include <sys/mman.h>
39*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
40*2d543d20SAndroid Build Coastguard Worker #include <ctype.h>
41*2d543d20SAndroid Build Coastguard Worker 
42*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
43*2d543d20SAndroid Build Coastguard Worker #include "modules.h"
44*2d543d20SAndroid Build Coastguard Worker #include "sha256.h"
45*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
46*2d543d20SAndroid Build Coastguard Worker 
semanage_module_install(semanage_handle_t * sh,char * module_data,size_t data_len,const char * name,const char * ext_lang)47*2d543d20SAndroid Build Coastguard Worker int semanage_module_install(semanage_handle_t * sh,
48*2d543d20SAndroid Build Coastguard Worker 			    char *module_data, size_t data_len, const char *name, const char *ext_lang)
49*2d543d20SAndroid Build Coastguard Worker {
50*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->install == NULL) {
51*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
52*2d543d20SAndroid Build Coastguard Worker 		    "No install function defined for this connection type.");
53*2d543d20SAndroid Build Coastguard Worker 		return -1;
54*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
55*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
56*2d543d20SAndroid Build Coastguard Worker 		return -1;
57*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
58*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
59*2d543d20SAndroid Build Coastguard Worker 			return -1;
60*2d543d20SAndroid Build Coastguard Worker 		}
61*2d543d20SAndroid Build Coastguard Worker 	}
62*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
63*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->install(sh, module_data, data_len, name, ext_lang);
64*2d543d20SAndroid Build Coastguard Worker }
65*2d543d20SAndroid Build Coastguard Worker 
semanage_module_install_file(semanage_handle_t * sh,const char * module_name)66*2d543d20SAndroid Build Coastguard Worker int semanage_module_install_file(semanage_handle_t * sh,
67*2d543d20SAndroid Build Coastguard Worker 				 const char *module_name) {
68*2d543d20SAndroid Build Coastguard Worker 
69*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->install_file == NULL) {
70*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
71*2d543d20SAndroid Build Coastguard Worker 		    "No install function defined for this connection type.");
72*2d543d20SAndroid Build Coastguard Worker 		return -1;
73*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
74*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
75*2d543d20SAndroid Build Coastguard Worker 		return -1;
76*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
77*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
78*2d543d20SAndroid Build Coastguard Worker 			return -1;
79*2d543d20SAndroid Build Coastguard Worker 		}
80*2d543d20SAndroid Build Coastguard Worker 	}
81*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
82*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->install_file(sh, module_name);
83*2d543d20SAndroid Build Coastguard Worker }
84*2d543d20SAndroid Build Coastguard Worker 
semanage_module_extract(semanage_handle_t * sh,semanage_module_key_t * modkey,int extract_cil,void ** mapped_data,size_t * data_len,semanage_module_info_t ** modinfo)85*2d543d20SAndroid Build Coastguard Worker int semanage_module_extract(semanage_handle_t * sh,
86*2d543d20SAndroid Build Coastguard Worker 				 semanage_module_key_t *modkey,
87*2d543d20SAndroid Build Coastguard Worker 				 int extract_cil,
88*2d543d20SAndroid Build Coastguard Worker 				 void **mapped_data,
89*2d543d20SAndroid Build Coastguard Worker 				 size_t *data_len,
90*2d543d20SAndroid Build Coastguard Worker 				 semanage_module_info_t **modinfo) {
91*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->extract == NULL) {
92*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
93*2d543d20SAndroid Build Coastguard Worker 		    "No get function defined for this connection type.");
94*2d543d20SAndroid Build Coastguard Worker 		return -1;
95*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
96*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
97*2d543d20SAndroid Build Coastguard Worker 		return -1;
98*2d543d20SAndroid Build Coastguard Worker 	}
99*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->extract(sh, modkey, extract_cil, mapped_data, data_len, modinfo);
100*2d543d20SAndroid Build Coastguard Worker }
101*2d543d20SAndroid Build Coastguard Worker 
102*2d543d20SAndroid Build Coastguard Worker /* Legacy function that remains to preserve ABI
103*2d543d20SAndroid Build Coastguard Worker  * compatibility. Please use semanage_module_install_file instead.
104*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_upgrade_file(semanage_handle_t * sh,const char * module_name)105*2d543d20SAndroid Build Coastguard Worker int semanage_module_upgrade_file(semanage_handle_t * sh,
106*2d543d20SAndroid Build Coastguard Worker 				 const char *module_name)
107*2d543d20SAndroid Build Coastguard Worker {
108*2d543d20SAndroid Build Coastguard Worker 	return semanage_module_install_file(sh, module_name);
109*2d543d20SAndroid Build Coastguard Worker }
110*2d543d20SAndroid Build Coastguard Worker 
semanage_module_remove(semanage_handle_t * sh,char * module_name)111*2d543d20SAndroid Build Coastguard Worker int semanage_module_remove(semanage_handle_t * sh, char *module_name)
112*2d543d20SAndroid Build Coastguard Worker {
113*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->remove == NULL) {
114*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "No remove function defined for this connection type.");
115*2d543d20SAndroid Build Coastguard Worker 		return -1;
116*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
117*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
118*2d543d20SAndroid Build Coastguard Worker 		return -1;
119*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
120*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
121*2d543d20SAndroid Build Coastguard Worker 			return -1;
122*2d543d20SAndroid Build Coastguard Worker 		}
123*2d543d20SAndroid Build Coastguard Worker 	}
124*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
125*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->remove(sh, module_name);
126*2d543d20SAndroid Build Coastguard Worker }
127*2d543d20SAndroid Build Coastguard Worker 
semanage_module_list(semanage_handle_t * sh,semanage_module_info_t ** modinfo,int * num_modules)128*2d543d20SAndroid Build Coastguard Worker int semanage_module_list(semanage_handle_t * sh,
129*2d543d20SAndroid Build Coastguard Worker 			 semanage_module_info_t ** modinfo, int *num_modules)
130*2d543d20SAndroid Build Coastguard Worker {
131*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->list == NULL) {
132*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "No list function defined for this connection type.");
133*2d543d20SAndroid Build Coastguard Worker 		return -1;
134*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
135*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
136*2d543d20SAndroid Build Coastguard Worker 		return -1;
137*2d543d20SAndroid Build Coastguard Worker 	}
138*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->list(sh, modinfo, num_modules);
139*2d543d20SAndroid Build Coastguard Worker }
140*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_datum_destroy(semanage_module_info_t * modinfo)141*2d543d20SAndroid Build Coastguard Worker void semanage_module_info_datum_destroy(semanage_module_info_t * modinfo)
142*2d543d20SAndroid Build Coastguard Worker {
143*2d543d20SAndroid Build Coastguard Worker 	if (modinfo != NULL) {
144*2d543d20SAndroid Build Coastguard Worker 		modinfo->priority = 0;
145*2d543d20SAndroid Build Coastguard Worker 
146*2d543d20SAndroid Build Coastguard Worker 		free(modinfo->name);
147*2d543d20SAndroid Build Coastguard Worker 		modinfo->name = NULL;
148*2d543d20SAndroid Build Coastguard Worker 
149*2d543d20SAndroid Build Coastguard Worker 		free(modinfo->lang_ext);
150*2d543d20SAndroid Build Coastguard Worker 		modinfo->lang_ext = NULL;
151*2d543d20SAndroid Build Coastguard Worker 
152*2d543d20SAndroid Build Coastguard Worker 		modinfo->enabled = -1;
153*2d543d20SAndroid Build Coastguard Worker 	}
154*2d543d20SAndroid Build Coastguard Worker }
155*2d543d20SAndroid Build Coastguard Worker 
156*2d543d20SAndroid Build Coastguard Worker 
semanage_module_list_nth(semanage_module_info_t * list,int n)157*2d543d20SAndroid Build Coastguard Worker semanage_module_info_t *semanage_module_list_nth(semanage_module_info_t * list,
158*2d543d20SAndroid Build Coastguard Worker 						 int n)
159*2d543d20SAndroid Build Coastguard Worker {
160*2d543d20SAndroid Build Coastguard Worker 	return list + n;
161*2d543d20SAndroid Build Coastguard Worker }
162*2d543d20SAndroid Build Coastguard Worker 
163*2d543d20SAndroid Build Coastguard Worker 
semanage_module_get_name(semanage_module_info_t * modinfo)164*2d543d20SAndroid Build Coastguard Worker const char *semanage_module_get_name(semanage_module_info_t * modinfo)
165*2d543d20SAndroid Build Coastguard Worker {
166*2d543d20SAndroid Build Coastguard Worker 	return modinfo->name;
167*2d543d20SAndroid Build Coastguard Worker }
168*2d543d20SAndroid Build Coastguard Worker 
169*2d543d20SAndroid Build Coastguard Worker 
170*2d543d20SAndroid Build Coastguard Worker /* Legacy function that remains to preserve ABI
171*2d543d20SAndroid Build Coastguard Worker  * compatibility.
172*2d543d20SAndroid Build Coastguard Worker  */
173*2d543d20SAndroid Build Coastguard Worker extern const char *semanage_module_get_version(semanage_module_info_t *);
semanage_module_get_version(semanage_module_info_t * modinfo)174*2d543d20SAndroid Build Coastguard Worker const char *semanage_module_get_version(semanage_module_info_t * modinfo
175*2d543d20SAndroid Build Coastguard Worker 				__attribute__ ((unused)))
176*2d543d20SAndroid Build Coastguard Worker {
177*2d543d20SAndroid Build Coastguard Worker 	return "";
178*2d543d20SAndroid Build Coastguard Worker }
179*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_create(semanage_handle_t * sh,semanage_module_info_t ** modinfo)180*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_create(semanage_handle_t *sh,
181*2d543d20SAndroid Build Coastguard Worker 				semanage_module_info_t **modinfo)
182*2d543d20SAndroid Build Coastguard Worker {
183*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
184*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
185*2d543d20SAndroid Build Coastguard Worker 
186*2d543d20SAndroid Build Coastguard Worker 	*modinfo = malloc(sizeof(semanage_module_info_t));
187*2d543d20SAndroid Build Coastguard Worker 	if (*modinfo == NULL) return -1;
188*2d543d20SAndroid Build Coastguard Worker 
189*2d543d20SAndroid Build Coastguard Worker 	return semanage_module_info_init(sh, *modinfo);
190*2d543d20SAndroid Build Coastguard Worker }
191*2d543d20SAndroid Build Coastguard Worker 
192*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_destroy(semanage_handle_t * sh,semanage_module_info_t * modinfo)193*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_destroy(semanage_handle_t *sh,
194*2d543d20SAndroid Build Coastguard Worker 				 semanage_module_info_t *modinfo)
195*2d543d20SAndroid Build Coastguard Worker {
196*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
197*2d543d20SAndroid Build Coastguard Worker 
198*2d543d20SAndroid Build Coastguard Worker 	if (!modinfo) {
199*2d543d20SAndroid Build Coastguard Worker 		return 0;
200*2d543d20SAndroid Build Coastguard Worker 	}
201*2d543d20SAndroid Build Coastguard Worker 
202*2d543d20SAndroid Build Coastguard Worker 	free(modinfo->name);
203*2d543d20SAndroid Build Coastguard Worker 	free(modinfo->lang_ext);
204*2d543d20SAndroid Build Coastguard Worker 
205*2d543d20SAndroid Build Coastguard Worker 	return semanage_module_info_init(sh, modinfo);
206*2d543d20SAndroid Build Coastguard Worker }
207*2d543d20SAndroid Build Coastguard Worker 
208*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_init(semanage_handle_t * sh,semanage_module_info_t * modinfo)209*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_init(semanage_handle_t *sh,
210*2d543d20SAndroid Build Coastguard Worker 			      semanage_module_info_t *modinfo)
211*2d543d20SAndroid Build Coastguard Worker {
212*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
213*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
214*2d543d20SAndroid Build Coastguard Worker 
215*2d543d20SAndroid Build Coastguard Worker 	modinfo->priority = 0;
216*2d543d20SAndroid Build Coastguard Worker 	modinfo->name = NULL;
217*2d543d20SAndroid Build Coastguard Worker 	modinfo->lang_ext = NULL;
218*2d543d20SAndroid Build Coastguard Worker 	modinfo->enabled = -1;
219*2d543d20SAndroid Build Coastguard Worker 
220*2d543d20SAndroid Build Coastguard Worker 	return 0;
221*2d543d20SAndroid Build Coastguard Worker }
222*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_clone(semanage_handle_t * sh,const semanage_module_info_t * source,semanage_module_info_t * target)223*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_clone(semanage_handle_t *sh,
224*2d543d20SAndroid Build Coastguard Worker 			       const semanage_module_info_t *source,
225*2d543d20SAndroid Build Coastguard Worker 			       semanage_module_info_t *target)
226*2d543d20SAndroid Build Coastguard Worker {
227*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
228*2d543d20SAndroid Build Coastguard Worker 	assert(source);
229*2d543d20SAndroid Build Coastguard Worker 	assert(target);
230*2d543d20SAndroid Build Coastguard Worker 
231*2d543d20SAndroid Build Coastguard Worker 	int status = 0;
232*2d543d20SAndroid Build Coastguard Worker 	int ret = 0;
233*2d543d20SAndroid Build Coastguard Worker 
234*2d543d20SAndroid Build Coastguard Worker 	ret = semanage_module_info_destroy(sh, target);
235*2d543d20SAndroid Build Coastguard Worker 	if (ret != 0) {
236*2d543d20SAndroid Build Coastguard Worker 		status = -1;
237*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
238*2d543d20SAndroid Build Coastguard Worker 	}
239*2d543d20SAndroid Build Coastguard Worker 
240*2d543d20SAndroid Build Coastguard Worker 	ret = semanage_module_info_set_priority(sh, target, source->priority);
241*2d543d20SAndroid Build Coastguard Worker 	if (ret != 0) {
242*2d543d20SAndroid Build Coastguard Worker 		status = -1;
243*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
244*2d543d20SAndroid Build Coastguard Worker 	}
245*2d543d20SAndroid Build Coastguard Worker 
246*2d543d20SAndroid Build Coastguard Worker 	ret = semanage_module_info_set_name(sh, target, source->name);
247*2d543d20SAndroid Build Coastguard Worker 	if (ret != 0) {
248*2d543d20SAndroid Build Coastguard Worker 		status = -1;
249*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
250*2d543d20SAndroid Build Coastguard Worker 	}
251*2d543d20SAndroid Build Coastguard Worker 
252*2d543d20SAndroid Build Coastguard Worker 	ret = semanage_module_info_set_lang_ext(sh, target, source->lang_ext);
253*2d543d20SAndroid Build Coastguard Worker 	if (ret != 0) {
254*2d543d20SAndroid Build Coastguard Worker 		status = -1;
255*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
256*2d543d20SAndroid Build Coastguard Worker 	}
257*2d543d20SAndroid Build Coastguard Worker 
258*2d543d20SAndroid Build Coastguard Worker 	ret = semanage_module_info_set_enabled(sh, target, source->enabled);
259*2d543d20SAndroid Build Coastguard Worker 	if (ret != 0) {
260*2d543d20SAndroid Build Coastguard Worker 		status = -1;
261*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
262*2d543d20SAndroid Build Coastguard Worker 	}
263*2d543d20SAndroid Build Coastguard Worker 
264*2d543d20SAndroid Build Coastguard Worker cleanup:
265*2d543d20SAndroid Build Coastguard Worker 	if (status != 0) semanage_module_info_destroy(sh, target);
266*2d543d20SAndroid Build Coastguard Worker 	return status;
267*2d543d20SAndroid Build Coastguard Worker }
268*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_get_priority(semanage_handle_t * sh,semanage_module_info_t * modinfo,uint16_t * priority)269*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_get_priority(semanage_handle_t *sh,
270*2d543d20SAndroid Build Coastguard Worker 				      semanage_module_info_t *modinfo,
271*2d543d20SAndroid Build Coastguard Worker 				      uint16_t *priority)
272*2d543d20SAndroid Build Coastguard Worker {
273*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
274*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
275*2d543d20SAndroid Build Coastguard Worker 	assert(priority);
276*2d543d20SAndroid Build Coastguard Worker 
277*2d543d20SAndroid Build Coastguard Worker 	*priority = modinfo->priority;
278*2d543d20SAndroid Build Coastguard Worker 
279*2d543d20SAndroid Build Coastguard Worker 	return 0;
280*2d543d20SAndroid Build Coastguard Worker }
281*2d543d20SAndroid Build Coastguard Worker 
282*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_get_name(semanage_handle_t * sh,semanage_module_info_t * modinfo,const char ** name)283*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_get_name(semanage_handle_t *sh,
284*2d543d20SAndroid Build Coastguard Worker 				  semanage_module_info_t *modinfo,
285*2d543d20SAndroid Build Coastguard Worker 				  const char **name)
286*2d543d20SAndroid Build Coastguard Worker {
287*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
288*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
289*2d543d20SAndroid Build Coastguard Worker 	assert(name);
290*2d543d20SAndroid Build Coastguard Worker 
291*2d543d20SAndroid Build Coastguard Worker 	*name = modinfo->name;
292*2d543d20SAndroid Build Coastguard Worker 
293*2d543d20SAndroid Build Coastguard Worker 	return 0;
294*2d543d20SAndroid Build Coastguard Worker }
295*2d543d20SAndroid Build Coastguard Worker 
296*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_get_lang_ext(semanage_handle_t * sh,semanage_module_info_t * modinfo,const char ** lang_ext)297*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_get_lang_ext(semanage_handle_t *sh,
298*2d543d20SAndroid Build Coastguard Worker 				      semanage_module_info_t *modinfo,
299*2d543d20SAndroid Build Coastguard Worker 				      const char **lang_ext)
300*2d543d20SAndroid Build Coastguard Worker {
301*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
302*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
303*2d543d20SAndroid Build Coastguard Worker 	assert(lang_ext);
304*2d543d20SAndroid Build Coastguard Worker 
305*2d543d20SAndroid Build Coastguard Worker 	*lang_ext = modinfo->lang_ext;
306*2d543d20SAndroid Build Coastguard Worker 
307*2d543d20SAndroid Build Coastguard Worker 	return 0;
308*2d543d20SAndroid Build Coastguard Worker }
309*2d543d20SAndroid Build Coastguard Worker 
310*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_get_enabled(semanage_handle_t * sh,semanage_module_info_t * modinfo,int * enabled)311*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_get_enabled(semanage_handle_t *sh,
312*2d543d20SAndroid Build Coastguard Worker 				     semanage_module_info_t *modinfo,
313*2d543d20SAndroid Build Coastguard Worker 				     int *enabled)
314*2d543d20SAndroid Build Coastguard Worker {
315*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
316*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
317*2d543d20SAndroid Build Coastguard Worker 	assert(enabled);
318*2d543d20SAndroid Build Coastguard Worker 
319*2d543d20SAndroid Build Coastguard Worker 	*enabled = modinfo->enabled;
320*2d543d20SAndroid Build Coastguard Worker 
321*2d543d20SAndroid Build Coastguard Worker 	return 0;
322*2d543d20SAndroid Build Coastguard Worker }
323*2d543d20SAndroid Build Coastguard Worker 
324*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_set_priority(semanage_handle_t * sh,semanage_module_info_t * modinfo,uint16_t priority)325*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_set_priority(semanage_handle_t *sh,
326*2d543d20SAndroid Build Coastguard Worker 				      semanage_module_info_t *modinfo,
327*2d543d20SAndroid Build Coastguard Worker 				      uint16_t priority)
328*2d543d20SAndroid Build Coastguard Worker {
329*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
330*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
331*2d543d20SAndroid Build Coastguard Worker 
332*2d543d20SAndroid Build Coastguard Worker 	/* Verify priority */
333*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_priority(priority) < 0) {
334*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
335*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Priority %d is invalid.", priority);
336*2d543d20SAndroid Build Coastguard Worker 		return -1;
337*2d543d20SAndroid Build Coastguard Worker 	}
338*2d543d20SAndroid Build Coastguard Worker 
339*2d543d20SAndroid Build Coastguard Worker 	modinfo->priority = priority;
340*2d543d20SAndroid Build Coastguard Worker 
341*2d543d20SAndroid Build Coastguard Worker 	return 0;
342*2d543d20SAndroid Build Coastguard Worker }
343*2d543d20SAndroid Build Coastguard Worker 
344*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_set_name(semanage_handle_t * sh,semanage_module_info_t * modinfo,const char * name)345*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_set_name(semanage_handle_t *sh,
346*2d543d20SAndroid Build Coastguard Worker 				  semanage_module_info_t *modinfo,
347*2d543d20SAndroid Build Coastguard Worker 				  const char *name)
348*2d543d20SAndroid Build Coastguard Worker {
349*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
350*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
351*2d543d20SAndroid Build Coastguard Worker 	assert(name);
352*2d543d20SAndroid Build Coastguard Worker 
353*2d543d20SAndroid Build Coastguard Worker 	char * tmp;
354*2d543d20SAndroid Build Coastguard Worker 
355*2d543d20SAndroid Build Coastguard Worker 	/* Verify name */
356*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_name(name) < 0) {
357*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
358*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Name %s is invalid.", name);
359*2d543d20SAndroid Build Coastguard Worker 		return -1;
360*2d543d20SAndroid Build Coastguard Worker 	}
361*2d543d20SAndroid Build Coastguard Worker 
362*2d543d20SAndroid Build Coastguard Worker 	tmp = strdup(name);
363*2d543d20SAndroid Build Coastguard Worker 	if (!tmp) {
364*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "No memory available for strdup");
365*2d543d20SAndroid Build Coastguard Worker 		return -1;
366*2d543d20SAndroid Build Coastguard Worker 	}
367*2d543d20SAndroid Build Coastguard Worker 
368*2d543d20SAndroid Build Coastguard Worker 	free(modinfo->name);
369*2d543d20SAndroid Build Coastguard Worker 	modinfo->name = tmp;
370*2d543d20SAndroid Build Coastguard Worker 
371*2d543d20SAndroid Build Coastguard Worker 	return 0;
372*2d543d20SAndroid Build Coastguard Worker }
373*2d543d20SAndroid Build Coastguard Worker 
374*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_set_lang_ext(semanage_handle_t * sh,semanage_module_info_t * modinfo,const char * lang_ext)375*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_set_lang_ext(semanage_handle_t *sh,
376*2d543d20SAndroid Build Coastguard Worker 				      semanage_module_info_t *modinfo,
377*2d543d20SAndroid Build Coastguard Worker 				      const char *lang_ext)
378*2d543d20SAndroid Build Coastguard Worker {
379*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
380*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
381*2d543d20SAndroid Build Coastguard Worker 	assert(lang_ext);
382*2d543d20SAndroid Build Coastguard Worker 
383*2d543d20SAndroid Build Coastguard Worker 	char * tmp;
384*2d543d20SAndroid Build Coastguard Worker 
385*2d543d20SAndroid Build Coastguard Worker 	/* Verify extension */
386*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_lang_ext(lang_ext) < 0) {
387*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
388*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Language extensions %s is invalid.", lang_ext);
389*2d543d20SAndroid Build Coastguard Worker 		return -1;
390*2d543d20SAndroid Build Coastguard Worker 	}
391*2d543d20SAndroid Build Coastguard Worker 
392*2d543d20SAndroid Build Coastguard Worker 	tmp = strdup(lang_ext);
393*2d543d20SAndroid Build Coastguard Worker 	if (!tmp) {
394*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "No memory available for strdup");
395*2d543d20SAndroid Build Coastguard Worker 		return -1;
396*2d543d20SAndroid Build Coastguard Worker 	}
397*2d543d20SAndroid Build Coastguard Worker 
398*2d543d20SAndroid Build Coastguard Worker 	free(modinfo->lang_ext);
399*2d543d20SAndroid Build Coastguard Worker 	modinfo->lang_ext = tmp;
400*2d543d20SAndroid Build Coastguard Worker 
401*2d543d20SAndroid Build Coastguard Worker 	return 0;
402*2d543d20SAndroid Build Coastguard Worker }
403*2d543d20SAndroid Build Coastguard Worker 
404*2d543d20SAndroid Build Coastguard Worker 
semanage_module_info_set_enabled(semanage_handle_t * sh,semanage_module_info_t * modinfo,int enabled)405*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_set_enabled(semanage_handle_t *sh,
406*2d543d20SAndroid Build Coastguard Worker 				     semanage_module_info_t *modinfo,
407*2d543d20SAndroid Build Coastguard Worker 				     int enabled)
408*2d543d20SAndroid Build Coastguard Worker {
409*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
410*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
411*2d543d20SAndroid Build Coastguard Worker 
412*2d543d20SAndroid Build Coastguard Worker 	/* Verify enabled */
413*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_enabled(enabled) < 0) {
414*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
415*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Enabled status %d is invalid.", enabled);
416*2d543d20SAndroid Build Coastguard Worker 		return -1;
417*2d543d20SAndroid Build Coastguard Worker 	}
418*2d543d20SAndroid Build Coastguard Worker 
419*2d543d20SAndroid Build Coastguard Worker 	modinfo->enabled = enabled;
420*2d543d20SAndroid Build Coastguard Worker 
421*2d543d20SAndroid Build Coastguard Worker 	return 0;
422*2d543d20SAndroid Build Coastguard Worker }
423*2d543d20SAndroid Build Coastguard Worker 
424*2d543d20SAndroid Build Coastguard Worker 
semanage_module_get_path(semanage_handle_t * sh,const semanage_module_info_t * modinfo,enum semanage_module_path_type type,char * path,size_t len)425*2d543d20SAndroid Build Coastguard Worker int semanage_module_get_path(semanage_handle_t *sh,
426*2d543d20SAndroid Build Coastguard Worker 			     const semanage_module_info_t *modinfo,
427*2d543d20SAndroid Build Coastguard Worker 			     enum semanage_module_path_type type,
428*2d543d20SAndroid Build Coastguard Worker 			     char *path,
429*2d543d20SAndroid Build Coastguard Worker 			     size_t len)
430*2d543d20SAndroid Build Coastguard Worker {
431*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
432*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
433*2d543d20SAndroid Build Coastguard Worker 	assert(path);
434*2d543d20SAndroid Build Coastguard Worker 
435*2d543d20SAndroid Build Coastguard Worker 	int status = 0;
436*2d543d20SAndroid Build Coastguard Worker 	int ret = 0;
437*2d543d20SAndroid Build Coastguard Worker 
438*2d543d20SAndroid Build Coastguard Worker 	const char *modules_path = NULL;
439*2d543d20SAndroid Build Coastguard Worker 	const char *file = NULL;
440*2d543d20SAndroid Build Coastguard Worker 
441*2d543d20SAndroid Build Coastguard Worker 	modules_path = sh->is_in_transaction ?
442*2d543d20SAndroid Build Coastguard Worker 		semanage_path(SEMANAGE_TMP, SEMANAGE_MODULES):
443*2d543d20SAndroid Build Coastguard Worker 		semanage_path(SEMANAGE_ACTIVE, SEMANAGE_MODULES);
444*2d543d20SAndroid Build Coastguard Worker 
445*2d543d20SAndroid Build Coastguard Worker 	switch (type) {
446*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_PRIORITY:
447*2d543d20SAndroid Build Coastguard Worker 			/* verify priority */
448*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_priority(modinfo->priority);
449*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
450*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
451*2d543d20SAndroid Build Coastguard Worker 				ERR(sh,
452*2d543d20SAndroid Build Coastguard Worker 				    "Priority %d is invalid.",
453*2d543d20SAndroid Build Coastguard Worker 				    modinfo->priority);
454*2d543d20SAndroid Build Coastguard Worker 				status = ret;
455*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
456*2d543d20SAndroid Build Coastguard Worker 			}
457*2d543d20SAndroid Build Coastguard Worker 
458*2d543d20SAndroid Build Coastguard Worker 			ret = snprintf(path,
459*2d543d20SAndroid Build Coastguard Worker 				       len,
460*2d543d20SAndroid Build Coastguard Worker 				       "%s/%03u",
461*2d543d20SAndroid Build Coastguard Worker 				       modules_path,
462*2d543d20SAndroid Build Coastguard Worker 				       modinfo->priority);
463*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0 || (size_t)ret >= len) {
464*2d543d20SAndroid Build Coastguard Worker 				ERR(sh, "Unable to compose priority path.");
465*2d543d20SAndroid Build Coastguard Worker 				status = -1;
466*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
467*2d543d20SAndroid Build Coastguard Worker 			}
468*2d543d20SAndroid Build Coastguard Worker 			break;
469*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_NAME:
470*2d543d20SAndroid Build Coastguard Worker 			/* verify priority and name */
471*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_priority(modinfo->priority);
472*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
473*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
474*2d543d20SAndroid Build Coastguard Worker 				ERR(sh,
475*2d543d20SAndroid Build Coastguard Worker 				    "Priority %d is invalid.",
476*2d543d20SAndroid Build Coastguard Worker 				    modinfo->priority);
477*2d543d20SAndroid Build Coastguard Worker 				status = -1;
478*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
479*2d543d20SAndroid Build Coastguard Worker 			}
480*2d543d20SAndroid Build Coastguard Worker 
481*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_name(modinfo->name);
482*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
483*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
484*2d543d20SAndroid Build Coastguard Worker 				ERR(sh, "Name %s is invalid.", modinfo->name);
485*2d543d20SAndroid Build Coastguard Worker 				status = -1;
486*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
487*2d543d20SAndroid Build Coastguard Worker 			}
488*2d543d20SAndroid Build Coastguard Worker 
489*2d543d20SAndroid Build Coastguard Worker 			ret = snprintf(path,
490*2d543d20SAndroid Build Coastguard Worker 				       len,
491*2d543d20SAndroid Build Coastguard Worker 				       "%s/%03u/%s",
492*2d543d20SAndroid Build Coastguard Worker 				       modules_path,
493*2d543d20SAndroid Build Coastguard Worker 				       modinfo->priority,
494*2d543d20SAndroid Build Coastguard Worker 				       modinfo->name);
495*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0 || (size_t)ret >= len) {
496*2d543d20SAndroid Build Coastguard Worker 				ERR(sh, "Unable to compose name path.");
497*2d543d20SAndroid Build Coastguard Worker 				status = -1;
498*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
499*2d543d20SAndroid Build Coastguard Worker 			}
500*2d543d20SAndroid Build Coastguard Worker 			break;
501*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_HLL:
502*2d543d20SAndroid Build Coastguard Worker 			if (file == NULL) file = "hll";
503*2d543d20SAndroid Build Coastguard Worker 			/* FALLTHRU */
504*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_CIL:
505*2d543d20SAndroid Build Coastguard Worker 			if (file == NULL) file = "cil";
506*2d543d20SAndroid Build Coastguard Worker 			/* FALLTHRU */
507*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_LANG_EXT:
508*2d543d20SAndroid Build Coastguard Worker 			if (file == NULL) file = "lang_ext";
509*2d543d20SAndroid Build Coastguard Worker 
510*2d543d20SAndroid Build Coastguard Worker 			/* verify priority and name */
511*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_priority(modinfo->priority);
512*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
513*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
514*2d543d20SAndroid Build Coastguard Worker 				ERR(sh,
515*2d543d20SAndroid Build Coastguard Worker 				    "Priority %d is invalid.",
516*2d543d20SAndroid Build Coastguard Worker 				    modinfo->priority);
517*2d543d20SAndroid Build Coastguard Worker 				status = -1;
518*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
519*2d543d20SAndroid Build Coastguard Worker 			}
520*2d543d20SAndroid Build Coastguard Worker 
521*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_name(modinfo->name);
522*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
523*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
524*2d543d20SAndroid Build Coastguard Worker 				ERR(sh, "Name %s is invalid.", modinfo->name);
525*2d543d20SAndroid Build Coastguard Worker 				status = -1;
526*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
527*2d543d20SAndroid Build Coastguard Worker 			}
528*2d543d20SAndroid Build Coastguard Worker 
529*2d543d20SAndroid Build Coastguard Worker 			ret = snprintf(path,
530*2d543d20SAndroid Build Coastguard Worker 				       len,
531*2d543d20SAndroid Build Coastguard Worker 				       "%s/%03u/%s/%s",
532*2d543d20SAndroid Build Coastguard Worker 				       modules_path,
533*2d543d20SAndroid Build Coastguard Worker 				       modinfo->priority,
534*2d543d20SAndroid Build Coastguard Worker 				       modinfo->name,
535*2d543d20SAndroid Build Coastguard Worker 				       file);
536*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0 || (size_t)ret >= len) {
537*2d543d20SAndroid Build Coastguard Worker 				ERR(sh,
538*2d543d20SAndroid Build Coastguard Worker 				    "Unable to compose path for %s file.",
539*2d543d20SAndroid Build Coastguard Worker 				    file);
540*2d543d20SAndroid Build Coastguard Worker 				status = -1;
541*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
542*2d543d20SAndroid Build Coastguard Worker 			}
543*2d543d20SAndroid Build Coastguard Worker 			break;
544*2d543d20SAndroid Build Coastguard Worker 		case SEMANAGE_MODULE_PATH_DISABLED:
545*2d543d20SAndroid Build Coastguard Worker 			/* verify name */
546*2d543d20SAndroid Build Coastguard Worker 			ret = semanage_module_validate_name(modinfo->name);
547*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0) {
548*2d543d20SAndroid Build Coastguard Worker 				errno = 0;
549*2d543d20SAndroid Build Coastguard Worker 				ERR(sh, "Name %s is invalid.", modinfo->name);
550*2d543d20SAndroid Build Coastguard Worker 				status = -1;
551*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
552*2d543d20SAndroid Build Coastguard Worker 			}
553*2d543d20SAndroid Build Coastguard Worker 
554*2d543d20SAndroid Build Coastguard Worker 			ret = snprintf(path,
555*2d543d20SAndroid Build Coastguard Worker 				       len,
556*2d543d20SAndroid Build Coastguard Worker 				       "%s/disabled/%s",
557*2d543d20SAndroid Build Coastguard Worker 				       modules_path,
558*2d543d20SAndroid Build Coastguard Worker 				       modinfo->name);
559*2d543d20SAndroid Build Coastguard Worker 			if (ret < 0 || (size_t)ret >= len) {
560*2d543d20SAndroid Build Coastguard Worker 				ERR(sh,
561*2d543d20SAndroid Build Coastguard Worker 				    "Unable to compose disabled status path.");
562*2d543d20SAndroid Build Coastguard Worker 				status = -1;
563*2d543d20SAndroid Build Coastguard Worker 				goto cleanup;
564*2d543d20SAndroid Build Coastguard Worker 			}
565*2d543d20SAndroid Build Coastguard Worker 			break;
566*2d543d20SAndroid Build Coastguard Worker 		default:
567*2d543d20SAndroid Build Coastguard Worker 			ERR(sh, "Invalid module path type %d.", type);
568*2d543d20SAndroid Build Coastguard Worker 			status = -1;
569*2d543d20SAndroid Build Coastguard Worker 			goto cleanup;
570*2d543d20SAndroid Build Coastguard Worker 	}
571*2d543d20SAndroid Build Coastguard Worker 
572*2d543d20SAndroid Build Coastguard Worker cleanup:
573*2d543d20SAndroid Build Coastguard Worker 	return status;
574*2d543d20SAndroid Build Coastguard Worker }
575*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_create(semanage_handle_t * sh,semanage_module_key_t ** modkey)576*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_create(semanage_handle_t *sh,
577*2d543d20SAndroid Build Coastguard Worker 			       semanage_module_key_t **modkey)
578*2d543d20SAndroid Build Coastguard Worker {
579*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
580*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
581*2d543d20SAndroid Build Coastguard Worker 
582*2d543d20SAndroid Build Coastguard Worker 	*modkey = malloc(sizeof(semanage_module_key_t));
583*2d543d20SAndroid Build Coastguard Worker 	if (*modkey == NULL) return -1;
584*2d543d20SAndroid Build Coastguard Worker 
585*2d543d20SAndroid Build Coastguard Worker 	return semanage_module_key_init(sh, *modkey);
586*2d543d20SAndroid Build Coastguard Worker }
587*2d543d20SAndroid Build Coastguard Worker 
588*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_destroy(semanage_handle_t * sh,semanage_module_key_t * modkey)589*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_destroy(semanage_handle_t *sh,
590*2d543d20SAndroid Build Coastguard Worker 				semanage_module_key_t *modkey)
591*2d543d20SAndroid Build Coastguard Worker {
592*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
593*2d543d20SAndroid Build Coastguard Worker 
594*2d543d20SAndroid Build Coastguard Worker 	if (!modkey) {
595*2d543d20SAndroid Build Coastguard Worker 		return 0;
596*2d543d20SAndroid Build Coastguard Worker 	}
597*2d543d20SAndroid Build Coastguard Worker 
598*2d543d20SAndroid Build Coastguard Worker 	free(modkey->name);
599*2d543d20SAndroid Build Coastguard Worker 
600*2d543d20SAndroid Build Coastguard Worker 	return semanage_module_key_init(sh, modkey);
601*2d543d20SAndroid Build Coastguard Worker }
602*2d543d20SAndroid Build Coastguard Worker 
603*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_init(semanage_handle_t * sh,semanage_module_key_t * modkey)604*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_init(semanage_handle_t *sh,
605*2d543d20SAndroid Build Coastguard Worker 			     semanage_module_key_t *modkey)
606*2d543d20SAndroid Build Coastguard Worker {
607*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
608*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
609*2d543d20SAndroid Build Coastguard Worker 
610*2d543d20SAndroid Build Coastguard Worker 	modkey->name = NULL;
611*2d543d20SAndroid Build Coastguard Worker 	modkey->priority = 0;
612*2d543d20SAndroid Build Coastguard Worker 
613*2d543d20SAndroid Build Coastguard Worker 	return 0;
614*2d543d20SAndroid Build Coastguard Worker }
615*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_get_name(semanage_handle_t * sh,semanage_module_key_t * modkey,const char ** name)616*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_get_name(semanage_handle_t *sh,
617*2d543d20SAndroid Build Coastguard Worker 				 semanage_module_key_t *modkey,
618*2d543d20SAndroid Build Coastguard Worker 				 const char **name)
619*2d543d20SAndroid Build Coastguard Worker {
620*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
621*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
622*2d543d20SAndroid Build Coastguard Worker 	assert(name);
623*2d543d20SAndroid Build Coastguard Worker 
624*2d543d20SAndroid Build Coastguard Worker 	*name = modkey->name;
625*2d543d20SAndroid Build Coastguard Worker 
626*2d543d20SAndroid Build Coastguard Worker 	return 0;
627*2d543d20SAndroid Build Coastguard Worker }
628*2d543d20SAndroid Build Coastguard Worker 
629*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_get_priority(semanage_handle_t * sh,semanage_module_key_t * modkey,uint16_t * priority)630*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_get_priority(semanage_handle_t *sh,
631*2d543d20SAndroid Build Coastguard Worker 				     semanage_module_key_t *modkey,
632*2d543d20SAndroid Build Coastguard Worker 				     uint16_t *priority)
633*2d543d20SAndroid Build Coastguard Worker {
634*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
635*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
636*2d543d20SAndroid Build Coastguard Worker 	assert(priority);
637*2d543d20SAndroid Build Coastguard Worker 
638*2d543d20SAndroid Build Coastguard Worker 	*priority = modkey->priority;
639*2d543d20SAndroid Build Coastguard Worker 
640*2d543d20SAndroid Build Coastguard Worker 	return 0;
641*2d543d20SAndroid Build Coastguard Worker }
642*2d543d20SAndroid Build Coastguard Worker 
643*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_set_name(semanage_handle_t * sh,semanage_module_key_t * modkey,const char * name)644*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_set_name(semanage_handle_t *sh,
645*2d543d20SAndroid Build Coastguard Worker 				 semanage_module_key_t *modkey,
646*2d543d20SAndroid Build Coastguard Worker 				 const char *name)
647*2d543d20SAndroid Build Coastguard Worker {
648*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
649*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
650*2d543d20SAndroid Build Coastguard Worker 	assert(name);
651*2d543d20SAndroid Build Coastguard Worker 
652*2d543d20SAndroid Build Coastguard Worker 	int status = 0;
653*2d543d20SAndroid Build Coastguard Worker 	char *tmp = NULL;
654*2d543d20SAndroid Build Coastguard Worker 
655*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_name(name) < 0) {
656*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
657*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Name %s is invalid.", name);
658*2d543d20SAndroid Build Coastguard Worker 		return -1;
659*2d543d20SAndroid Build Coastguard Worker 	}
660*2d543d20SAndroid Build Coastguard Worker 
661*2d543d20SAndroid Build Coastguard Worker 	tmp = strdup(name);
662*2d543d20SAndroid Build Coastguard Worker 	if (tmp == NULL) {
663*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "No memory available for strdup");
664*2d543d20SAndroid Build Coastguard Worker 		status = -1;
665*2d543d20SAndroid Build Coastguard Worker 		goto cleanup;
666*2d543d20SAndroid Build Coastguard Worker 	}
667*2d543d20SAndroid Build Coastguard Worker 
668*2d543d20SAndroid Build Coastguard Worker 	free(modkey->name);
669*2d543d20SAndroid Build Coastguard Worker 	modkey->name = tmp;
670*2d543d20SAndroid Build Coastguard Worker 
671*2d543d20SAndroid Build Coastguard Worker cleanup:
672*2d543d20SAndroid Build Coastguard Worker 	return status;
673*2d543d20SAndroid Build Coastguard Worker }
674*2d543d20SAndroid Build Coastguard Worker 
675*2d543d20SAndroid Build Coastguard Worker 
semanage_module_key_set_priority(semanage_handle_t * sh,semanage_module_key_t * modkey,uint16_t priority)676*2d543d20SAndroid Build Coastguard Worker int semanage_module_key_set_priority(semanage_handle_t *sh,
677*2d543d20SAndroid Build Coastguard Worker 				     semanage_module_key_t *modkey,
678*2d543d20SAndroid Build Coastguard Worker 				     uint16_t priority)
679*2d543d20SAndroid Build Coastguard Worker {
680*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
681*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
682*2d543d20SAndroid Build Coastguard Worker 
683*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_priority(priority) < 0) {
684*2d543d20SAndroid Build Coastguard Worker 		errno = 0;
685*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Priority %d is invalid.", priority);
686*2d543d20SAndroid Build Coastguard Worker 		return -1;
687*2d543d20SAndroid Build Coastguard Worker 	}
688*2d543d20SAndroid Build Coastguard Worker 
689*2d543d20SAndroid Build Coastguard Worker 	modkey->priority = priority;
690*2d543d20SAndroid Build Coastguard Worker 
691*2d543d20SAndroid Build Coastguard Worker 	return 0;
692*2d543d20SAndroid Build Coastguard Worker }
693*2d543d20SAndroid Build Coastguard Worker 
694*2d543d20SAndroid Build Coastguard Worker 
semanage_module_get_enabled(semanage_handle_t * sh,const semanage_module_key_t * modkey,int * enabled)695*2d543d20SAndroid Build Coastguard Worker int semanage_module_get_enabled(semanage_handle_t *sh,
696*2d543d20SAndroid Build Coastguard Worker 				const semanage_module_key_t *modkey,
697*2d543d20SAndroid Build Coastguard Worker 				int *enabled)
698*2d543d20SAndroid Build Coastguard Worker {
699*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
700*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
701*2d543d20SAndroid Build Coastguard Worker 	assert(enabled);
702*2d543d20SAndroid Build Coastguard Worker 
703*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->get_enabled == NULL) {
704*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
705*2d543d20SAndroid Build Coastguard Worker 		    "No get_enabled function defined for this connection type.");
706*2d543d20SAndroid Build Coastguard Worker 		return -1;
707*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
708*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
709*2d543d20SAndroid Build Coastguard Worker 		return -1;
710*2d543d20SAndroid Build Coastguard Worker 	}
711*2d543d20SAndroid Build Coastguard Worker 
712*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->get_enabled(sh, modkey, enabled);
713*2d543d20SAndroid Build Coastguard Worker }
714*2d543d20SAndroid Build Coastguard Worker 
semanage_module_set_enabled(semanage_handle_t * sh,const semanage_module_key_t * modkey,int enabled)715*2d543d20SAndroid Build Coastguard Worker int semanage_module_set_enabled(semanage_handle_t *sh,
716*2d543d20SAndroid Build Coastguard Worker 				const semanage_module_key_t *modkey,
717*2d543d20SAndroid Build Coastguard Worker 				int enabled)
718*2d543d20SAndroid Build Coastguard Worker {
719*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
720*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
721*2d543d20SAndroid Build Coastguard Worker 
722*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->set_enabled == NULL) {
723*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
724*2d543d20SAndroid Build Coastguard Worker 		    "No set_enabled function defined for this connection type.");
725*2d543d20SAndroid Build Coastguard Worker 		return -1;
726*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
727*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
728*2d543d20SAndroid Build Coastguard Worker 		return -1;
729*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
730*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
731*2d543d20SAndroid Build Coastguard Worker 			return -1;
732*2d543d20SAndroid Build Coastguard Worker 		}
733*2d543d20SAndroid Build Coastguard Worker 	}
734*2d543d20SAndroid Build Coastguard Worker 
735*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
736*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->set_enabled(sh, modkey, enabled);
737*2d543d20SAndroid Build Coastguard Worker }
738*2d543d20SAndroid Build Coastguard Worker 
739*2d543d20SAndroid Build Coastguard Worker 
740*2d543d20SAndroid Build Coastguard Worker /* Converts a string to a priority
741*2d543d20SAndroid Build Coastguard Worker  *
742*2d543d20SAndroid Build Coastguard Worker  * returns -1 if str is not a valid priority.
743*2d543d20SAndroid Build Coastguard Worker  * returns 0 and sets priority if str is a valid priority
744*2d543d20SAndroid Build Coastguard Worker  */
semanage_string_to_priority(const char * str,uint16_t * priority)745*2d543d20SAndroid Build Coastguard Worker int semanage_string_to_priority(const char *str, uint16_t *priority)
746*2d543d20SAndroid Build Coastguard Worker {
747*2d543d20SAndroid Build Coastguard Worker 	unsigned long val;
748*2d543d20SAndroid Build Coastguard Worker 	char *endptr = NULL;
749*2d543d20SAndroid Build Coastguard Worker 	int status = -1;
750*2d543d20SAndroid Build Coastguard Worker 
751*2d543d20SAndroid Build Coastguard Worker 	if (str == NULL || priority == NULL) {
752*2d543d20SAndroid Build Coastguard Worker 		goto exit;
753*2d543d20SAndroid Build Coastguard Worker 	}
754*2d543d20SAndroid Build Coastguard Worker 
755*2d543d20SAndroid Build Coastguard Worker 	errno = 0;
756*2d543d20SAndroid Build Coastguard Worker 
757*2d543d20SAndroid Build Coastguard Worker 	val = strtoul(str, &endptr, 10);
758*2d543d20SAndroid Build Coastguard Worker 
759*2d543d20SAndroid Build Coastguard Worker 	if (errno != 0 || endptr == str || *endptr != '\0' || val > UINT16_MAX) {
760*2d543d20SAndroid Build Coastguard Worker 		goto exit;
761*2d543d20SAndroid Build Coastguard Worker 	}
762*2d543d20SAndroid Build Coastguard Worker 
763*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_priority((uint16_t)val) < 0) {
764*2d543d20SAndroid Build Coastguard Worker 		goto exit;
765*2d543d20SAndroid Build Coastguard Worker 	}
766*2d543d20SAndroid Build Coastguard Worker 
767*2d543d20SAndroid Build Coastguard Worker 	*priority = val;
768*2d543d20SAndroid Build Coastguard Worker 	status = 0;
769*2d543d20SAndroid Build Coastguard Worker 
770*2d543d20SAndroid Build Coastguard Worker exit:
771*2d543d20SAndroid Build Coastguard Worker 	return status;
772*2d543d20SAndroid Build Coastguard Worker }
773*2d543d20SAndroid Build Coastguard Worker 
774*2d543d20SAndroid Build Coastguard Worker /* Validates a module info struct.
775*2d543d20SAndroid Build Coastguard Worker  *
776*2d543d20SAndroid Build Coastguard Worker  * Returns -1 if module is invalid, 0 otherwise.
777*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_info_validate(const semanage_module_info_t * modinfo)778*2d543d20SAndroid Build Coastguard Worker int semanage_module_info_validate(const semanage_module_info_t *modinfo)
779*2d543d20SAndroid Build Coastguard Worker {
780*2d543d20SAndroid Build Coastguard Worker 	if (semanage_module_validate_priority(modinfo->priority) != 0 ||
781*2d543d20SAndroid Build Coastguard Worker 	    semanage_module_validate_name(modinfo->name) != 0 ||
782*2d543d20SAndroid Build Coastguard Worker 	    semanage_module_validate_lang_ext(modinfo->lang_ext) != 0 ||
783*2d543d20SAndroid Build Coastguard Worker 	    semanage_module_validate_enabled(modinfo->enabled) != 0) {
784*2d543d20SAndroid Build Coastguard Worker 		return -1;
785*2d543d20SAndroid Build Coastguard Worker 	}
786*2d543d20SAndroid Build Coastguard Worker 	return 0;
787*2d543d20SAndroid Build Coastguard Worker }
788*2d543d20SAndroid Build Coastguard Worker 
789*2d543d20SAndroid Build Coastguard Worker #define PRIORITY_MIN 1
790*2d543d20SAndroid Build Coastguard Worker #define PRIORITY_MAX 999
791*2d543d20SAndroid Build Coastguard Worker 
792*2d543d20SAndroid Build Coastguard Worker /* Validates priority.
793*2d543d20SAndroid Build Coastguard Worker  *
794*2d543d20SAndroid Build Coastguard Worker  * returns -1 if priority is not in the valid range, returns 0 otherwise
795*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_validate_priority(uint16_t priority)796*2d543d20SAndroid Build Coastguard Worker int semanage_module_validate_priority(uint16_t priority)
797*2d543d20SAndroid Build Coastguard Worker {
798*2d543d20SAndroid Build Coastguard Worker 	if (priority >= PRIORITY_MIN && priority <= PRIORITY_MAX) {
799*2d543d20SAndroid Build Coastguard Worker 		return 0;
800*2d543d20SAndroid Build Coastguard Worker 	}
801*2d543d20SAndroid Build Coastguard Worker 
802*2d543d20SAndroid Build Coastguard Worker 	return -1;
803*2d543d20SAndroid Build Coastguard Worker }
804*2d543d20SAndroid Build Coastguard Worker 
805*2d543d20SAndroid Build Coastguard Worker /* Validates module name.
806*2d543d20SAndroid Build Coastguard Worker  *
807*2d543d20SAndroid Build Coastguard Worker  * A module name must match one of the following regular expressions
808*2d543d20SAndroid Build Coastguard Worker  * to be considered valid:
809*2d543d20SAndroid Build Coastguard Worker  *
810*2d543d20SAndroid Build Coastguard Worker  * ^[a-zA-Z](\.?[a-zA-Z0-9_-])*$
811*2d543d20SAndroid Build Coastguard Worker  *
812*2d543d20SAndroid Build Coastguard Worker  * returns -1 if name is not valid, returns 0 otherwise
813*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_validate_name(const char * name)814*2d543d20SAndroid Build Coastguard Worker int semanage_module_validate_name(const char * name)
815*2d543d20SAndroid Build Coastguard Worker {
816*2d543d20SAndroid Build Coastguard Worker 	int status = 0;
817*2d543d20SAndroid Build Coastguard Worker 
818*2d543d20SAndroid Build Coastguard Worker 	if (name == NULL) {
819*2d543d20SAndroid Build Coastguard Worker 		status = -1;
820*2d543d20SAndroid Build Coastguard Worker 		goto exit;
821*2d543d20SAndroid Build Coastguard Worker 	}
822*2d543d20SAndroid Build Coastguard Worker 
823*2d543d20SAndroid Build Coastguard Worker 	if (!isalpha(*name)) {
824*2d543d20SAndroid Build Coastguard Worker 		status = -1;
825*2d543d20SAndroid Build Coastguard Worker 		goto exit;
826*2d543d20SAndroid Build Coastguard Worker 	}
827*2d543d20SAndroid Build Coastguard Worker 
828*2d543d20SAndroid Build Coastguard Worker #define ISVALIDCHAR(c) (isalnum(c) || c == '_' || c == '-')
829*2d543d20SAndroid Build Coastguard Worker 
830*2d543d20SAndroid Build Coastguard Worker 	for (name++; *name; name++) {
831*2d543d20SAndroid Build Coastguard Worker 		if (ISVALIDCHAR(*name)) {
832*2d543d20SAndroid Build Coastguard Worker 			continue;
833*2d543d20SAndroid Build Coastguard Worker 		}
834*2d543d20SAndroid Build Coastguard Worker 		if (*name == '.' && name++ && ISVALIDCHAR(*name)) {
835*2d543d20SAndroid Build Coastguard Worker 			continue;
836*2d543d20SAndroid Build Coastguard Worker 		}
837*2d543d20SAndroid Build Coastguard Worker 		status = -1;
838*2d543d20SAndroid Build Coastguard Worker 		goto exit;
839*2d543d20SAndroid Build Coastguard Worker 	}
840*2d543d20SAndroid Build Coastguard Worker 
841*2d543d20SAndroid Build Coastguard Worker #undef ISVALIDCHAR
842*2d543d20SAndroid Build Coastguard Worker 
843*2d543d20SAndroid Build Coastguard Worker exit:
844*2d543d20SAndroid Build Coastguard Worker 	return status;
845*2d543d20SAndroid Build Coastguard Worker }
846*2d543d20SAndroid Build Coastguard Worker 
847*2d543d20SAndroid Build Coastguard Worker /* Validates module enabled status.
848*2d543d20SAndroid Build Coastguard Worker  *
849*2d543d20SAndroid Build Coastguard Worker  * Valid enabled values are 1, 0, and -1.
850*2d543d20SAndroid Build Coastguard Worker  *
851*2d543d20SAndroid Build Coastguard Worker  * returns 0 if enabled is a valid value, returns -1 otherwise.
852*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_validate_enabled(int enabled)853*2d543d20SAndroid Build Coastguard Worker int semanage_module_validate_enabled(int enabled)
854*2d543d20SAndroid Build Coastguard Worker {
855*2d543d20SAndroid Build Coastguard Worker 	if (enabled == 1 || enabled == 0 || enabled == -1) {
856*2d543d20SAndroid Build Coastguard Worker 		return 0;
857*2d543d20SAndroid Build Coastguard Worker 	}
858*2d543d20SAndroid Build Coastguard Worker 
859*2d543d20SAndroid Build Coastguard Worker 	return -1;
860*2d543d20SAndroid Build Coastguard Worker }
861*2d543d20SAndroid Build Coastguard Worker 
862*2d543d20SAndroid Build Coastguard Worker /* Validate extension.
863*2d543d20SAndroid Build Coastguard Worker  *
864*2d543d20SAndroid Build Coastguard Worker  * An extension must match the following regular expression to be
865*2d543d20SAndroid Build Coastguard Worker  * considered valid:
866*2d543d20SAndroid Build Coastguard Worker  *
867*2d543d20SAndroid Build Coastguard Worker  * ^[a-zA-Z0-9][a-zA-Z0-9_-]*$
868*2d543d20SAndroid Build Coastguard Worker  *
869*2d543d20SAndroid Build Coastguard Worker  * returns 0 if ext is a valid value, returns -1 otherwise.
870*2d543d20SAndroid Build Coastguard Worker  */
semanage_module_validate_lang_ext(const char * ext)871*2d543d20SAndroid Build Coastguard Worker int semanage_module_validate_lang_ext(const char *ext)
872*2d543d20SAndroid Build Coastguard Worker {
873*2d543d20SAndroid Build Coastguard Worker 	int status = 0;
874*2d543d20SAndroid Build Coastguard Worker 
875*2d543d20SAndroid Build Coastguard Worker 	if (ext == NULL) {
876*2d543d20SAndroid Build Coastguard Worker 		status = -1;
877*2d543d20SAndroid Build Coastguard Worker 		goto exit;
878*2d543d20SAndroid Build Coastguard Worker 	}
879*2d543d20SAndroid Build Coastguard Worker 
880*2d543d20SAndroid Build Coastguard Worker 	if (!isalnum(*ext)) {
881*2d543d20SAndroid Build Coastguard Worker 		status = -1;
882*2d543d20SAndroid Build Coastguard Worker 		goto exit;
883*2d543d20SAndroid Build Coastguard Worker 	}
884*2d543d20SAndroid Build Coastguard Worker 
885*2d543d20SAndroid Build Coastguard Worker #define ISVALIDCHAR(c) (isalnum(c) || c == '_' || c == '-')
886*2d543d20SAndroid Build Coastguard Worker 
887*2d543d20SAndroid Build Coastguard Worker 	for (ext++; *ext; ext++) {
888*2d543d20SAndroid Build Coastguard Worker 		if (ISVALIDCHAR(*ext)) {
889*2d543d20SAndroid Build Coastguard Worker 			continue;
890*2d543d20SAndroid Build Coastguard Worker 		}
891*2d543d20SAndroid Build Coastguard Worker 		status = -1;
892*2d543d20SAndroid Build Coastguard Worker 		goto exit;
893*2d543d20SAndroid Build Coastguard Worker 	}
894*2d543d20SAndroid Build Coastguard Worker 
895*2d543d20SAndroid Build Coastguard Worker #undef ISVALIDCHAR
896*2d543d20SAndroid Build Coastguard Worker 
897*2d543d20SAndroid Build Coastguard Worker exit:
898*2d543d20SAndroid Build Coastguard Worker 	return status;
899*2d543d20SAndroid Build Coastguard Worker }
900*2d543d20SAndroid Build Coastguard Worker 
semanage_module_get_module_info(semanage_handle_t * sh,const semanage_module_key_t * modkey,semanage_module_info_t ** modinfo)901*2d543d20SAndroid Build Coastguard Worker int semanage_module_get_module_info(semanage_handle_t *sh,
902*2d543d20SAndroid Build Coastguard Worker 				    const semanage_module_key_t *modkey,
903*2d543d20SAndroid Build Coastguard Worker 				    semanage_module_info_t **modinfo)
904*2d543d20SAndroid Build Coastguard Worker {
905*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
906*2d543d20SAndroid Build Coastguard Worker 	assert(modkey);
907*2d543d20SAndroid Build Coastguard Worker 	assert(modinfo);
908*2d543d20SAndroid Build Coastguard Worker 
909*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->get_module_info == NULL) {
910*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
911*2d543d20SAndroid Build Coastguard Worker 		    "No get module info function defined for this connection type.");
912*2d543d20SAndroid Build Coastguard Worker 		return -1;
913*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
914*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
915*2d543d20SAndroid Build Coastguard Worker 		return -1;
916*2d543d20SAndroid Build Coastguard Worker 	}
917*2d543d20SAndroid Build Coastguard Worker 
918*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->get_module_info(sh, modkey, modinfo);
919*2d543d20SAndroid Build Coastguard Worker }
920*2d543d20SAndroid Build Coastguard Worker 
semanage_module_list_all(semanage_handle_t * sh,semanage_module_info_t ** modinfos,int * modinfos_len)921*2d543d20SAndroid Build Coastguard Worker int semanage_module_list_all(semanage_handle_t *sh,
922*2d543d20SAndroid Build Coastguard Worker 			     semanage_module_info_t **modinfos,
923*2d543d20SAndroid Build Coastguard Worker 			     int *modinfos_len)
924*2d543d20SAndroid Build Coastguard Worker {
925*2d543d20SAndroid Build Coastguard Worker 	assert(sh);
926*2d543d20SAndroid Build Coastguard Worker 	assert(modinfos);
927*2d543d20SAndroid Build Coastguard Worker 	assert(modinfos_len);
928*2d543d20SAndroid Build Coastguard Worker 
929*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->list_all == NULL) {
930*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
931*2d543d20SAndroid Build Coastguard Worker 		    "No list all function defined for this connection type.");
932*2d543d20SAndroid Build Coastguard Worker 		return -1;
933*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
934*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
935*2d543d20SAndroid Build Coastguard Worker 		return -1;
936*2d543d20SAndroid Build Coastguard Worker 	}
937*2d543d20SAndroid Build Coastguard Worker 
938*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->list_all(sh, modinfos, modinfos_len);
939*2d543d20SAndroid Build Coastguard Worker }
940*2d543d20SAndroid Build Coastguard Worker 
semanage_module_install_info(semanage_handle_t * sh,const semanage_module_info_t * modinfo,char * data,size_t data_len)941*2d543d20SAndroid Build Coastguard Worker int semanage_module_install_info(semanage_handle_t *sh,
942*2d543d20SAndroid Build Coastguard Worker 				 const semanage_module_info_t *modinfo,
943*2d543d20SAndroid Build Coastguard Worker 				 char *data,
944*2d543d20SAndroid Build Coastguard Worker 				 size_t data_len)
945*2d543d20SAndroid Build Coastguard Worker {
946*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->install_info == NULL) {
947*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
948*2d543d20SAndroid Build Coastguard Worker 		    "No install info function defined for this connection type.");
949*2d543d20SAndroid Build Coastguard Worker 		return -1;
950*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
951*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
952*2d543d20SAndroid Build Coastguard Worker 		return -1;
953*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
954*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
955*2d543d20SAndroid Build Coastguard Worker 			return -1;
956*2d543d20SAndroid Build Coastguard Worker 		}
957*2d543d20SAndroid Build Coastguard Worker 	}
958*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
959*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->install_info(sh, modinfo, data, data_len);
960*2d543d20SAndroid Build Coastguard Worker }
961*2d543d20SAndroid Build Coastguard Worker 
semanage_module_remove_key(semanage_handle_t * sh,const semanage_module_key_t * modkey)962*2d543d20SAndroid Build Coastguard Worker int semanage_module_remove_key(semanage_handle_t *sh,
963*2d543d20SAndroid Build Coastguard Worker 			       const semanage_module_key_t *modkey)
964*2d543d20SAndroid Build Coastguard Worker {
965*2d543d20SAndroid Build Coastguard Worker 	if (sh->funcs->remove_key == NULL) {
966*2d543d20SAndroid Build Coastguard Worker 		ERR(sh,
967*2d543d20SAndroid Build Coastguard Worker 		    "No remove key function defined for this connection type.");
968*2d543d20SAndroid Build Coastguard Worker 		return -1;
969*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_connected) {
970*2d543d20SAndroid Build Coastguard Worker 		ERR(sh, "Not connected.");
971*2d543d20SAndroid Build Coastguard Worker 		return -1;
972*2d543d20SAndroid Build Coastguard Worker 	} else if (!sh->is_in_transaction) {
973*2d543d20SAndroid Build Coastguard Worker 		if (semanage_begin_transaction(sh) < 0) {
974*2d543d20SAndroid Build Coastguard Worker 			return -1;
975*2d543d20SAndroid Build Coastguard Worker 		}
976*2d543d20SAndroid Build Coastguard Worker 	}
977*2d543d20SAndroid Build Coastguard Worker 	sh->modules_modified = 1;
978*2d543d20SAndroid Build Coastguard Worker 	return sh->funcs->remove_key(sh, modkey);
979*2d543d20SAndroid Build Coastguard Worker }
980*2d543d20SAndroid Build Coastguard Worker 
981*2d543d20SAndroid Build Coastguard Worker static const char CHECKSUM_TYPE[] = "sha256";
982*2d543d20SAndroid Build Coastguard Worker const size_t CHECKSUM_CONTENT_SIZE = sizeof(CHECKSUM_TYPE) + 1 + 2 * SHA256_HASH_SIZE;
983*2d543d20SAndroid Build Coastguard Worker 
semanage_hash_to_checksum_string(const uint8_t * hash,char * checksum)984*2d543d20SAndroid Build Coastguard Worker void semanage_hash_to_checksum_string(const uint8_t *hash, char *checksum)
985*2d543d20SAndroid Build Coastguard Worker {
986*2d543d20SAndroid Build Coastguard Worker 	size_t i;
987*2d543d20SAndroid Build Coastguard Worker 
988*2d543d20SAndroid Build Coastguard Worker 	checksum += sprintf(checksum, "%s:", CHECKSUM_TYPE);
989*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < SHA256_HASH_SIZE; i++) {
990*2d543d20SAndroid Build Coastguard Worker 		checksum += sprintf(checksum, "%02x", (unsigned)hash[i]);
991*2d543d20SAndroid Build Coastguard Worker 	}
992*2d543d20SAndroid Build Coastguard Worker }
993*2d543d20SAndroid Build Coastguard Worker 
semanage_module_compute_checksum(semanage_handle_t * sh,semanage_module_key_t * modkey,int cil,char ** checksum,size_t * checksum_len)994*2d543d20SAndroid Build Coastguard Worker int semanage_module_compute_checksum(semanage_handle_t *sh,
995*2d543d20SAndroid Build Coastguard Worker 				     semanage_module_key_t *modkey,
996*2d543d20SAndroid Build Coastguard Worker 				     int cil, char **checksum,
997*2d543d20SAndroid Build Coastguard Worker 				     size_t *checksum_len)
998*2d543d20SAndroid Build Coastguard Worker {
999*2d543d20SAndroid Build Coastguard Worker 	semanage_module_info_t *extract_info = NULL;
1000*2d543d20SAndroid Build Coastguard Worker 	Sha256Context context;
1001*2d543d20SAndroid Build Coastguard Worker 	SHA256_HASH sha256_hash;
1002*2d543d20SAndroid Build Coastguard Worker 	char *checksum_str;
1003*2d543d20SAndroid Build Coastguard Worker 	void *data;
1004*2d543d20SAndroid Build Coastguard Worker 	size_t data_len = 0;
1005*2d543d20SAndroid Build Coastguard Worker 	int result;
1006*2d543d20SAndroid Build Coastguard Worker 
1007*2d543d20SAndroid Build Coastguard Worker 	if (!checksum_len)
1008*2d543d20SAndroid Build Coastguard Worker 		return -1;
1009*2d543d20SAndroid Build Coastguard Worker 
1010*2d543d20SAndroid Build Coastguard Worker 	if (!checksum) {
1011*2d543d20SAndroid Build Coastguard Worker 		*checksum_len = CHECKSUM_CONTENT_SIZE;
1012*2d543d20SAndroid Build Coastguard Worker 		return 0;
1013*2d543d20SAndroid Build Coastguard Worker 	}
1014*2d543d20SAndroid Build Coastguard Worker 
1015*2d543d20SAndroid Build Coastguard Worker 	result = semanage_module_extract(sh, modkey, cil, &data, &data_len, &extract_info);
1016*2d543d20SAndroid Build Coastguard Worker 	if (result != 0)
1017*2d543d20SAndroid Build Coastguard Worker 		return -1;
1018*2d543d20SAndroid Build Coastguard Worker 
1019*2d543d20SAndroid Build Coastguard Worker 	semanage_module_info_destroy(sh, extract_info);
1020*2d543d20SAndroid Build Coastguard Worker 	free(extract_info);
1021*2d543d20SAndroid Build Coastguard Worker 
1022*2d543d20SAndroid Build Coastguard Worker 	Sha256Initialise(&context);
1023*2d543d20SAndroid Build Coastguard Worker 	Sha256Update(&context, data, data_len);
1024*2d543d20SAndroid Build Coastguard Worker 	Sha256Finalise(&context, &sha256_hash);
1025*2d543d20SAndroid Build Coastguard Worker 
1026*2d543d20SAndroid Build Coastguard Worker 	munmap(data, data_len);
1027*2d543d20SAndroid Build Coastguard Worker 
1028*2d543d20SAndroid Build Coastguard Worker 	checksum_str = malloc(CHECKSUM_CONTENT_SIZE + 1 /* '\0' */);
1029*2d543d20SAndroid Build Coastguard Worker 	if (!checksum_str)
1030*2d543d20SAndroid Build Coastguard Worker 		return -1;
1031*2d543d20SAndroid Build Coastguard Worker 
1032*2d543d20SAndroid Build Coastguard Worker 	semanage_hash_to_checksum_string(sha256_hash.bytes, checksum_str);
1033*2d543d20SAndroid Build Coastguard Worker 
1034*2d543d20SAndroid Build Coastguard Worker 	*checksum = checksum_str;
1035*2d543d20SAndroid Build Coastguard Worker 	*checksum_len = CHECKSUM_CONTENT_SIZE;
1036*2d543d20SAndroid Build Coastguard Worker 	return 0;
1037*2d543d20SAndroid Build Coastguard Worker }
1038