Skip to content

Commit ded3457

Browse files
cgzonespcmoore
authored andcommitted
selinux: declare data arrays const
The arrays for the policy capability names, the initial sid identifiers and the class and permission names are not changed at runtime. Declare them const to avoid accidental modification. Do not override the classmap and the initial sid list in the build time script genheaders. Check flose(3) is successful in genheaders.c, otherwise the written data might be corrupted or incomplete. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> [PM: manual merge due to fuzz, minor style tweaks] Signed-off-by: Paul Moore <paul@paul-moore.com>
1 parent a9029d9 commit ded3457

11 files changed

Lines changed: 71 additions & 58 deletions

File tree

scripts/selinux/genheaders/genheaders.c

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -59,35 +59,27 @@ int main(int argc, char *argv[])
5959
exit(2);
6060
}
6161

62-
for (i = 0; secclass_map[i].name; i++) {
63-
struct security_class_mapping *map = &secclass_map[i];
64-
map->name = stoupperx(map->name);
65-
for (j = 0; map->perms[j]; j++)
66-
map->perms[j] = stoupperx(map->perms[j]);
67-
}
68-
69-
isids_len = sizeof(initial_sid_to_string) / sizeof (char *);
70-
for (i = 1; i < isids_len; i++) {
71-
const char *s = initial_sid_to_string[i];
72-
73-
if (s)
74-
initial_sid_to_string[i] = stoupperx(s);
75-
}
76-
7762
fprintf(fout, "/* This file is automatically generated. Do not edit. */\n");
7863
fprintf(fout, "#ifndef _SELINUX_FLASK_H_\n#define _SELINUX_FLASK_H_\n\n");
7964

8065
for (i = 0; secclass_map[i].name; i++) {
81-
struct security_class_mapping *map = &secclass_map[i];
82-
fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1);
66+
char *name = stoupperx(secclass_map[i].name);
67+
68+
fprintf(fout, "#define SECCLASS_%-39s %2d\n", name, i+1);
69+
free(name);
8370
}
8471

8572
fprintf(fout, "\n");
8673

74+
isids_len = sizeof(initial_sid_to_string) / sizeof(char *);
8775
for (i = 1; i < isids_len; i++) {
8876
const char *s = initial_sid_to_string[i];
89-
if (s)
90-
fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i);
77+
if (s) {
78+
char *sidname = stoupperx(s);
79+
80+
fprintf(fout, "#define SECINITSID_%-39s %2d\n", sidname, i);
81+
free(sidname);
82+
}
9183
}
9284
fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1);
9385
fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n");
@@ -96,10 +88,14 @@ int main(int argc, char *argv[])
9688
fprintf(fout, "\tswitch (kern_tclass) {\n");
9789
for (i = 0; secclass_map[i].name; i++) {
9890
static char s[] = "SOCKET";
99-
struct security_class_mapping *map = &secclass_map[i];
100-
int len = strlen(map->name), l = sizeof(s) - 1;
101-
if (len >= l && memcmp(map->name + len - l, s, l) == 0)
102-
fprintf(fout, "\tcase SECCLASS_%s:\n", map->name);
91+
int len, l;
92+
char *name = stoupperx(secclass_map[i].name);
93+
94+
len = strlen(name);
95+
l = sizeof(s) - 1;
96+
if (len >= l && memcmp(name + len - l, s, l) == 0)
97+
fprintf(fout, "\tcase SECCLASS_%s:\n", name);
98+
free(name);
10399
}
104100
fprintf(fout, "\t\tsock = true;\n");
105101
fprintf(fout, "\t\tbreak;\n");
@@ -110,33 +106,52 @@ int main(int argc, char *argv[])
110106
fprintf(fout, "}\n");
111107

112108
fprintf(fout, "\n#endif\n");
113-
fclose(fout);
109+
110+
if (fclose(fout) != 0) {
111+
fprintf(stderr, "Could not successfully close %s: %s\n",
112+
argv[1], strerror(errno));
113+
exit(4);
114+
}
114115

115116
fout = fopen(argv[2], "w");
116117
if (!fout) {
117118
fprintf(stderr, "Could not open %s for writing: %s\n",
118119
argv[2], strerror(errno));
119-
exit(4);
120+
exit(5);
120121
}
121122

122123
fprintf(fout, "/* This file is automatically generated. Do not edit. */\n");
123124
fprintf(fout, "#ifndef _SELINUX_AV_PERMISSIONS_H_\n#define _SELINUX_AV_PERMISSIONS_H_\n\n");
124125

