summaryrefslogtreecommitdiff
path: root/security/selinux/ss/services.c
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2011-04-28 15:11:21 -0400
committerEric Paris <eparis@redhat.com>2011-04-28 15:15:53 -0400
commit2463c26d50adc282d19317013ba0ff473823ca47 (patch)
treee92438150bb380c0dc0867b00f1ae89f73646b2a /security/selinux/ss/services.c
parent3f058ef7787e1b48720622346de9a5317aeb749a (diff)
downloadlwn-2463c26d50adc282d19317013ba0ff473823ca47.tar.gz
lwn-2463c26d50adc282d19317013ba0ff473823ca47.zip
SELinux: put name based create rules in a hashtable
To shorten the list we need to run if filename trans rules exist for the type of the given parent directory I put them in a hashtable. Given the policy we are expecting to use in Fedora this takes the worst case list run from about 5,000 entries to 17. Signed-off-by: Eric Paris <eparis@redhat.com> Reviewed-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux/ss/services.c')
-rw-r--r--security/selinux/ss/services.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c
index 6a22eaebf3b7..e11b4b038f4a 100644
--- a/security/selinux/ss/services.c
+++ b/security/selinux/ss/services.c
@@ -1362,7 +1362,8 @@ static void filename_compute_type(struct policydb *p, struct context *newcontext
u32 stype, u32 ttype, u16 tclass,
const char *objname)
{
- struct filename_trans *ft;
+ struct filename_trans ft;
+ struct filename_trans_datum *otype;
/*
* Most filename trans rules are going to live in specific directories
@@ -1372,15 +1373,14 @@ static void filename_compute_type(struct policydb *p, struct context *newcontext
if (!ebitmap_get_bit(&p->filename_trans_ttypes, ttype))
return;
- for (ft = p->filename_trans; ft; ft = ft->next) {
- if (ft->stype == stype &&
- ft->ttype == ttype &&
- ft->tclass == tclass &&
- !strcmp(ft->name, objname)) {
- newcontext->type = ft->otype;
- return;
- }
- }
+ ft.stype = stype;
+ ft.ttype = ttype;
+ ft.tclass = tclass;
+ ft.name = objname;
+
+ otype = hashtab_search(p->filename_trans, &ft);
+ if (otype)
+ newcontext->type = otype->otype;
}
static int security_compute_sid(u32 ssid,