xref: /aosp_15_r20/external/selinux/libsemanage/src/ibendports_local.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1 /* Copyright (C) 2017 Mellanox Technologies Inc */
2 
3 struct semanage_ibendport;
4 struct semanage_ibendport_key;
5 typedef struct semanage_ibendport_key record_key_t;
6 typedef struct semanage_ibendport record_t;
7 #define DBASE_RECORD_DEFINED
8 
9 #include <stdlib.h>
10 #include <string.h>
11 #include <sepol/policydb.h>
12 #include "ibendport_internal.h"
13 #include "debug.h"
14 #include "handle.h"
15 #include "database.h"
16 
semanage_ibendport_modify_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,const semanage_ibendport_t * data)17 int semanage_ibendport_modify_local(semanage_handle_t *handle,
18 				    const semanage_ibendport_key_t *key,
19 				    const semanage_ibendport_t *data)
20 {
21 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
22 
23 	return dbase_modify(handle, dconfig, key, data);
24 }
25 
semanage_ibendport_del_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key)26 int semanage_ibendport_del_local(semanage_handle_t *handle,
27 				 const semanage_ibendport_key_t *key)
28 {
29 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
30 
31 	return dbase_del(handle, dconfig, key);
32 }
33 
semanage_ibendport_query_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,semanage_ibendport_t ** response)34 int semanage_ibendport_query_local(semanage_handle_t *handle,
35 				   const semanage_ibendport_key_t *key,
36 				   semanage_ibendport_t **response)
37 {
38 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
39 
40 	return dbase_query(handle, dconfig, key, response);
41 }
42 
semanage_ibendport_exists_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,int * response)43 int semanage_ibendport_exists_local(semanage_handle_t *handle,
44 				    const semanage_ibendport_key_t *key,
45 				    int *response)
46 {
47 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
48 
49 	return dbase_exists(handle, dconfig, key, response);
50 }
51 
semanage_ibendport_count_local(semanage_handle_t * handle,unsigned int * response)52 int semanage_ibendport_count_local(semanage_handle_t *handle,
53 				   unsigned int *response)
54 {
55 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
56 
57 	return dbase_count(handle, dconfig, response);
58 }
59 
semanage_ibendport_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_ibendport_t * record,void * varg),void * handler_arg)60 int semanage_ibendport_iterate_local(semanage_handle_t *handle,
61 				     int (*handler)(const semanage_ibendport_t *record,
62 						    void *varg), void *handler_arg)
63 {
64 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
65 	return dbase_iterate(handle, dconfig, handler, handler_arg);
66 }
67 
semanage_ibendport_list_local(semanage_handle_t * handle,semanage_ibendport_t *** records,unsigned int * count)68 int semanage_ibendport_list_local(semanage_handle_t *handle,
69 				  semanage_ibendport_t ***records,
70 				  unsigned int *count)
71 {
72 	dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
73 
74 	return dbase_list(handle, dconfig, records, count);
75 }
76 
77 
semanage_ibendport_validate_local(semanage_handle_t * handle)78 int semanage_ibendport_validate_local(semanage_handle_t *handle)
79 {
80 	semanage_ibendport_t **ibendports = NULL;
81 	unsigned int nibendports = 0;
82 	unsigned int i = 0, j = 0;
83 	char *ibdev_name;
84 	char *ibdev_name2;
85 	int port;
86 	int port2;
87 
88 	/* List and sort the ibendports */
89 	if (semanage_ibendport_list_local(handle, &ibendports, &nibendports) < 0)
90 		goto err;
91 
92 	qsort(ibendports, nibendports, sizeof(semanage_ibendport_t *),
93 	      (int (*)(const void *, const void *))
94 	      &semanage_ibendport_compare2_qsort);
95 
96 	/* Test each ibendport */
97 	while (i < nibendports) {
98 		int stop = 0;
99 
100 		if (STATUS_SUCCESS !=
101 				semanage_ibendport_get_ibdev_name(handle,
102 								  ibendports[i],
103 								  &ibdev_name)) {
104 			ERR(handle, "Couldn't get IB device name");
105 			goto err;
106 		}
107 
108 		port = semanage_ibendport_get_port(ibendports[i]);
109 
110 		/* Find the first ibendport with matching
111 		 * ibdev_name to compare against
112 		 */
113 		do {
114 			if (j == nibendports - 1)
115 				goto next;
116 			j++;
117 			if (STATUS_SUCCESS !=
118 				semanage_ibendport_get_ibdev_name(handle,
119 								  ibendports[j],
120 								  &ibdev_name2)) {
121 				ERR(handle, "Couldn't get IB device name.");
122 				goto err;
123 			}
124 			port2 = semanage_ibendport_get_port(ibendports[j]);
125 
126 			stop = !strcmp(ibdev_name, ibdev_name2);
127 		} while (!stop);
128 
129 		if (port == port2) {
130 			ERR(handle, "ibendport %s/%u already exists.",
131 			    ibdev_name2, port2);
132 			goto invalid;
133 		}
134 next:
135 		i++;
136 		j = i;
137 	}
138 
139 	for (i = 0; i < nibendports; i++)
140 		semanage_ibendport_free(ibendports[i]);
141 	free(ibendports);
142 	return STATUS_SUCCESS;
143 
144 err:
145 	ERR(handle, "could not complete ibendports validity check");
146 
147 invalid:
148 	for (i = 0; i < nibendports; i++)
149 		semanage_ibendport_free(ibendports[i]);
150 	free(ibendports);
151 	return STATUS_ERR;
152 }
153