125126
for (i = 0; secclass_map[i].name; i++) {
126-
struct security_class_mapping *map = &secclass_map[i];
127-
int len = strlen(map->name);
127+
const struct security_class_mapping *map = &secclass_map[i];
128+
int len;
129+
char *name = stoupperx(map->name);
130+
131+
len = strlen(name);
128132
for (j = 0; map->perms[j]; j++) {
133+
char *permname;
134+
129135
if (j >= 32) {
130136
fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n",
131137
map->name, map->perms[j]);
132138
exit(5);
133139
}
134-
fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name,
135-
39-len, map->perms[j], 1U<<j);
140+
permname = stoupperx(map->perms[j]);
141+
fprintf(fout, "#define %s__%-*s 0x%08xU\n", name,
142+
39-len, permname, 1U<<j);
143+
free(permname);
136144
}
145+
free(name);
137146
}
138147

139148
fprintf(fout, "\n#endif\n");
140-
fclose(fout);
149+
150+
if (fclose(fout) != 0) {
151+
fprintf(stderr, "Could not successfully close %s: %s\n",
152+
argv[2], strerror(errno));
153+
exit(6);
154+
}
155+
141156
exit(0);
142157
}

scripts/selinux/mdp/mdp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ int main(int argc, char *argv[])
8282

