diff options
Diffstat (limited to 'security/selinux/ss/policydb.c')
| -rw-r--r-- | security/selinux/ss/policydb.c | 225 |
1 files changed, 201 insertions, 24 deletions
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index 2391761ae422..72e4a54973aa 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
| 32 | #include <linux/errno.h> | 32 | #include <linux/errno.h> |
| 33 | #include <linux/audit.h> | ||
| 33 | #include "security.h" | 34 | #include "security.h" |
| 34 | 35 | ||
| 35 | #include "policydb.h" | 36 | #include "policydb.h" |
| @@ -116,7 +117,12 @@ static struct policydb_compat_info policydb_compat[] = { | |||
| 116 | .version = POLICYDB_VERSION_PERMISSIVE, | 117 | .version = POLICYDB_VERSION_PERMISSIVE, |
| 117 | .sym_num = SYM_NUM, | 118 | .sym_num = SYM_NUM, |
| 118 | .ocon_num = OCON_NUM, | 119 | .ocon_num = OCON_NUM, |
| 119 | } | 120 | }, |
| 121 | { | ||
| 122 | .version = POLICYDB_VERSION_BOUNDARY, | ||
| 123 | .sym_num = SYM_NUM, | ||
| 124 | .ocon_num = OCON_NUM, | ||
| 125 | }, | ||
| 120 | }; | 126 | }; |
| 121 | 127 | ||
| 122 | static struct policydb_compat_info *policydb_lookup_compat(int version) | 128 | static struct policydb_compat_info *policydb_lookup_compat(int version) |
| @@ -254,7 +260,9 @@ static int role_index(void *key, void *datum, void *datap) | |||
| 254 | 260 | ||
| 255 | role = datum; | 261 | role = datum; |
| 256 | p = datap; | 262 | p = datap; |
| 257 | if (!role->value || role->value > p->p_roles.nprim) | 263 | if (!role->value |
| 264 | || role->value > p->p_roles.nprim | ||
| 265 | || role->bounds > p->p_roles.nprim) | ||
| 258 | return -EINVAL; | 266 | return -EINVAL; |
| 259 | p->p_role_val_to_name[role->value - 1] = key; | 267 | p->p_role_val_to_name[role->value - 1] = key; |
| 260 | p->role_val_to_struct[role->value - 1] = role; | 268 | p->role_val_to_struct[role->value - 1] = role; |
| @@ -270,9 +278,12 @@ static int type_index(void *key, void *datum, void *datap) | |||
| 270 | p = datap; | 278 | p = datap; |
| 271 | 279 | ||
| 272 | if (typdatum->primary) { | 280 | if (typdatum->primary) { |
| 273 | if (!typdatum->value || typdatum->value > p->p_types.nprim) | 281 | if (!typdatum->value |
| 282 | || typdatum->value > p->p_types.nprim | ||
| 283 | || typdatum->bounds > p->p_types.nprim) | ||
| 274 | return -EINVAL; | 284 | return -EINVAL; |
| 275 | p->p_type_val_to_name[typdatum->value - 1] = key; | 285 | p->p_type_val_to_name[typdatum->value - 1] = key; |
| 286 | p->type_val_to_struct[typdatum->value - 1] = typdatum; | ||
| 276 | } | 287 | } |
| 277 | 288 | ||
| 278 | return 0; | 289 | return 0; |
| @@ -285,7 +296,9 @@ static int user_index(void *key, void *datum, void *datap) | |||
| 285 | 296 | ||
| 286 | usrdatum = datum; | 297 | usrdatum = datum; |
| 287 | p = datap; | 298 | p = datap; |
| 288 | if (!usrdatum->value || usrdatum->value > p->p_users.nprim) | 299 | if (!usrdatum->value |
| 300 | || usrdatum->value > p->p_users.nprim | ||
| 301 | || usrdatum->bounds > p->p_users.nprim) | ||
| 289 | return -EINVAL; | 302 | return -EINVAL; |
| 290 | p->p_user_val_to_name[usrdatum->value - 1] = key; | 303 | p->p_user_val_to_name[usrdatum->value - 1] = key; |
| 291 | p->user_val_to_struct[usrdatum->value - 1] = usrdatum; | 304 | p->user_val_to_struct[usrdatum->value - 1] = usrdatum; |
| @@ -438,6 +451,14 @@ static int policydb_index_others(struct policydb *p) | |||
| 438 | goto out; | 451 | goto out; |
| 439 | } | 452 | } |
| 440 | 453 | ||
| 454 | p->type_val_to_struct = | ||
| 455 | kmalloc(p->p_types.nprim * sizeof(*(p->type_val_to_struct)), | ||
| 456 | GFP_KERNEL); | ||
| 457 | if (!p->type_val_to_struct) { | ||
| 458 | rc = -ENOMEM; | ||
| 459 | goto out; | ||
| 460 | } | ||
| 461 | |||
| 441 | if (cond_init_bool_indexes(p)) { | 462 | if (cond_init_bool_indexes(p)) { |
| 442 | rc = -ENOMEM; | 463 | rc = -ENOMEM; |
| 443 | goto out; | 464 | goto out; |
| @@ -625,6 +646,7 @@ void policydb_destroy(struct policydb *p) | |||
| 625 | kfree(p->class_val_to_struct); | 646 | kfree(p->class_val_to_struct); |
| 626 | kfree(p->role_val_to_struct); | 647 | kfree(p->role_val_to_struct); |
| 627 | kfree(p->user_val_to_struct); | 648 | kfree(p->user_val_to_struct); |
| 649 | kfree(p->type_val_to_struct); | ||
| 628 | 650 | ||
| 629 | avtab_destroy(&p->te_avtab); | 651 | avtab_destroy(&p->te_avtab); |
| 630 | 652 | ||
| @@ -932,7 +954,7 @@ static int perm_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 932 | rc = next_entry(key, fp, len); | 954 | rc = next_entry(key, fp, len); |
| 933 | if (rc < 0) | 955 | if (rc < 0) |
| 934 | goto bad; | 956 | goto bad; |
| 935 | key[len] = 0; | 957 | key[len] = '\0'; |
| 936 | 958 | ||
| 937 | rc = hashtab_insert(h, key, perdatum); | 959 | rc = hashtab_insert(h, key, perdatum); |
| 938 | if (rc) | 960 | if (rc) |
| @@ -979,7 +1001,7 @@ static int common_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 979 | rc = next_entry(key, fp, len); | 1001 | rc = next_entry(key, fp, len); |
| 980 | if (rc < 0) | 1002 | if (rc < 0) |
| 981 | goto bad; | 1003 | goto bad; |
| 982 | key[len] = 0; | 1004 | key[len] = '\0'; |
| 983 | 1005 | ||
| 984 | for (i = 0; i < nel; i++) { | 1006 | for (i = 0; i < nel; i++) { |
| 985 | rc = perm_read(p, comdatum->permissions.table, fp); | 1007 | rc = perm_read(p, comdatum->permissions.table, fp); |
| @@ -1117,7 +1139,7 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1117 | rc = next_entry(key, fp, len); | 1139 | rc = next_entry(key, fp, len); |
| 1118 | if (rc < 0) | 1140 | if (rc < 0) |
| 1119 | goto bad; | 1141 | goto bad; |
| 1120 | key[len] = 0; | 1142 | key[len] = '\0'; |
| 1121 | 1143 | ||
| 1122 | if (len2) { | 1144 | if (len2) { |
| 1123 | cladatum->comkey = kmalloc(len2 + 1, GFP_KERNEL); | 1145 | cladatum->comkey = kmalloc(len2 + 1, GFP_KERNEL); |
| @@ -1128,7 +1150,7 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1128 | rc = next_entry(cladatum->comkey, fp, len2); | 1150 | rc = next_entry(cladatum->comkey, fp, len2); |
| 1129 | if (rc < 0) | 1151 | if (rc < 0) |
| 1130 | goto bad; | 1152 | goto bad; |
| 1131 | cladatum->comkey[len2] = 0; | 1153 | cladatum->comkey[len2] = '\0'; |
| 1132 | 1154 | ||
| 1133 | cladatum->comdatum = hashtab_search(p->p_commons.table, | 1155 | cladatum->comdatum = hashtab_search(p->p_commons.table, |
| 1134 | cladatum->comkey); | 1156 | cladatum->comkey); |
| @@ -1176,8 +1198,8 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1176 | { | 1198 | { |
| 1177 | char *key = NULL; | 1199 | char *key = NULL; |
| 1178 | struct role_datum *role; | 1200 | struct role_datum *role; |
| 1179 | int rc; | 1201 | int rc, to_read = 2; |
| 1180 | __le32 buf[2]; | 1202 | __le32 buf[3]; |
| 1181 | u32 len; | 1203 | u32 len; |
| 1182 | 1204 | ||
| 1183 | role = kzalloc(sizeof(*role), GFP_KERNEL); | 1205 | role = kzalloc(sizeof(*role), GFP_KERNEL); |
| @@ -1186,12 +1208,17 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1186 | goto out; | 1208 | goto out; |
| 1187 | } | 1209 | } |
| 1188 | 1210 | ||
| 1189 | rc = next_entry(buf, fp, sizeof buf); | 1211 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) |
| 1212 | to_read = 3; | ||
| 1213 | |||
| 1214 | rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); | ||
| 1190 | if (rc < 0) | 1215 | if (rc < 0) |
| 1191 | goto bad; | 1216 | goto bad; |
| 1192 | 1217 | ||
| 1193 | len = le32_to_cpu(buf[0]); | 1218 | len = le32_to_cpu(buf[0]); |
| 1194 | role->value = le32_to_cpu(buf[1]); | 1219 | role->value = le32_to_cpu(buf[1]); |
| 1220 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) | ||
| 1221 | role->bounds = le32_to_cpu(buf[2]); | ||
| 1195 | 1222 | ||
| 1196 | key = kmalloc(len + 1, GFP_KERNEL); | 1223 | key = kmalloc(len + 1, GFP_KERNEL); |
| 1197 | if (!key) { | 1224 | if (!key) { |
| @@ -1201,7 +1228,7 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1201 | rc = next_entry(key, fp, len); | 1228 | rc = next_entry(key, fp, len); |
| 1202 | if (rc < 0) | 1229 | if (rc < 0) |
| 1203 | goto bad; | 1230 | goto bad; |
| 1204 | key[len] = 0; | 1231 | key[len] = '\0'; |
| 1205 | 1232 | ||
| 1206 | rc = ebitmap_read(&role->dominates, fp); | 1233 | rc = ebitmap_read(&role->dominates, fp); |
| 1207 | if (rc) | 1234 | if (rc) |
| @@ -1236,8 +1263,8 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1236 | { | 1263 | { |
| 1237 | char *key = NULL; | 1264 | char *key = NULL; |
| 1238 | struct type_datum *typdatum; | 1265 | struct type_datum *typdatum; |
| 1239 | int rc; | 1266 | int rc, to_read = 3; |
| 1240 | __le32 buf[3]; | 1267 | __le32 buf[4]; |
| 1241 | u32 len; | 1268 | u32 len; |
| 1242 | 1269 | ||
| 1243 | typdatum = kzalloc(sizeof(*typdatum), GFP_KERNEL); | 1270 | typdatum = kzalloc(sizeof(*typdatum), GFP_KERNEL); |
| @@ -1246,13 +1273,27 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1246 | return rc; | 1273 | return rc; |
| 1247 | } | 1274 | } |
| 1248 | 1275 | ||
| 1249 | rc = next_entry(buf, fp, sizeof buf); | 1276 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) |
| 1277 | to_read = 4; | ||
| 1278 | |||
| 1279 | rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); | ||
| 1250 | if (rc < 0) | 1280 | if (rc < 0) |
| 1251 | goto bad; | 1281 | goto bad; |
| 1252 | 1282 | ||
| 1253 | len = le32_to_cpu(buf[0]); | 1283 | len = le32_to_cpu(buf[0]); |
| 1254 | typdatum->value = le32_to_cpu(buf[1]); | 1284 | typdatum->value = le32_to_cpu(buf[1]); |
| 1255 | typdatum->primary = le32_to_cpu(buf[2]); | 1285 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) { |
| 1286 | u32 prop = le32_to_cpu(buf[2]); | ||
| 1287 | |||
| 1288 | if (prop & TYPEDATUM_PROPERTY_PRIMARY) | ||
| 1289 | typdatum->primary = 1; | ||
| 1290 | if (prop & TYPEDATUM_PROPERTY_ATTRIBUTE) | ||
| 1291 | typdatum->attribute = 1; | ||
| 1292 | |||
| 1293 | typdatum->bounds = le32_to_cpu(buf[3]); | ||
| 1294 | } else { | ||
| 1295 | typdatum->primary = le32_to_cpu(buf[2]); | ||
| 1296 | } | ||
| 1256 | 1297 | ||
| 1257 | key = kmalloc(len + 1, GFP_KERNEL); | 1298 | key = kmalloc(len + 1, GFP_KERNEL); |
| 1258 | if (!key) { | 1299 | if (!key) { |
| @@ -1262,7 +1303,7 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1262 | rc = next_entry(key, fp, len); | 1303 | rc = next_entry(key, fp, len); |
| 1263 | if (rc < 0) | 1304 | if (rc < 0) |
| 1264 | goto bad; | 1305 | goto bad; |
| 1265 | key[len] = 0; | 1306 | key[len] = '\0'; |
| 1266 | 1307 | ||
| 1267 | rc = hashtab_insert(h, key, typdatum); | 1308 | rc = hashtab_insert(h, key, typdatum); |
| 1268 | if (rc) | 1309 | if (rc) |
| @@ -1309,8 +1350,8 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1309 | { | 1350 | { |
| 1310 | char *key = NULL; | 1351 | char *key = NULL; |
| 1311 | struct user_datum *usrdatum; | 1352 | struct user_datum *usrdatum; |
| 1312 | int rc; | 1353 | int rc, to_read = 2; |
| 1313 | __le32 buf[2]; | 1354 | __le32 buf[3]; |
| 1314 | u32 len; | 1355 | u32 len; |
| 1315 | 1356 | ||
| 1316 | usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL); | 1357 | usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL); |
| @@ -1319,12 +1360,17 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1319 | goto out; | 1360 | goto out; |
| 1320 | } | 1361 | } |
| 1321 | 1362 | ||
| 1322 | rc = next_entry(buf, fp, sizeof buf); | 1363 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) |
| 1364 | to_read = 3; | ||
| 1365 | |||
| 1366 | rc = next_entry(buf, fp, sizeof(buf[0]) * to_read); | ||
| 1323 | if (rc < 0) | 1367 | if (rc < 0) |
| 1324 | goto bad; | 1368 | goto bad; |
| 1325 | 1369 | ||
| 1326 | len = le32_to_cpu(buf[0]); | 1370 | len = le32_to_cpu(buf[0]); |
| 1327 | usrdatum->value = le32_to_cpu(buf[1]); | 1371 | usrdatum->value = le32_to_cpu(buf[1]); |
| 1372 | if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) | ||
| 1373 | usrdatum->bounds = le32_to_cpu(buf[2]); | ||
| 1328 | 1374 | ||
| 1329 | key = kmalloc(len + 1, GFP_KERNEL); | 1375 | key = kmalloc(len + 1, GFP_KERNEL); |
| 1330 | if (!key) { | 1376 | if (!key) { |
| @@ -1334,7 +1380,7 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1334 | rc = next_entry(key, fp, len); | 1380 | rc = next_entry(key, fp, len); |
| 1335 | if (rc < 0) | 1381 | if (rc < 0) |
| 1336 | goto bad; | 1382 | goto bad; |
| 1337 | key[len] = 0; | 1383 | key[len] = '\0'; |
| 1338 | 1384 | ||
| 1339 | rc = ebitmap_read(&usrdatum->roles, fp); | 1385 | rc = ebitmap_read(&usrdatum->roles, fp); |
| 1340 | if (rc) | 1386 | if (rc) |
| @@ -1388,7 +1434,7 @@ static int sens_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1388 | rc = next_entry(key, fp, len); | 1434 | rc = next_entry(key, fp, len); |
| 1389 | if (rc < 0) | 1435 | if (rc < 0) |
| 1390 | goto bad; | 1436 | goto bad; |
| 1391 | key[len] = 0; | 1437 | key[len] = '\0'; |
| 1392 | 1438 | ||
| 1393 | levdatum->level = kmalloc(sizeof(struct mls_level), GFP_ATOMIC); | 1439 | levdatum->level = kmalloc(sizeof(struct mls_level), GFP_ATOMIC); |
| 1394 | if (!levdatum->level) { | 1440 | if (!levdatum->level) { |
| @@ -1440,7 +1486,7 @@ static int cat_read(struct policydb *p, struct hashtab *h, void *fp) | |||
| 1440 | rc = next_entry(key, fp, len); | 1486 | rc = next_entry(key, fp, len); |
| 1441 | if (rc < 0) | 1487 | if (rc < 0) |
| 1442 | goto bad; | 1488 | goto bad; |
| 1443 | key[len] = 0; | 1489 | key[len] = '\0'; |
| 1444 | 1490 | ||
| 1445 | rc = hashtab_insert(h, key, catdatum); | 1491 | rc = hashtab_insert(h, key, catdatum); |
| 1446 | if (rc) | 1492 | if (rc) |
| @@ -1465,6 +1511,133 @@ static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) | |||
| 1465 | cat_read, | 1511 | cat_read, |
| 1466 | }; | 1512 | }; |
| 1467 | 1513 | ||
| 1514 | static int user_bounds_sanity_check(void *key, void *datum, void *datap) | ||
| 1515 | { | ||
| 1516 | struct user_datum *upper, *user; | ||
| 1517 | struct policydb *p = datap; | ||
| 1518 | int depth = 0; | ||
| 1519 | |||
| 1520 | upper = user = datum; | ||
| 1521 | while (upper->bounds) { | ||
| 1522 | struct ebitmap_node *node; | ||
| 1523 | unsigned long bit; | ||
| 1524 | |||
| 1525 | if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { | ||
| 1526 | printk(KERN_ERR "SELinux: user %s: " | ||
| 1527 | "too deep or looped boundary", | ||
| 1528 | (char *) key); | ||
| 1529 | return -EINVAL; | ||
| 1530 | } | ||
| 1531 | |||
| 1532 | upper = p->user_val_to_struct[upper->bounds - 1]; | ||
| 1533 | ebitmap_for_each_positive_bit(&user->roles, node, bit) { | ||
| 1534 | if (ebitmap_get_bit(&upper->roles, bit)) | ||
| 1535 | continue; | ||
| 1536 | |||
| 1537 | printk(KERN_ERR | ||
| 1538 | "SELinux: boundary violated policy: " | ||
| 1539 | "user=%s role=%s bounds=%s\n", | ||
| 1540 | p->p_user_val_to_name[user->value - 1], | ||
| 1541 | p->p_role_val_to_name[bit], | ||
| 1542 | p->p_user_val_to_name[upper->value - 1]); | ||
| 1543 | |||
| 1544 | return -EINVAL; | ||
| 1545 | } | ||
| 1546 | } | ||
| 1547 | |||
| 1548 | return 0; | ||
| 1549 | } | ||
| 1550 | |||
| 1551 | static int role_bounds_sanity_check(void *key, void *datum, void *datap) | ||
| 1552 | { | ||
| 1553 | struct role_datum *upper, *role; | ||
| 1554 | struct policydb *p = datap; | ||
| 1555 | int depth = 0; | ||
| 1556 | |||
| 1557 | upper = role = datum; | ||
| 1558 | while (upper->bounds) { | ||
| 1559 | struct ebitmap_node *node; | ||
| 1560 | unsigned long bit; | ||
| 1561 | |||
| 1562 | if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { | ||
| 1563 | printk(KERN_ERR "SELinux: role %s: " | ||
| 1564 | "too deep or looped bounds\n", | ||
| 1565 | (char *) key); | ||
| 1566 | return -EINVAL; | ||
| 1567 | } | ||
| 1568 | |||
| 1569 | upper = p->role_val_to_struct[upper->bounds - 1]; | ||
| 1570 | ebitmap_for_each_positive_bit(&role->types, node, bit) { | ||
| 1571 | if (ebitmap_get_bit(&upper->types, bit)) | ||
| 1572 | continue; | ||
| 1573 | |||
| 1574 | printk(KERN_ERR | ||
| 1575 | "SELinux: boundary violated policy: " | ||
| 1576 | "role=%s type=%s bounds=%s\n", | ||
| 1577 | p->p_role_val_to_name[role->value - 1], | ||
| 1578 | p->p_type_val_to_name[bit], | ||
| 1579 | p->p_role_val_to_name[upper->value - 1]); | ||
| 1580 | |||
| 1581 | return -EINVAL; | ||
| 1582 | } | ||
| 1583 | } | ||
| 1584 | |||
| 1585 | return 0; | ||
| 1586 | } | ||
| 1587 | |||
| 1588 | static int type_bounds_sanity_check(void *key, void *datum, void *datap) | ||
| 1589 | { | ||
| 1590 | struct type_datum *upper, *type; | ||
| 1591 | struct policydb *p = datap; | ||
| 1592 | int depth = 0; | ||
| 1593 | |||
| 1594 | upper = type = datum; | ||
| 1595 | while (upper->bounds) { | ||
| 1596 | if (++depth == POLICYDB_BOUNDS_MAXDEPTH) { | ||
| 1597 | printk(KERN_ERR "SELinux: type %s: " | ||
| 1598 | "too deep or looped boundary\n", | ||
| 1599 | (char *) key); | ||
| 1600 | return -EINVAL; | ||
| 1601 | } | ||
| 1602 | |||
| 1603 | upper = p->type_val_to_struct[upper->bounds - 1]; | ||
| 1604 | if (upper->attribute) { | ||
| 1605 | printk(KERN_ERR "SELinux: type %s: " | ||
| 1606 | "bounded by attribute %s", | ||
| 1607 | (char *) key, | ||
| 1608 | p->p_type_val_to_name[upper->value - 1]); | ||
| 1609 | return -EINVAL; | ||
| 1610 | } | ||
| 1611 | } | ||
| 1612 | |||
| 1613 | return 0; | ||
| 1614 | } | ||
| 1615 | |||
| 1616 | static int policydb_bounds_sanity_check(struct policydb *p) | ||
| 1617 | { | ||
| 1618 | int rc; | ||
| 1619 | |||
| 1620 | if (p->policyvers < POLICYDB_VERSION_BOUNDARY) | ||
| 1621 | return 0; | ||
| 1622 | |||
| 1623 | rc = hashtab_map(p->p_users.table, | ||
| 1624 | user_bounds_sanity_check, p); | ||
| 1625 | if (rc) | ||
| 1626 | return rc; | ||
| 1627 | |||
| 1628 | rc = hashtab_map(p->p_roles.table, | ||
| 1629 | role_bounds_sanity_check, p); | ||
| 1630 | if (rc) | ||
| 1631 | return rc; | ||
| 1632 | |||
| 1633 | rc = hashtab_map(p->p_types.table, | ||
| 1634 | type_bounds_sanity_check, p); | ||
| 1635 | if (rc) | ||
| 1636 | return rc; | ||
| 1637 | |||
| 1638 | return 0; | ||
| 1639 | } | ||
| 1640 | |||
| 1468 | extern int ss_initialized; | 1641 | extern int ss_initialized; |
| 1469 | 1642 | ||
| 1470 | /* | 1643 | /* |
| @@ -1523,7 +1696,7 @@ int policydb_read(struct policydb *p, void *fp) | |||
| 1523 | kfree(policydb_str); | 1696 | kfree(policydb_str); |
| 1524 | goto bad; | 1697 | goto bad; |
| 1525 | } | 1698 | } |
| 1526 | policydb_str[len] = 0; | 1699 | policydb_str[len] = '\0'; |
| 1527 | if (strcmp(policydb_str, POLICYDB_STRING)) { | 1700 | if (strcmp(policydb_str, POLICYDB_STRING)) { |
| 1528 | printk(KERN_ERR "SELinux: policydb string %s does not match " | 1701 | printk(KERN_ERR "SELinux: policydb string %s does not match " |
| 1529 | "my string %s\n", policydb_str, POLICYDB_STRING); | 1702 | "my string %s\n", policydb_str, POLICYDB_STRING); |
| @@ -1961,6 +2134,10 @@ int policydb_read(struct policydb *p, void *fp) | |||
| 1961 | goto bad; | 2134 | goto bad; |
| 1962 | } | 2135 | } |
| 1963 | 2136 | ||
| 2137 | rc = policydb_bounds_sanity_check(p); | ||
| 2138 | if (rc) | ||
| 2139 | goto bad; | ||
| 2140 | |||
| 1964 | rc = 0; | 2141 | rc = 0; |
| 1965 | out: | 2142 | out: |
| 1966 | return rc; | 2143 | return rc; |
