xref: /aosp_15_r20/external/selinux/libsemanage/src/ibpkeys_local.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2017 Mellanox Technologies Inc. */
2*2d543d20SAndroid Build Coastguard Worker 
3*2d543d20SAndroid Build Coastguard Worker struct semanage_ibpkey;
4*2d543d20SAndroid Build Coastguard Worker struct semanage_ibpkey_key;
5*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_ibpkey_key record_key_t;
6*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_ibpkey record_t;
7*2d543d20SAndroid Build Coastguard Worker #define DBASE_RECORD_DEFINED
8*2d543d20SAndroid Build Coastguard Worker 
9*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
10*2d543d20SAndroid Build Coastguard Worker #include <string.h>
11*2d543d20SAndroid Build Coastguard Worker #include <netinet/in.h>
12*2d543d20SAndroid Build Coastguard Worker #include "ibpkey_internal.h"
13*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
14*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
15*2d543d20SAndroid Build Coastguard Worker #include "database.h"
16*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_modify_local(semanage_handle_t * handle,const semanage_ibpkey_key_t * key,const semanage_ibpkey_t * data)17*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_modify_local(semanage_handle_t *handle,
18*2d543d20SAndroid Build Coastguard Worker 				 const semanage_ibpkey_key_t *key,
19*2d543d20SAndroid Build Coastguard Worker 				 const semanage_ibpkey_t *data)
20*2d543d20SAndroid Build Coastguard Worker {
21*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
22*2d543d20SAndroid Build Coastguard Worker 
23*2d543d20SAndroid Build Coastguard Worker 	return dbase_modify(handle, dconfig, key, data);
24*2d543d20SAndroid Build Coastguard Worker }
25*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_del_local(semanage_handle_t * handle,const semanage_ibpkey_key_t * key)26*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_del_local(semanage_handle_t *handle,
27*2d543d20SAndroid Build Coastguard Worker 			      const semanage_ibpkey_key_t *key)
28*2d543d20SAndroid Build Coastguard Worker {
29*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
30*2d543d20SAndroid Build Coastguard Worker 
31*2d543d20SAndroid Build Coastguard Worker 	return dbase_del(handle, dconfig, key);
32*2d543d20SAndroid Build Coastguard Worker }
33*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_query_local(semanage_handle_t * handle,const semanage_ibpkey_key_t * key,semanage_ibpkey_t ** response)34*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_query_local(semanage_handle_t *handle,
35*2d543d20SAndroid Build Coastguard Worker 				const semanage_ibpkey_key_t *key,
36*2d543d20SAndroid Build Coastguard Worker 				semanage_ibpkey_t **response)
37*2d543d20SAndroid Build Coastguard Worker {
38*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
39*2d543d20SAndroid Build Coastguard Worker 
40*2d543d20SAndroid Build Coastguard Worker 	return dbase_query(handle, dconfig, key, response);
41*2d543d20SAndroid Build Coastguard Worker }
42*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_exists_local(semanage_handle_t * handle,const semanage_ibpkey_key_t * key,int * response)43*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_exists_local(semanage_handle_t *handle,
44*2d543d20SAndroid Build Coastguard Worker 				 const semanage_ibpkey_key_t *key,
45*2d543d20SAndroid Build Coastguard Worker 				 int *response)
46*2d543d20SAndroid Build Coastguard Worker {
47*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
48*2d543d20SAndroid Build Coastguard Worker 
49*2d543d20SAndroid Build Coastguard Worker 	return dbase_exists(handle, dconfig, key, response);
50*2d543d20SAndroid Build Coastguard Worker }
51*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_count_local(semanage_handle_t * handle,unsigned int * response)52*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_count_local(semanage_handle_t *handle,
53*2d543d20SAndroid Build Coastguard Worker 				unsigned int *response)
54*2d543d20SAndroid Build Coastguard Worker {
55*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
56*2d543d20SAndroid Build Coastguard Worker 
57*2d543d20SAndroid Build Coastguard Worker 	return dbase_count(handle, dconfig, response);
58*2d543d20SAndroid Build Coastguard Worker }
59*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_ibpkey_t * record,void * varg),void * handler_arg)60*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_iterate_local(semanage_handle_t *handle,
61*2d543d20SAndroid Build Coastguard Worker 				  int (*handler)(const semanage_ibpkey_t *record,
62*2d543d20SAndroid Build Coastguard Worker 						 void *varg), void *handler_arg)
63*2d543d20SAndroid Build Coastguard Worker {
64*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
65*2d543d20SAndroid Build Coastguard Worker 
66*2d543d20SAndroid Build Coastguard Worker 	return dbase_iterate(handle, dconfig, handler, handler_arg);
67*2d543d20SAndroid Build Coastguard Worker }
68*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_list_local(semanage_handle_t * handle,semanage_ibpkey_t *** records,unsigned int * count)69*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_list_local(semanage_handle_t *handle,
70*2d543d20SAndroid Build Coastguard Worker 			       semanage_ibpkey_t ***records, unsigned int *count)
71*2d543d20SAndroid Build Coastguard Worker {
72*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_ibpkey_dbase_local(handle);
73*2d543d20SAndroid Build Coastguard Worker 
74*2d543d20SAndroid Build Coastguard Worker 	return dbase_list(handle, dconfig, records, count);
75*2d543d20SAndroid Build Coastguard Worker }
76*2d543d20SAndroid Build Coastguard Worker 
77*2d543d20SAndroid Build Coastguard Worker 
semanage_ibpkey_validate_local(semanage_handle_t * handle)78*2d543d20SAndroid Build Coastguard Worker int semanage_ibpkey_validate_local(semanage_handle_t *handle)
79*2d543d20SAndroid Build Coastguard Worker {
80*2d543d20SAndroid Build Coastguard Worker 	semanage_ibpkey_t **ibpkeys = NULL;
81*2d543d20SAndroid Build Coastguard Worker 	unsigned int nibpkeys = 0;
82*2d543d20SAndroid Build Coastguard Worker 	unsigned int i = 0, j = 0;
83*2d543d20SAndroid Build Coastguard Worker 	uint64_t subnet_prefix;
84*2d543d20SAndroid Build Coastguard Worker 	uint64_t subnet_prefix2;
85*2d543d20SAndroid Build Coastguard Worker 	char *subnet_prefix_str;
86*2d543d20SAndroid Build Coastguard Worker 	char *subnet_prefix_str2;
87*2d543d20SAndroid Build Coastguard Worker 	int low, high;
88*2d543d20SAndroid Build Coastguard Worker 	int low2, high2;
89*2d543d20SAndroid Build Coastguard Worker 
90*2d543d20SAndroid Build Coastguard Worker 	/* List and sort the ibpkeys */
91*2d543d20SAndroid Build Coastguard Worker 	if (semanage_ibpkey_list_local(handle, &ibpkeys, &nibpkeys) < 0)
92*2d543d20SAndroid Build Coastguard Worker 		goto err;
93*2d543d20SAndroid Build Coastguard Worker 
94*2d543d20SAndroid Build Coastguard Worker 	qsort(ibpkeys, nibpkeys, sizeof(semanage_ibpkey_t *),
95*2d543d20SAndroid Build Coastguard Worker 	      (int (*)(const void *, const void *))
96*2d543d20SAndroid Build Coastguard Worker 	      &semanage_ibpkey_compare2_qsort);
97*2d543d20SAndroid Build Coastguard Worker 
98*2d543d20SAndroid Build Coastguard Worker 	/* Test each ibpkey for overlap */
99*2d543d20SAndroid Build Coastguard Worker 	while (i < nibpkeys) {
100*2d543d20SAndroid Build Coastguard Worker 		if (STATUS_SUCCESS != semanage_ibpkey_get_subnet_prefix(handle,
101*2d543d20SAndroid Build Coastguard Worker 									ibpkeys[i],
102*2d543d20SAndroid Build Coastguard Worker 									&subnet_prefix_str)) {
103*2d543d20SAndroid Build Coastguard Worker 			ERR(handle, "Couldn't get subnet prefix string");
104*2d543d20SAndroid Build Coastguard Worker 			goto err;
105*2d543d20SAndroid Build Coastguard Worker 		}
106*2d543d20SAndroid Build Coastguard Worker 
107*2d543d20SAndroid Build Coastguard Worker 		subnet_prefix = semanage_ibpkey_get_subnet_prefix_bytes(ibpkeys[i]);
108*2d543d20SAndroid Build Coastguard Worker 		low = semanage_ibpkey_get_low(ibpkeys[i]);
109*2d543d20SAndroid Build Coastguard Worker 		high = semanage_ibpkey_get_high(ibpkeys[i]);
110*2d543d20SAndroid Build Coastguard Worker 
111*2d543d20SAndroid Build Coastguard Worker 		/* Find the first ibpkey with matching
112*2d543d20SAndroid Build Coastguard Worker 		 * subnet_prefix to compare against
113*2d543d20SAndroid Build Coastguard Worker 		 */
114*2d543d20SAndroid Build Coastguard Worker 		do {
115*2d543d20SAndroid Build Coastguard Worker 			if (j == nibpkeys - 1)
116*2d543d20SAndroid Build Coastguard Worker 				goto next;
117*2d543d20SAndroid Build Coastguard Worker 			j++;
118*2d543d20SAndroid Build Coastguard Worker 
119*2d543d20SAndroid Build Coastguard Worker 			if (STATUS_SUCCESS !=
120*2d543d20SAndroid Build Coastguard Worker 				semanage_ibpkey_get_subnet_prefix(handle,
121*2d543d20SAndroid Build Coastguard Worker 								  ibpkeys[j],
122*2d543d20SAndroid Build Coastguard Worker 								  &subnet_prefix_str2)) {
123*2d543d20SAndroid Build Coastguard Worker 				ERR(handle, "Couldn't get subnet prefix string");
124*2d543d20SAndroid Build Coastguard Worker 				goto err;
125*2d543d20SAndroid Build Coastguard Worker 			}
126*2d543d20SAndroid Build Coastguard Worker 			subnet_prefix2 = semanage_ibpkey_get_subnet_prefix_bytes(ibpkeys[j]);
127*2d543d20SAndroid Build Coastguard Worker 			low2 = semanage_ibpkey_get_low(ibpkeys[j]);
128*2d543d20SAndroid Build Coastguard Worker 			high2 = semanage_ibpkey_get_high(ibpkeys[j]);
129*2d543d20SAndroid Build Coastguard Worker 		} while (subnet_prefix != subnet_prefix2);
130*2d543d20SAndroid Build Coastguard Worker 
131*2d543d20SAndroid Build Coastguard Worker 		/* Overlap detected */
132*2d543d20SAndroid Build Coastguard Worker 		if (low2 <= high) {
133*2d543d20SAndroid Build Coastguard Worker 			ERR(handle, "ibpkey overlap between ranges "
134*2d543d20SAndroid Build Coastguard Worker 			    "(%s) %u - %u <--> (%s) %u - %u.",
135*2d543d20SAndroid Build Coastguard Worker 			    subnet_prefix_str, low, high,
136*2d543d20SAndroid Build Coastguard Worker 			    subnet_prefix_str2, low2, high2);
137*2d543d20SAndroid Build Coastguard Worker 			goto invalid;
138*2d543d20SAndroid Build Coastguard Worker 		}
139*2d543d20SAndroid Build Coastguard Worker 
140*2d543d20SAndroid Build Coastguard Worker 		/* If closest ibpkey of matching subnet prefix doesn't overlap
141*2d543d20SAndroid Build Coastguard Worker 		 * with test ibpkey, neither do the rest of them, because that's
142*2d543d20SAndroid Build Coastguard Worker 		 * how the sort function works on ibpkeys - lower bound
143*2d543d20SAndroid Build Coastguard Worker 		 * ibpkeys come first
144*2d543d20SAndroid Build Coastguard Worker 		 */
145*2d543d20SAndroid Build Coastguard Worker next:
146*2d543d20SAndroid Build Coastguard Worker 		i++;
147*2d543d20SAndroid Build Coastguard Worker 		j = i;
148*2d543d20SAndroid Build Coastguard Worker 	}
149*2d543d20SAndroid Build Coastguard Worker 
150*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < nibpkeys; i++)
151*2d543d20SAndroid Build Coastguard Worker 		semanage_ibpkey_free(ibpkeys[i]);
152*2d543d20SAndroid Build Coastguard Worker 	free(ibpkeys);
153*2d543d20SAndroid Build Coastguard Worker 	return STATUS_SUCCESS;
154*2d543d20SAndroid Build Coastguard Worker 
155*2d543d20SAndroid Build Coastguard Worker err:
156*2d543d20SAndroid Build Coastguard Worker 	ERR(handle, "could not complete ibpkeys validity check");
157*2d543d20SAndroid Build Coastguard Worker 
158*2d543d20SAndroid Build Coastguard Worker invalid:
159*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < nibpkeys; i++)
160*2d543d20SAndroid Build Coastguard Worker 		semanage_ibpkey_free(ibpkeys[i]);
161*2d543d20SAndroid Build Coastguard Worker 	free(ibpkeys);
162*2d543d20SAndroid Build Coastguard Worker 	return STATUS_ERR;
163*2d543d20SAndroid Build Coastguard Worker }
164