8383
/* print out the class permissions */
8484
for (i = 0; secclass_map[i].name; i++) {
85-
struct security_class_mapping *map = &secclass_map[i];
85+
const struct security_class_mapping *map = &secclass_map[i];
8686
fprintf(fout, "class %s\n", map->name);
8787
fprintf(fout, "{\n");
8888
for (j = 0; map->perms[j]; j++)
@@ -103,7 +103,7 @@ int main(int argc, char *argv[])
103103
#define SYSTEMLOW "s0"
104104
#define SYSTEMHIGH "s1:c0.c1"
105105
for (i = 0; secclass_map[i].name; i++) {
106-
struct security_class_mapping *map = &secclass_map[i];
106+
const struct security_class_mapping *map = &secclass_map[i];
107107

108108
fprintf(fout, "mlsconstrain %s {\n", map->name);
109109
for (j = 0; map->perms[j]; j++)

security/selinux/avc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ static void avc_audit_pre_callback(struct audit_buffer *ab, void *a)
668668
struct common_audit_data *ad = a;
669669
struct selinux_audit_data *sad = ad->selinux_audit_data;
670670
u32 av = sad->audited;
671-
const char **perms;
671+
const char *const *perms;
672672
int i, perm;
673673

674674
audit_log_format(ab, "avc: %s ", sad->denied ? "denied" : "granted");

security/selinux/include/avc_ss.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct security_class_mapping {
1818
const char *perms[sizeof(u32) * 8 + 1];
1919
};
2020

21-
extern struct security_class_mapping secclass_map[];
21+
extern const struct security_class_mapping secclass_map[];
2222

2323
#endif /* _SELINUX_AVC_SS_H_ */
2424

security/selinux/include/classmap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
* Note: The name for any socket class should be suffixed by "socket",
3939
* and doesn't contain more than one substr of "socket".
4040
*/
41-
struct security_class_mapping secclass_map[] = {
41+
const struct security_class_mapping secclass_map[] = {
4242
{ "security",
4343
{ "compute_av", "compute_create", "compute_member",
4444
"check_context", "load_policy", "compute_relabel",

security/selinux/include/initial_sid_to_string.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* SPDX-License-Identifier: GPL-2.0 */
2-
static const char *initial_sid_to_string[] = {
2+
static const char *const initial_sid_to_string[] = {
33
NULL,
44
"kernel",
55
"security",

security/selinux/include/policycap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ enum {
1616
};
1717
#define POLICYDB_CAP_MAX (__POLICYDB_CAP_MAX - 1)
1818

19-
extern const char *selinux_policycap_names[__POLICYDB_CAP_MAX];
19+
extern const char *const selinux_policycap_names[__POLICYDB_CAP_MAX];
2020

2121
#endif /* _SELINUX_POLICYCAP_H_ */

security/selinux/include/policycap_names.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include "policycap.h"
66

77
/* Policy capability names */
8-
const char *selinux_policycap_names[__POLICYDB_CAP_MAX] = {
8+
const char *const selinux_policycap_names[__POLICYDB_CAP_MAX] = {
99
"network_peer_controls",
1010
"open_perms",
1111
"extended_socket_class",

security/selinux/ss/avtab.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ void avtab_hash_eval(struct avtab *h, char *tag)
385385
chain2_len_sum);
386386
}
387387

388-
static uint16_t spec_order[] = {
388+
static const uint16_t spec_order[] = {
389389
AVTAB_ALLOWED,
390390
AVTAB_AUDITDENY,
391391
AVTAB_AUDITALLOW,

security/selinux/ss/policydb.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct policydb_compat_info {
6161
};
6262

6363
/* These need to be updated if SYM_NUM or OCON_NUM changes */
64-
static struct policydb_compat_info policydb_compat[] = {
64+
static const struct policydb_compat_info policydb_compat[] = {
6565
{
6666
.version = POLICYDB_VERSION_BASE,
6767
.sym_num = SYM_NUM - 3,
@@ -159,18 +159,16 @@ static struct policydb_compat_info policydb_compat[] = {
159159
},
160160
};
161161

162-
static struct policydb_compat_info *policydb_lookup_compat(int version)
162+
static const struct policydb_compat_info *policydb_lookup_compat(int version)
163163
{
164164
int i;
165-
struct policydb_compat_info *info = NULL;
166165

167166
for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) {
168-
if (policydb_compat[i].version == version) {
169-
info = &policydb_compat[i];
170-
break;
171-
}
167+
if (policydb_compat[i].version == version)
168+
return &policydb_compat[i];
172169
}
173-
return info;
170+
171+
return NULL;
174172
}
175173

176174
/*
@@ -314,7 +312,7 @@ static int cat_destroy(void *key, void *datum, void *p)
314312
return 0;
315313
}
316314

317-
static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
315+
static int (*const destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
318316
common_destroy,
319317
cls_destroy,
320318
role_destroy,
@@ -669,7 +667,7 @@ static int cat_index(void *key, void *datum, void *datap)
669667
return 0;
670668
}
671669

672-
static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
670+
static int (*const index_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
673671
common_index,
674672
class_index,
675673
role_index,
@@ -1637,7 +1635,8 @@ static int cat_read(struct policydb *p, struct symtab *s, void *fp)
16371635
return rc;
16381636
}
16391637

1640-
static int (*read_f[SYM_NUM]) (struct policydb *p, struct symtab *s, void *fp) = {
1638+
static int (*const read_f[SYM_NUM]) (struct policydb *p,
1639+
struct symtab *s, void *fp) = {
16411640
common_read,
16421641
class_read,
16431642
role_read,
@@ -2208,7 +2207,7 @@ static int genfs_read(struct policydb *p, void *fp)
22082207
return rc;
22092208
}
22102209

2211-
static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
2210+
static int ocontext_read(struct policydb *p, const struct policydb_compat_info *info,
22122211
void *fp)
22132212
{
22142213
int i, j, rc;
@@ -2404,7 +2403,7 @@ int policydb_read(struct policydb *p, void *fp)
24042403
u32 len, nprim, nel, perm;
24052404

24062405
char *policydb_str;
2407-
struct policydb_compat_info *info;
2406+
const struct policydb_compat_info *info;
24082407

24092408
policydb_init(p);
24102409

@@ -3238,8 +3237,7 @@ static int user_write(void *vkey, void *datum, void *ptr)
32383237
return 0;
32393238
}
32403239

3241-
static int (*write_f[SYM_NUM]) (void *key, void *datum,
3242-
void *datap) = {
3240+
static int (*const write_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
32433241
common_write,
32443242
class_write,
32453243
role_write,
@@ -3250,7 +3248,7 @@ static int (*write_f[SYM_NUM]) (void *key, void *datum,
32503248
cat_write,
32513249
};
32523250

3253-
static int ocontext_write(struct policydb *p, struct policydb_compat_info *info,
3251+
static int ocontext_write(struct policydb *p, const struct policydb_compat_info *info,
32543252
void *fp)
32553253
{
32563254
unsigned int i, j, rc;
@@ -3607,7 +3605,7 @@ int policydb_write(struct policydb *p, void *fp)
36073605
__le32 buf[4];
36083606
u32 config;
36093607
size_t len;
3610-
struct policydb_compat_info *info;
3608+
const struct policydb_compat_info *info;
36113609

36123610
/*
36133611
* refuse to write policy older than compressed avtab

0 commit comments

Comments
 (0)