xref: /openbmc/linux/security/selinux/ss/policydb.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
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