1a10e763bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * A policy database (policydb) specifies the
41da177e4SLinus Torvalds * configuration data for the security policy.
51da177e4SLinus Torvalds *
6*0fe53224SStephen Smalley * Author : Stephen Smalley, <stephen.smalley.work@gmail.com>
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
91da177e4SLinus Torvalds /*
101da177e4SLinus Torvalds * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
111da177e4SLinus Torvalds *
121da177e4SLinus Torvalds * Support for enhanced MLS infrastructure.
131da177e4SLinus Torvalds *
141da177e4SLinus Torvalds * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
151da177e4SLinus Torvalds *
161da177e4SLinus Torvalds * Added conditional policy language extensions
171da177e4SLinus Torvalds *
181da177e4SLinus Torvalds * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
191da177e4SLinus Torvalds * Copyright (C) 2003 - 2004 Tresys Technology, LLC
201da177e4SLinus Torvalds */
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds #ifndef _SS_POLICYDB_H_
231da177e4SLinus Torvalds #define _SS_POLICYDB_H_
241da177e4SLinus Torvalds
251da177e4SLinus Torvalds #include "symtab.h"
261da177e4SLinus Torvalds #include "avtab.h"
271da177e4SLinus Torvalds #include "sidtab.h"
280719aaf5SGuido Trentalancia #include "ebitmap.h"
290719aaf5SGuido Trentalancia #include "mls_types.h"
301da177e4SLinus Torvalds #include "context.h"
311da177e4SLinus Torvalds #include "constraint.h"
321da177e4SLinus Torvalds
331da177e4SLinus Torvalds /*
341da177e4SLinus Torvalds * A datum type is defined for each kind of symbol
351da177e4SLinus Torvalds * in the configuration data: individual permissions,
361da177e4SLinus Torvalds * common prefixes for access vectors, classes,
371da177e4SLinus Torvalds * users, roles, types, sensitivities, categories, etc.
381da177e4SLinus Torvalds */
391da177e4SLinus Torvalds
401da177e4SLinus Torvalds /* Permission attributes */
411da177e4SLinus Torvalds struct perm_datum {
421da177e4SLinus Torvalds u32 value; /* permission bit + 1 */
431da177e4SLinus Torvalds };
441da177e4SLinus Torvalds
451da177e4SLinus Torvalds /* Attributes of a common prefix for access vectors */
461da177e4SLinus Torvalds struct common_datum {
471da177e4SLinus Torvalds u32 value; /* internal common value */
481da177e4SLinus Torvalds struct symtab permissions; /* common permissions */
491da177e4SLinus Torvalds };
501da177e4SLinus Torvalds
511da177e4SLinus Torvalds /* Class attributes */
521da177e4SLinus Torvalds struct class_datum {
531da177e4SLinus Torvalds u32 value; /* class value */
541da177e4SLinus Torvalds char *comkey; /* common name */
551da177e4SLinus Torvalds struct common_datum *comdatum; /* common datum */
561da177e4SLinus Torvalds struct symtab permissions; /* class-specific permission symbol table */
571da177e4SLinus Torvalds struct constraint_node *constraints; /* constraints on class permissions */
581da177e4SLinus Torvalds struct constraint_node *validatetrans; /* special transition rules */
59eed7795dSEric Paris /* Options how a new object user, role, and type should be decided */
60aa893269SEric Paris #define DEFAULT_SOURCE 1
61aa893269SEric Paris #define DEFAULT_TARGET 2
62aa893269SEric Paris char default_user;
63aa893269SEric Paris char default_role;
64eed7795dSEric Paris char default_type;
65aa893269SEric Paris /* Options how a new object range should be decided */
66aa893269SEric Paris #define DEFAULT_SOURCE_LOW 1
67aa893269SEric Paris #define DEFAULT_SOURCE_HIGH 2
68aa893269SEric Paris #define DEFAULT_SOURCE_LOW_HIGH 3
69aa893269SEric Paris #define DEFAULT_TARGET_LOW 4
70aa893269SEric Paris #define DEFAULT_TARGET_HIGH 5
71aa893269SEric Paris #define DEFAULT_TARGET_LOW_HIGH 6
7242345b68SJoshua Brindle #define DEFAULT_GLBLUB 7
73aa893269SEric Paris char default_range;
741da177e4SLinus Torvalds };
751da177e4SLinus Torvalds
761da177e4SLinus Torvalds /* Role attributes */
771da177e4SLinus Torvalds struct role_datum {
781da177e4SLinus Torvalds u32 value; /* internal role value */
79d9250deaSKaiGai Kohei u32 bounds; /* boundary of role */
801da177e4SLinus Torvalds struct ebitmap dominates; /* set of roles dominated by this role */
811da177e4SLinus Torvalds struct ebitmap types; /* set of authorized types for role */
821da177e4SLinus Torvalds };
831da177e4SLinus Torvalds
84e67b2ec9SOndrej Mosnacek struct role_trans_key {
851da177e4SLinus Torvalds u32 role; /* current role */
868023976cSHarry Ciao u32 type; /* program executable type, or new object type */
878023976cSHarry Ciao u32 tclass; /* process class, or new object class */
88e67b2ec9SOndrej Mosnacek };
89e67b2ec9SOndrej Mosnacek
90e67b2ec9SOndrej Mosnacek struct role_trans_datum {
911da177e4SLinus Torvalds u32 new_role; /* new role */
921da177e4SLinus Torvalds };
931da177e4SLinus Torvalds
94c3a27611SOndrej Mosnacek struct filename_trans_key {
95652bb9b0SEric Paris u32 ttype; /* parent dir context */
96652bb9b0SEric Paris u16 tclass; /* class of new object */
97652bb9b0SEric Paris const char *name; /* last path component */
982463c26dSEric Paris };
992463c26dSEric Paris
1002463c26dSEric Paris struct filename_trans_datum {
101c3a27611SOndrej Mosnacek struct ebitmap stypes; /* bitmap of source types for this otype */
102c3a27611SOndrej Mosnacek u32 otype; /* resulting type of new object */
103c3a27611SOndrej Mosnacek struct filename_trans_datum *next; /* record for next otype*/
104652bb9b0SEric Paris };
105652bb9b0SEric Paris
1061da177e4SLinus Torvalds struct role_allow {
1071da177e4SLinus Torvalds u32 role; /* current role */
1081da177e4SLinus Torvalds u32 new_role; /* new role */
1091da177e4SLinus Torvalds struct role_allow *next;
1101da177e4SLinus Torvalds };
1111da177e4SLinus Torvalds
1121da177e4SLinus Torvalds /* Type attributes */
1131da177e4SLinus Torvalds struct type_datum {
1141da177e4SLinus Torvalds u32 value; /* internal type value */
115d9250deaSKaiGai Kohei u32 bounds; /* boundary of type */
1161da177e4SLinus Torvalds unsigned char primary; /* primary name? */
117d9250deaSKaiGai Kohei unsigned char attribute;/* attribute ?*/
1181da177e4SLinus Torvalds };
1191da177e4SLinus Torvalds
1201da177e4SLinus Torvalds /* User attributes */
1211da177e4SLinus Torvalds struct user_datum {
1221da177e4SLinus Torvalds u32 value; /* internal user value */
123d9250deaSKaiGai Kohei u32 bounds; /* bounds of user */
1241da177e4SLinus Torvalds struct ebitmap roles; /* set of authorized roles for user */
1251da177e4SLinus Torvalds struct mls_range range; /* MLS range (min - max) for user */
1261da177e4SLinus Torvalds struct mls_level dfltlevel; /* default login MLS level for user */
1271da177e4SLinus Torvalds };
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvalds
1301da177e4SLinus Torvalds /* Sensitivity attributes */
1311da177e4SLinus Torvalds struct level_datum {
1321da177e4SLinus Torvalds struct mls_level *level; /* sensitivity and associated categories */
1331da177e4SLinus Torvalds unsigned char isalias; /* is this sensitivity an alias for another? */
1341da177e4SLinus Torvalds };
1351da177e4SLinus Torvalds
1361da177e4SLinus Torvalds /* Category attributes */
1371da177e4SLinus Torvalds struct cat_datum {
1381da177e4SLinus Torvalds u32 value; /* internal category bit + 1 */
1391da177e4SLinus Torvalds unsigned char isalias; /* is this category an alias for another? */
1401da177e4SLinus Torvalds };
1411da177e4SLinus Torvalds
1421da177e4SLinus Torvalds struct range_trans {
143f3f87714SDarrel Goeddel u32 source_type;
144f3f87714SDarrel Goeddel u32 target_type;
145f3f87714SDarrel Goeddel u32 target_class;
1461da177e4SLinus Torvalds };
1471da177e4SLinus Torvalds
1481da177e4SLinus Torvalds /* Boolean data type */
1491da177e4SLinus Torvalds struct cond_bool_datum {
1501da177e4SLinus Torvalds __u32 value; /* internal type value */
1511da177e4SLinus Torvalds int state;
1521da177e4SLinus Torvalds };
1531da177e4SLinus Torvalds
1541da177e4SLinus Torvalds struct cond_node;
1551da177e4SLinus Torvalds
1561da177e4SLinus Torvalds /*
157a660bec1SRichard Haines * type set preserves data needed to determine constraint info from
158a660bec1SRichard Haines * policy source. This is not used by the kernel policy but allows
159a660bec1SRichard Haines * utilities such as audit2allow to determine constraint denials.
160a660bec1SRichard Haines */
161a660bec1SRichard Haines struct type_set {
162a660bec1SRichard Haines struct ebitmap types;
163a660bec1SRichard Haines struct ebitmap negset;
164a660bec1SRichard Haines u32 flags;
165a660bec1SRichard Haines };
166a660bec1SRichard Haines
167a660bec1SRichard Haines /*
1681da177e4SLinus Torvalds * The configuration data includes security contexts for
1691da177e4SLinus Torvalds * initial SIDs, unlabeled file systems, TCP and UDP port numbers,
1701da177e4SLinus Torvalds * network interfaces, and nodes. This structure stores the
1711da177e4SLinus Torvalds * relevant data for one such entry. Entries of the same kind
1721da177e4SLinus Torvalds * (e.g. all initial SIDs) are linked together into a list.
1731da177e4SLinus Torvalds */
1741da177e4SLinus Torvalds struct ocontext {
1751da177e4SLinus Torvalds union {
1761da177e4SLinus Torvalds char *name; /* name of initial SID, fs, netif, fstype, path */
1771da177e4SLinus Torvalds struct {
1781da177e4SLinus Torvalds u8 protocol;
1791da177e4SLinus Torvalds u16 low_port;
1801da177e4SLinus Torvalds u16 high_port;
1811da177e4SLinus Torvalds } port; /* TCP or UDP port information */
1821da177e4SLinus Torvalds struct {
1831da177e4SLinus Torvalds u32 addr;
1841da177e4SLinus Torvalds u32 mask;
1851da177e4SLinus Torvalds } node; /* node information */
1861da177e4SLinus Torvalds struct {
1871da177e4SLinus Torvalds u32 addr[4];
1881da177e4SLinus Torvalds u32 mask[4];
1891da177e4SLinus Torvalds } node6; /* IPv6 node information */
190a806f7a1SDaniel Jurgens struct {
191a806f7a1SDaniel Jurgens u64 subnet_prefix;
192a806f7a1SDaniel Jurgens u16 low_pkey;
193a806f7a1SDaniel Jurgens u16 high_pkey;
194a806f7a1SDaniel Jurgens } ibpkey;
195a806f7a1SDaniel Jurgens struct {
196a806f7a1SDaniel Jurgens char *dev_name;
197a806f7a1SDaniel Jurgens u8 port;
198a806f7a1SDaniel Jurgens } ibendport;
1991da177e4SLinus Torvalds } u;
2001da177e4SLinus Torvalds union {
2011da177e4SLinus Torvalds u32 sclass; /* security class for genfs */
2021da177e4SLinus Torvalds u32 behavior; /* labeling behavior for fs_use */
2031da177e4SLinus Torvalds } v;
2041da177e4SLinus Torvalds struct context context[2]; /* security context(s) */
2051da177e4SLinus Torvalds u32 sid[2]; /* SID(s) */
2061da177e4SLinus Torvalds struct ocontext *next;
2071da177e4SLinus Torvalds };
2081da177e4SLinus Torvalds
2091da177e4SLinus Torvalds struct genfs {
2101da177e4SLinus Torvalds char *fstype;
2111da177e4SLinus Torvalds struct ocontext *head;
2121da177e4SLinus Torvalds struct genfs *next;
2131da177e4SLinus Torvalds };
2141da177e4SLinus Torvalds
2151da177e4SLinus Torvalds /* symbol table array indices */
2161da177e4SLinus Torvalds #define SYM_COMMONS 0
2171da177e4SLinus Torvalds #define SYM_CLASSES 1
2181da177e4SLinus Torvalds #define SYM_ROLES 2
2191da177e4SLinus Torvalds #define SYM_TYPES 3
2201da177e4SLinus Torvalds #define SYM_USERS 4
2211da177e4SLinus Torvalds #define SYM_BOOLS 5
2221da177e4SLinus Torvalds #define SYM_LEVELS 6
2231da177e4SLinus Torvalds #define SYM_CATS 7
2241da177e4SLinus Torvalds #define SYM_NUM 8
2251da177e4SLinus Torvalds
2261da177e4SLinus Torvalds /* object context array indices */
2271da177e4SLinus Torvalds #define OCON_ISID 0 /* initial SIDs */
2288bfbd046SChristian Göttsche #define OCON_FS 1 /* unlabeled file systems (deprecated) */
2291da177e4SLinus Torvalds #define OCON_PORT 2 /* TCP and UDP port numbers */
2301da177e4SLinus Torvalds #define OCON_NETIF 3 /* network interfaces */
2311da177e4SLinus Torvalds #define OCON_NODE 4 /* nodes */
2321da177e4SLinus Torvalds #define OCON_FSUSE 5 /* fs_use */
2331da177e4SLinus Torvalds #define OCON_NODE6 6 /* IPv6 nodes */
234a806f7a1SDaniel Jurgens #define OCON_IBPKEY 7 /* Infiniband PKeys */
235a806f7a1SDaniel Jurgens #define OCON_IBENDPORT 8 /* Infiniband end ports */
236a806f7a1SDaniel Jurgens #define OCON_NUM 9
2371da177e4SLinus Torvalds
2381da177e4SLinus Torvalds /* The policy database */
2391da177e4SLinus Torvalds struct policydb {
2400719aaf5SGuido Trentalancia int mls_enabled;
2410719aaf5SGuido Trentalancia
2421da177e4SLinus Torvalds /* symbol tables */
2431da177e4SLinus Torvalds struct symtab symtab[SYM_NUM];
2441da177e4SLinus Torvalds #define p_commons symtab[SYM_COMMONS]
2451da177e4SLinus Torvalds #define p_classes symtab[SYM_CLASSES]
2461da177e4SLinus Torvalds #define p_roles symtab[SYM_ROLES]
2471da177e4SLinus Torvalds #define p_types symtab[SYM_TYPES]
2481da177e4SLinus Torvalds #define p_users symtab[SYM_USERS]
2491da177e4SLinus Torvalds #define p_bools symtab[SYM_BOOLS]
2501da177e4SLinus Torvalds #define p_levels symtab[SYM_LEVELS]
2511da177e4SLinus Torvalds #define p_cats symtab[SYM_CATS]
2521da177e4SLinus Torvalds
2531da177e4SLinus Torvalds /* symbol names indexed by (value - 1) */
254acdf52d9SKent Overstreet char **sym_val_to_name[SYM_NUM];
2551da177e4SLinus Torvalds
2561da177e4SLinus Torvalds /* class, role, and user attributes indexed by (value - 1) */
2571da177e4SLinus Torvalds struct class_datum **class_val_to_struct;
2581da177e4SLinus Torvalds struct role_datum **role_val_to_struct;
2591da177e4SLinus Torvalds struct user_datum **user_val_to_struct;
260f07ea1d4SOndrej Mosnacek struct type_datum **type_val_to_struct;
2611da177e4SLinus Torvalds
2621da177e4SLinus Torvalds /* type enforcement access vectors and transitions */
2631da177e4SLinus Torvalds struct avtab te_avtab;
2641da177e4SLinus Torvalds
2651da177e4SLinus Torvalds /* role transitions */
26603414a49SOndrej Mosnacek struct hashtab role_tr;
2671da177e4SLinus Torvalds
2682463c26dSEric Paris /* file transitions with the last path component */
26903a4c018SEric Paris /* quickly exclude lookups when parent ttype has no rules */
27003a4c018SEric Paris struct ebitmap filename_trans_ttypes;
2712463c26dSEric Paris /* actual set of filename_trans rules */
27203414a49SOndrej Mosnacek struct hashtab filename_trans;
2739521eb3eSOndrej Mosnacek /* only used if policyvers < POLICYDB_VERSION_COMP_FTRANS */
2749521eb3eSOndrej Mosnacek u32 compat_filename_trans_count;
275652bb9b0SEric Paris
2761da177e4SLinus Torvalds /* bools indexed by (value - 1) */
2771da177e4SLinus Torvalds struct cond_bool_datum **bool_val_to_struct;
2781da177e4SLinus Torvalds /* type enforcement conditional access vectors and transitions */
2791da177e4SLinus Torvalds struct avtab te_cond_avtab;
28060abd318SOndrej Mosnacek /* array indexing te_cond_avtab by conditional */
2811da177e4SLinus Torvalds struct cond_node *cond_list;
28260abd318SOndrej Mosnacek u32 cond_list_len;
2831da177e4SLinus Torvalds
2841da177e4SLinus Torvalds /* role allows */
2851da177e4SLinus Torvalds struct role_allow *role_allow;
2861da177e4SLinus Torvalds
2871da177e4SLinus Torvalds /* security contexts of initial SIDs, unlabeled file systems,
2881da177e4SLinus Torvalds TCP or UDP port numbers, network interfaces and nodes */
2891da177e4SLinus Torvalds struct ocontext *ocontexts[OCON_NUM];
2901da177e4SLinus Torvalds
2911da177e4SLinus Torvalds /* security contexts for files in filesystems that cannot support
2921da177e4SLinus Torvalds a persistent label mapping or use another
2931da177e4SLinus Torvalds fixed labeling behavior. */
2941da177e4SLinus Torvalds struct genfs *genfs;
2951da177e4SLinus Torvalds
2962f3e82d6SStephen Smalley /* range transitions table (range_trans_key -> mls_range) */
29703414a49SOndrej Mosnacek struct hashtab range_tr;
2981da177e4SLinus Torvalds
299782ebb99SStephen Smalley /* type -> attribute reverse mapping */
300acdf52d9SKent Overstreet struct ebitmap *type_attr_map_array;
301782ebb99SStephen Smalley
3023bb56b25SPaul Moore struct ebitmap policycaps;
3033bb56b25SPaul Moore
30464dbf074SEric Paris struct ebitmap permissive_map;
30564dbf074SEric Paris
306cee74f47SEric Paris /* length of this policy when it was loaded */
307cee74f47SEric Paris size_t len;
308cee74f47SEric Paris
3091da177e4SLinus Torvalds unsigned int policyvers;
3103f12070eSEric Paris
3113f12070eSEric Paris unsigned int reject_unknown : 1;
3123f12070eSEric Paris unsigned int allow_unknown : 1;
313c6d3aaa4SStephen Smalley
314c6d3aaa4SStephen Smalley u16 process_class;
315c6d3aaa4SStephen Smalley u32 process_trans_perms;
3165c108d4eSStephen Smalley } __randomize_layout;
3171da177e4SLinus Torvalds
3181da177e4SLinus Torvalds extern void policydb_destroy(struct policydb *p);
3191da177e4SLinus Torvalds extern int policydb_load_isids(struct policydb *p, struct sidtab *s);
3201da177e4SLinus Torvalds extern int policydb_context_isvalid(struct policydb *p, struct context *c);
32145e5421eSStephen Smalley extern int policydb_class_isvalid(struct policydb *p, unsigned int class);
32245e5421eSStephen Smalley extern int policydb_type_isvalid(struct policydb *p, unsigned int type);
32345e5421eSStephen Smalley extern int policydb_role_isvalid(struct policydb *p, unsigned int role);
3241da177e4SLinus Torvalds extern int policydb_read(struct policydb *p, void *fp);
325cee74f47SEric Paris extern int policydb_write(struct policydb *p, void *fp);
3261da177e4SLinus Torvalds
32724def7bbSOndrej Mosnacek extern struct filename_trans_datum *policydb_filenametr_search(
32824def7bbSOndrej Mosnacek struct policydb *p, struct filename_trans_key *key);
32924def7bbSOndrej Mosnacek
33024def7bbSOndrej Mosnacek extern struct mls_range *policydb_rangetr_search(
33124def7bbSOndrej Mosnacek struct policydb *p, struct range_trans *key);
33224def7bbSOndrej Mosnacek
33324def7bbSOndrej Mosnacek extern struct role_trans_datum *policydb_roletr_search(
33424def7bbSOndrej Mosnacek struct policydb *p, struct role_trans_key *key);
33524def7bbSOndrej Mosnacek
3361da177e4SLinus Torvalds #define POLICYDB_CONFIG_MLS 1
3371da177e4SLinus Torvalds
3383f12070eSEric Paris /* the config flags related to unknown classes/perms are bits 2 and 3 */
3393f12070eSEric Paris #define REJECT_UNKNOWN 0x00000002
3403f12070eSEric Paris #define ALLOW_UNKNOWN 0x00000004
3413f12070eSEric Paris
3421da177e4SLinus Torvalds #define OBJECT_R "object_r"
3431da177e4SLinus Torvalds #define OBJECT_R_VAL 1
3441da177e4SLinus Torvalds
3451da177e4SLinus Torvalds #define POLICYDB_MAGIC SELINUX_MAGIC
3461da177e4SLinus Torvalds #define POLICYDB_STRING "SE Linux"
3471da177e4SLinus Torvalds
3481da177e4SLinus Torvalds struct policy_file {
3491da177e4SLinus Torvalds char *data;
3501da177e4SLinus Torvalds size_t len;
3511da177e4SLinus Torvalds };
3521da177e4SLinus Torvalds
353cee74f47SEric Paris struct policy_data {
354cee74f47SEric Paris struct policydb *p;
355cee74f47SEric Paris void *fp;
356cee74f47SEric Paris };
357cee74f47SEric Paris
next_entry(void * buf,struct policy_file * fp,size_t bytes)3581da177e4SLinus Torvalds static inline int next_entry(void *buf, struct policy_file *fp, size_t bytes)
3591da177e4SLinus Torvalds {
3601da177e4SLinus Torvalds if (bytes > fp->len)
3611da177e4SLinus Torvalds return -EINVAL;
3621da177e4SLinus Torvalds
3631da177e4SLinus Torvalds memcpy(buf, fp->data, bytes);
3641da177e4SLinus Torvalds fp->data += bytes;
3651da177e4SLinus Torvalds fp->len -= bytes;
3661da177e4SLinus Torvalds return 0;
3671da177e4SLinus Torvalds }
3681da177e4SLinus Torvalds
put_entry(const void * buf,size_t bytes,size_t num,struct policy_file * fp)369bbea03f4SChristian Göttsche static inline int put_entry(const void *buf, size_t bytes, size_t num, struct policy_file *fp)
370cee74f47SEric Paris {
371bbea03f4SChristian Göttsche size_t len;
372bbea03f4SChristian Göttsche
373bbea03f4SChristian Göttsche if (unlikely(check_mul_overflow(bytes, num, &len)))
374bbea03f4SChristian Göttsche return -EINVAL;
375cee74f47SEric Paris
37615ec76fbSXiu Jianfeng if (len > fp->len)
37715ec76fbSXiu Jianfeng return -EINVAL;
378cee74f47SEric Paris memcpy(fp->data, buf, len);
379cee74f47SEric Paris fp->data += len;
380cee74f47SEric Paris fp->len -= len;
381cee74f47SEric Paris
382cee74f47SEric Paris return 0;
383cee74f47SEric Paris }
384cee74f47SEric Paris
sym_name(struct policydb * p,unsigned int sym_num,unsigned int element_nr)385ac76c05bSEric Paris static inline char *sym_name(struct policydb *p, unsigned int sym_num, unsigned int element_nr)
386ac76c05bSEric Paris {
387acdf52d9SKent Overstreet return p->sym_val_to_name[sym_num][element_nr];
388ac76c05bSEric Paris }
389ac76c05bSEric Paris
390c6d3aaa4SStephen Smalley extern u16 string_to_security_class(struct policydb *p, const char *name);
391c6d3aaa4SStephen Smalley extern u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name);
392c6d3aaa4SStephen Smalley
3931da177e4SLinus Torvalds #endif /* _SS_POLICYDB_H_ */
3941da177e4SLinus Torvalds
395