aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/ss/policydb.c
diff options
context:
space:
mode:
authorOndrej Mosnacek <omosnace@redhat.com>2020-04-20 15:27:31 +0200
committerPaul Moore <paul@paul-moore.com>2020-04-22 15:38:10 -0400
commit9521eb3ea19a828d8fd59a2785338fd742dbcf31 (patch)
treea80c11e93446cc3fb79d73b6d0ef884e402a3d0b /security/selinux/ss/policydb.c
parentselinux: implement new format of filename transitions (diff)
downloadlinux-dev-9521eb3ea19a828d8fd59a2785338fd742dbcf31.tar.xz
linux-dev-9521eb3ea19a828d8fd59a2785338fd742dbcf31.zip
selinux: don't produce incorrect filename_trans_count
I thought I fixed the counting in filename_trans_read_helper() to count the compat rule count correctly in the final version, but it's still wrong. To really count the same thing as in the compat path, we'd need to add up the cardinalities of stype bitmaps of all datums. Since the kernel currently doesn't implement an ebitmap_cardinality() function (and computing the proper count would just waste CPU cycles anyway), just document that we use the field only in case of the old format and stop updating it in filename_trans_read_helper(). Fixes: 430059024389 ("selinux: implement new format of filename transitions") Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
Diffstat (limited to 'security/selinux/ss/policydb.c')
-rw-r--r--security/selinux/ss/policydb.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c
index ef8d5b46b05b..1c0041576643 100644
--- a/security/selinux/ss/policydb.c
+++ b/security/selinux/ss/policydb.c
@@ -2016,12 +2016,7 @@ static int filename_trans_read_helper(struct policydb *p, void *fp)
if (rc)
goto out;
- rc = ebitmap_set_bit(&p->filename_trans_ttypes, ttype, 1);
- if (rc)
- return rc;
-
- p->filename_trans_count += ndatum;
- return 0;
+ return ebitmap_set_bit(&p->filename_trans_ttypes, ttype, 1);
out:
kfree(ft);
@@ -2051,7 +2046,7 @@ static int filename_trans_read(struct policydb *p, void *fp)
nel = le32_to_cpu(buf[0]);
if (p->policyvers < POLICYDB_VERSION_COMP_FTRANS) {
- p->filename_trans_count = nel;
+ p->compat_filename_trans_count = nel;
p->filename_trans = hashtab_create(filenametr_hash,
filenametr_cmp, (1 << 11));
if (!p->filename_trans)
@@ -3568,7 +3563,7 @@ static int filename_trans_write(struct policydb *p, void *fp)
return 0;
if (p->policyvers < POLICYDB_VERSION_COMP_FTRANS) {
- buf[0] = cpu_to_le32(p->filename_trans_count);
+ buf[0] = cpu_to_le32(p->compat_filename_trans_count);
rc = put_entry(buf, sizeof(u32), 1, fp);
if (rc)
return rc;