diff options
author | Eric Paris <eparis@redhat.com> | 2010-07-29 23:02:34 -0400 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2010-08-02 01:38:39 -0400 |
commit | 6371dcd36f649d9d07823f31400618155a20dde1 (patch) | |
tree | a08c4ed2ec77225abbfcc099e78ae8d643429787 /security/selinux/ss/policydb.h | |
parent | 016d825fe02cd20fd8803ca37a1e6d428fe878f6 (diff) |
selinux: convert the policy type_attr_map to flex_array
Current selinux policy can have over 3000 types. The type_attr_map in
policy is an array sized by the number of types times sizeof(struct ebitmap)
(12 on x86_64). Basic math tells us the array is going to be of length
3000 x 12 = 36,000 bytes. The largest 'safe' allocation on a long running
system is 16k. Most of the time a 32k allocation will work. But on long
running systems a 64k allocation (what we need) can fail quite regularly.
In order to deal with this I am converting the type_attr_map to use
flex_arrays. Let the library code deal with breaking this into PAGE_SIZE
pieces.
-v2
rework some of the if(!obj) BUG() to be BUG_ON(!obj)
drop flex_array_put() calls and just use a _get() object directly
-v3
make apply to James' tree (drop the policydb_write changes)
Signed-off-by: Eric Paris <eparis@redhat.com>
Acked-by: Stephen D. Smalley <sds@tycho.nsa.gov>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux/ss/policydb.h')
-rw-r--r-- | security/selinux/ss/policydb.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/security/selinux/ss/policydb.h b/security/selinux/ss/policydb.h index 26d9adf8542b..310e94442cb8 100644 --- a/security/selinux/ss/policydb.h +++ b/security/selinux/ss/policydb.h | |||
@@ -24,6 +24,8 @@ | |||
24 | #ifndef _SS_POLICYDB_H_ | 24 | #ifndef _SS_POLICYDB_H_ |
25 | #define _SS_POLICYDB_H_ | 25 | #define _SS_POLICYDB_H_ |
26 | 26 | ||
27 | #include <linux/flex_array.h> | ||
28 | |||
27 | #include "symtab.h" | 29 | #include "symtab.h" |
28 | #include "avtab.h" | 30 | #include "avtab.h" |
29 | #include "sidtab.h" | 31 | #include "sidtab.h" |
@@ -246,7 +248,7 @@ struct policydb { | |||
246 | struct hashtab *range_tr; | 248 | struct hashtab *range_tr; |
247 | 249 | ||
248 | /* type -> attribute reverse mapping */ | 250 | /* type -> attribute reverse mapping */ |
249 | struct ebitmap *type_attr_map; | 251 | struct flex_array *type_attr_map_array; |
250 | 252 | ||
251 | struct ebitmap policycaps; | 253 | struct ebitmap policycaps; |
252 | 254 | ||