xref: /aosp_15_r20/external/selinux/libsemanage/src/ports_local.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2005 Red Hat, Inc. */
2*2d543d20SAndroid Build Coastguard Worker 
3*2d543d20SAndroid Build Coastguard Worker struct semanage_port;
4*2d543d20SAndroid Build Coastguard Worker struct semanage_port_key;
5*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_port_key record_key_t;
6*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_port 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 "port_internal.h"
11*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
12*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
13*2d543d20SAndroid Build Coastguard Worker #include "database.h"
14*2d543d20SAndroid Build Coastguard Worker 
semanage_port_modify_local(semanage_handle_t * handle,const semanage_port_key_t * key,const semanage_port_t * data)15*2d543d20SAndroid Build Coastguard Worker int semanage_port_modify_local(semanage_handle_t * handle,
16*2d543d20SAndroid Build Coastguard Worker 			       const semanage_port_key_t * key,
17*2d543d20SAndroid Build Coastguard Worker 			       const semanage_port_t * data)
18*2d543d20SAndroid Build Coastguard Worker {
19*2d543d20SAndroid Build Coastguard Worker 
20*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
21*2d543d20SAndroid Build Coastguard Worker 	return dbase_modify(handle, dconfig, key, data);
22*2d543d20SAndroid Build Coastguard Worker }
23*2d543d20SAndroid Build Coastguard Worker 
semanage_port_del_local(semanage_handle_t * handle,const semanage_port_key_t * key)24*2d543d20SAndroid Build Coastguard Worker int semanage_port_del_local(semanage_handle_t * handle,
25*2d543d20SAndroid Build Coastguard Worker 			    const semanage_port_key_t * key)
26*2d543d20SAndroid Build Coastguard Worker {
27*2d543d20SAndroid Build Coastguard Worker 
28*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
29*2d543d20SAndroid Build Coastguard Worker 	return dbase_del(handle, dconfig, key);
30*2d543d20SAndroid Build Coastguard Worker }
31*2d543d20SAndroid Build Coastguard Worker 
semanage_port_query_local(semanage_handle_t * handle,const semanage_port_key_t * key,semanage_port_t ** response)32*2d543d20SAndroid Build Coastguard Worker int semanage_port_query_local(semanage_handle_t * handle,
33*2d543d20SAndroid Build Coastguard Worker 			      const semanage_port_key_t * key,
34*2d543d20SAndroid Build Coastguard Worker 			      semanage_port_t ** response)
35*2d543d20SAndroid Build Coastguard Worker {
36*2d543d20SAndroid Build Coastguard Worker 
37*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
38*2d543d20SAndroid Build Coastguard Worker 	return dbase_query(handle, dconfig, key, response);
39*2d543d20SAndroid Build Coastguard Worker }
40*2d543d20SAndroid Build Coastguard Worker 
semanage_port_exists_local(semanage_handle_t * handle,const semanage_port_key_t * key,int * response)41*2d543d20SAndroid Build Coastguard Worker int semanage_port_exists_local(semanage_handle_t * handle,
42*2d543d20SAndroid Build Coastguard Worker 			       const semanage_port_key_t * key, int *response)
43*2d543d20SAndroid Build Coastguard Worker {
44*2d543d20SAndroid Build Coastguard Worker 
45*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
46*2d543d20SAndroid Build Coastguard Worker 	return dbase_exists(handle, dconfig, key, response);
47*2d543d20SAndroid Build Coastguard Worker }
48*2d543d20SAndroid Build Coastguard Worker 
semanage_port_count_local(semanage_handle_t * handle,unsigned int * response)49*2d543d20SAndroid Build Coastguard Worker int semanage_port_count_local(semanage_handle_t * handle,
50*2d543d20SAndroid Build Coastguard Worker 			      unsigned int *response)
51*2d543d20SAndroid Build Coastguard Worker {
52*2d543d20SAndroid Build Coastguard Worker 
53*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
54*2d543d20SAndroid Build Coastguard Worker 	return dbase_count(handle, dconfig, response);
55*2d543d20SAndroid Build Coastguard Worker }
56*2d543d20SAndroid Build Coastguard Worker 
semanage_port_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_port_t * record,void * varg),void * handler_arg)57*2d543d20SAndroid Build Coastguard Worker int semanage_port_iterate_local(semanage_handle_t * handle,
58*2d543d20SAndroid Build Coastguard Worker 				int (*handler) (const semanage_port_t * record,
59*2d543d20SAndroid Build Coastguard Worker 						void *varg), void *handler_arg)
60*2d543d20SAndroid Build Coastguard Worker {
61*2d543d20SAndroid Build Coastguard Worker 
62*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
63*2d543d20SAndroid Build Coastguard Worker 	return dbase_iterate(handle, dconfig, handler, handler_arg);
64*2d543d20SAndroid Build Coastguard Worker }
65*2d543d20SAndroid Build Coastguard Worker 
semanage_port_list_local(semanage_handle_t * handle,semanage_port_t *** records,unsigned int * count)66*2d543d20SAndroid Build Coastguard Worker int semanage_port_list_local(semanage_handle_t * handle,
67*2d543d20SAndroid Build Coastguard Worker 			     semanage_port_t *** records, unsigned int *count)
68*2d543d20SAndroid Build Coastguard Worker {
69*2d543d20SAndroid Build Coastguard Worker 
70*2d543d20SAndroid Build Coastguard Worker 	dbase_config_t *dconfig = semanage_port_dbase_local(handle);
71*2d543d20SAndroid Build Coastguard Worker 	return dbase_list(handle, dconfig, records, count);
72*2d543d20SAndroid Build Coastguard Worker }
73*2d543d20SAndroid Build Coastguard Worker 
74*2d543d20SAndroid Build Coastguard Worker 
semanage_port_validate_local(semanage_handle_t * handle)75*2d543d20SAndroid Build Coastguard Worker int semanage_port_validate_local(semanage_handle_t * handle)
76*2d543d20SAndroid Build Coastguard Worker {
77*2d543d20SAndroid Build Coastguard Worker 
78*2d543d20SAndroid Build Coastguard Worker 	semanage_port_t **ports = NULL;
79*2d543d20SAndroid Build Coastguard Worker 	unsigned int nports = 0;
80*2d543d20SAndroid Build Coastguard Worker 	unsigned int i = 0, j = 0;
81*2d543d20SAndroid Build Coastguard Worker 
82*2d543d20SAndroid Build Coastguard Worker 	/* List and sort the ports */
83*2d543d20SAndroid Build Coastguard Worker 	if (semanage_port_list_local(handle, &ports, &nports) < 0)
84*2d543d20SAndroid Build Coastguard Worker 		goto err;
85*2d543d20SAndroid Build Coastguard Worker 	qsort(ports, nports, sizeof(semanage_port_t *),
86*2d543d20SAndroid Build Coastguard Worker 	      (int (*)(const void *, const void *))
87*2d543d20SAndroid Build Coastguard Worker 	      &semanage_port_compare2_qsort);
88*2d543d20SAndroid Build Coastguard Worker 
89*2d543d20SAndroid Build Coastguard Worker 	/* Test each port for overlap */
90*2d543d20SAndroid Build Coastguard Worker 	while (i < nports) {
91*2d543d20SAndroid Build Coastguard Worker 
92*2d543d20SAndroid Build Coastguard Worker 		int proto = semanage_port_get_proto(ports[i]);
93*2d543d20SAndroid Build Coastguard Worker 		int low = semanage_port_get_low(ports[i]);
94*2d543d20SAndroid Build Coastguard Worker 		int high = semanage_port_get_high(ports[i]);
95*2d543d20SAndroid Build Coastguard Worker 		const char *proto_str = semanage_port_get_proto_str(proto);
96*2d543d20SAndroid Build Coastguard Worker 
97*2d543d20SAndroid Build Coastguard Worker 		const char *proto_str2;
98*2d543d20SAndroid Build Coastguard Worker 		int proto2, low2, high2;
99*2d543d20SAndroid Build Coastguard Worker 
100*2d543d20SAndroid Build Coastguard Worker 		/* Find the first port with matching
101*2d543d20SAndroid Build Coastguard Worker 		   protocol to compare against */
102*2d543d20SAndroid Build Coastguard Worker 		do {
103*2d543d20SAndroid Build Coastguard Worker 			if (j == nports - 1)
104*2d543d20SAndroid Build Coastguard Worker 				goto next;
105*2d543d20SAndroid Build Coastguard Worker 			j++;
106*2d543d20SAndroid Build Coastguard Worker 			proto2 = semanage_port_get_proto(ports[j]);
107*2d543d20SAndroid Build Coastguard Worker 			low2 = semanage_port_get_low(ports[j]);
108*2d543d20SAndroid Build Coastguard Worker 			high2 = semanage_port_get_high(ports[j]);
109*2d543d20SAndroid Build Coastguard Worker 			proto_str2 = semanage_port_get_proto_str(proto2);
110*2d543d20SAndroid Build Coastguard Worker 
111*2d543d20SAndroid Build Coastguard Worker 		} while (proto != proto2);
112*2d543d20SAndroid Build Coastguard Worker 
113*2d543d20SAndroid Build Coastguard Worker 		/* Overlap detected */
114*2d543d20SAndroid Build Coastguard Worker 		if (low2 <= high) {
115*2d543d20SAndroid Build Coastguard Worker 			ERR(handle, "port overlap between ranges "
116*2d543d20SAndroid Build Coastguard Worker 			    "%u - %u (%s) <--> %u - %u (%s).",
117*2d543d20SAndroid Build Coastguard Worker 			    low, high, proto_str, low2, high2, proto_str2);
118*2d543d20SAndroid Build Coastguard Worker 			goto invalid;
119*2d543d20SAndroid Build Coastguard Worker 		}
120*2d543d20SAndroid Build Coastguard Worker 
121*2d543d20SAndroid Build Coastguard Worker 		/* If closest port of matching protocol doesn't overlap with
122*2d543d20SAndroid Build Coastguard Worker 		 * test port, neither do the rest of them, because that's
123*2d543d20SAndroid Build Coastguard Worker 		 * how the sort function works on ports - lower bound
124*2d543d20SAndroid Build Coastguard Worker 		 * ports come first */
125*2d543d20SAndroid Build Coastguard Worker 	      next:
126*2d543d20SAndroid Build Coastguard Worker 		i++;
127*2d543d20SAndroid Build Coastguard Worker 		j = i;
128*2d543d20SAndroid Build Coastguard Worker 	}
129*2d543d20SAndroid Build Coastguard Worker 
130*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < nports; i++)
131*2d543d20SAndroid Build Coastguard Worker 		semanage_port_free(ports[i]);
132*2d543d20SAndroid Build Coastguard Worker 	free(ports);
133*2d543d20SAndroid Build Coastguard Worker 	return STATUS_SUCCESS;
134*2d543d20SAndroid Build Coastguard Worker 
135*2d543d20SAndroid Build Coastguard Worker       err:
136*2d543d20SAndroid Build Coastguard Worker 	ERR(handle, "could not complete ports validity check");
137*2d543d20SAndroid Build Coastguard Worker 
138*2d543d20SAndroid Build Coastguard Worker       invalid:
139*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < nports; i++)
140*2d543d20SAndroid Build Coastguard Worker 		semanage_port_free(ports[i]);
141*2d543d20SAndroid Build Coastguard Worker 	free(ports);
142*2d543d20SAndroid Build Coastguard Worker 	return STATUS_ERR;
143*2d543d20SAndroid Build Coastguard Worker }
144