diff options
-rw-r--r-- | security/selinux/ss/policydb.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index 6b576e588725..daecdfb15a9c 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
@@ -828,9 +828,11 @@ void policydb_destroy(struct policydb *p) | |||
828 | hashtab_map(p->range_tr, range_tr_destroy, NULL); | 828 | hashtab_map(p->range_tr, range_tr_destroy, NULL); |
829 | hashtab_destroy(p->range_tr); | 829 | hashtab_destroy(p->range_tr); |
830 | 830 | ||
831 | for (i = 0; i < p->p_types.nprim; i++) | 831 | if (p->type_attr_map_array) { |
832 | ebitmap_destroy(&p->type_attr_map_array[i]); | 832 | for (i = 0; i < p->p_types.nprim; i++) |
833 | kvfree(p->type_attr_map_array); | 833 | ebitmap_destroy(&p->type_attr_map_array[i]); |
834 | kvfree(p->type_attr_map_array); | ||
835 | } | ||
834 | 836 | ||
835 | ebitmap_destroy(&p->filename_trans_ttypes); | 837 | ebitmap_destroy(&p->filename_trans_ttypes); |
836 | ebitmap_destroy(&p->policycaps); | 838 | ebitmap_destroy(&p->policycaps); |
@@ -2496,10 +2498,13 @@ int policydb_read(struct policydb *p, void *fp) | |||
2496 | if (!p->type_attr_map_array) | 2498 | if (!p->type_attr_map_array) |
2497 | goto bad; | 2499 | goto bad; |
2498 | 2500 | ||
2501 | /* just in case ebitmap_init() becomes more than just a memset(0): */ | ||
2502 | for (i = 0; i < p->p_types.nprim; i++) | ||
2503 | ebitmap_init(&p->type_attr_map_array[i]); | ||
2504 | |||
2499 | for (i = 0; i < p->p_types.nprim; i++) { | 2505 | for (i = 0; i < p->p_types.nprim; i++) { |
2500 | struct ebitmap *e = &p->type_attr_map_array[i]; | 2506 | struct ebitmap *e = &p->type_attr_map_array[i]; |
2501 | 2507 | ||
2502 | ebitmap_init(e); | ||
2503 | if (p->policyvers >= POLICYDB_VERSION_AVTAB) { | 2508 | if (p->policyvers >= POLICYDB_VERSION_AVTAB) { |
2504 | rc = ebitmap_read(e, fp); | 2509 | rc = ebitmap_read(e, fp); |
2505 | if (rc) | 2510 | if (rc) |