common.h 23.6 KB
Newer Older
1 2 3
/*
 * security/tomoyo/common.h
 *
T
Tetsuo Handa 已提交
4
 * Header file for TOMOYO.
5
 *
T
Tetsuo Handa 已提交
6
 * Copyright (C) 2005-2010  NTT DATA CORPORATION
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 */

#ifndef _SECURITY_TOMOYO_COMMON_H
#define _SECURITY_TOMOYO_COMMON_H

#include <linux/ctype.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/file.h>
#include <linux/kmod.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/namei.h>
#include <linux/mount.h>
#include <linux/list.h>
T
Tetsuo Handa 已提交
22
#include <linux/cred.h>
23
#include <linux/poll.h>
T
Tetsuo Handa 已提交
24 25 26 27 28 29 30 31 32 33 34 35
struct linux_binprm;

/********** Constants definitions. **********/

/*
 * TOMOYO uses this hash only when appending a string into the string
 * table. Frequency of appending strings is very low. So we don't need
 * large (e.g. 64k) hash size. 256 will be sufficient.
 */
#define TOMOYO_HASH_BITS  8
#define TOMOYO_MAX_HASH (1u<<TOMOYO_HASH_BITS)

T
Tetsuo Handa 已提交
36
#define TOMOYO_EXEC_TMPSIZE     4096
T
Tetsuo Handa 已提交
37 38 39 40

/* Profile number is an integer between 0 and 255. */
#define TOMOYO_MAX_PROFILES 256

T
Tetsuo Handa 已提交
41
/* Index numbers for operation mode. */
42 43 44 45
enum tomoyo_mode_index {
	TOMOYO_CONFIG_DISABLED,
	TOMOYO_CONFIG_LEARNING,
	TOMOYO_CONFIG_PERMISSIVE,
T
Tetsuo Handa 已提交
46 47
	TOMOYO_CONFIG_ENFORCING,
	TOMOYO_CONFIG_USE_DEFAULT = 255
48 49
};

T
Tetsuo Handa 已提交
50
/* Index numbers for entry type. */
51 52 53 54
enum tomoyo_policy_id {
	TOMOYO_ID_GROUP,
	TOMOYO_ID_PATH_GROUP,
	TOMOYO_ID_NUMBER_GROUP,
55
	TOMOYO_ID_TRANSITION_CONTROL,
56 57 58 59 60 61 62 63
	TOMOYO_ID_AGGREGATOR,
	TOMOYO_ID_MANAGER,
	TOMOYO_ID_NAME,
	TOMOYO_ID_ACL,
	TOMOYO_ID_DOMAIN,
	TOMOYO_MAX_POLICY
};

T
Tetsuo Handa 已提交
64
/* Index numbers for group entries. */
65 66 67 68 69 70
enum tomoyo_group_id {
	TOMOYO_PATH_GROUP,
	TOMOYO_NUMBER_GROUP,
	TOMOYO_MAX_GROUP
};

T
Tetsuo Handa 已提交
71 72 73 74
/* A domain definition starts with <kernel>. */
#define TOMOYO_ROOT_NAME                         "<kernel>"
#define TOMOYO_ROOT_NAME_LEN                     (sizeof(TOMOYO_ROOT_NAME) - 1)

T
Tetsuo Handa 已提交
75 76 77 78 79 80 81
/* Index numbers for type of numeric values. */
enum tomoyo_value_type {
	TOMOYO_VALUE_TYPE_INVALID,
	TOMOYO_VALUE_TYPE_DECIMAL,
	TOMOYO_VALUE_TYPE_OCTAL,
	TOMOYO_VALUE_TYPE_HEXADECIMAL,
};
82

T
Tetsuo Handa 已提交
83
/* Index numbers for domain transition control keywords. */
84 85 86 87 88 89 90 91 92
enum tomoyo_transition_type {
	/* Do not change this order, */
	TOMOYO_TRANSITION_CONTROL_NO_INITIALIZE,
	TOMOYO_TRANSITION_CONTROL_INITIALIZE,
	TOMOYO_TRANSITION_CONTROL_NO_KEEP,
	TOMOYO_TRANSITION_CONTROL_KEEP,
	TOMOYO_MAX_TRANSITION_TYPE
};

T
Tetsuo Handa 已提交
93
/* Index numbers for Access Controls. */
94
enum tomoyo_acl_entry_type_index {
T
Tetsuo Handa 已提交
95 96
	TOMOYO_TYPE_PATH_ACL,
	TOMOYO_TYPE_PATH2_ACL,
97
	TOMOYO_TYPE_PATH_NUMBER_ACL,
T
Tetsuo Handa 已提交
98
	TOMOYO_TYPE_MKDEV_ACL,
T
Tetsuo Handa 已提交
99
	TOMOYO_TYPE_MOUNT_ACL,
100
};
T
Tetsuo Handa 已提交
101

T
Tetsuo Handa 已提交
102
/* Index numbers for access controls with one pathname. */
103
enum tomoyo_path_acl_index {
T
Tetsuo Handa 已提交
104 105 106
	TOMOYO_TYPE_EXECUTE,
	TOMOYO_TYPE_READ,
	TOMOYO_TYPE_WRITE,
T
Tetsuo Handa 已提交
107
	TOMOYO_TYPE_APPEND,
T
Tetsuo Handa 已提交
108
	TOMOYO_TYPE_UNLINK,
T
Tetsuo Handa 已提交
109
	TOMOYO_TYPE_GETATTR,
T
Tetsuo Handa 已提交
110 111 112 113 114 115
	TOMOYO_TYPE_RMDIR,
	TOMOYO_TYPE_TRUNCATE,
	TOMOYO_TYPE_SYMLINK,
	TOMOYO_TYPE_CHROOT,
	TOMOYO_TYPE_UMOUNT,
	TOMOYO_MAX_PATH_OPERATION
116 117
};

T
Tetsuo Handa 已提交
118
enum tomoyo_mkdev_acl_index {
119 120
	TOMOYO_TYPE_MKBLOCK,
	TOMOYO_TYPE_MKCHAR,
T
Tetsuo Handa 已提交
121
	TOMOYO_MAX_MKDEV_OPERATION
122 123
};

T
Tetsuo Handa 已提交
124
/* Index numbers for access controls with two pathnames. */
125
enum tomoyo_path2_acl_index {
T
Tetsuo Handa 已提交
126 127 128 129
	TOMOYO_TYPE_LINK,
	TOMOYO_TYPE_RENAME,
	TOMOYO_TYPE_PIVOT_ROOT,
	TOMOYO_MAX_PATH2_OPERATION
130 131
};

T
Tetsuo Handa 已提交
132
/* Index numbers for access controls with one pathname and one number. */
133 134 135 136 137 138 139 140 141 142 143 144
enum tomoyo_path_number_acl_index {
	TOMOYO_TYPE_CREATE,
	TOMOYO_TYPE_MKDIR,
	TOMOYO_TYPE_MKFIFO,
	TOMOYO_TYPE_MKSOCK,
	TOMOYO_TYPE_IOCTL,
	TOMOYO_TYPE_CHMOD,
	TOMOYO_TYPE_CHOWN,
	TOMOYO_TYPE_CHGRP,
	TOMOYO_MAX_PATH_NUMBER_OPERATION
};

T
Tetsuo Handa 已提交
145
/* Index numbers for /sys/kernel/security/tomoyo/ interfaces. */
146 147 148 149 150 151 152 153 154
enum tomoyo_securityfs_interface_index {
	TOMOYO_DOMAINPOLICY,
	TOMOYO_EXCEPTIONPOLICY,
	TOMOYO_DOMAIN_STATUS,
	TOMOYO_PROCESS_STATUS,
	TOMOYO_MEMINFO,
	TOMOYO_SELFDOMAIN,
	TOMOYO_VERSION,
	TOMOYO_PROFILE,
155
	TOMOYO_QUERY,
156 157
	TOMOYO_MANAGER
};
158

T
Tetsuo Handa 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171
/* Index numbers for special mount operations. */
enum tomoyo_special_mount {
	TOMOYO_MOUNT_BIND,            /* mount --bind /source /dest   */
	TOMOYO_MOUNT_MOVE,            /* mount --move /old /new       */
	TOMOYO_MOUNT_REMOUNT,         /* mount -o remount /dir        */
	TOMOYO_MOUNT_MAKE_UNBINDABLE, /* mount --make-unbindable /dir */
	TOMOYO_MOUNT_MAKE_PRIVATE,    /* mount --make-private /dir    */
	TOMOYO_MOUNT_MAKE_SLAVE,      /* mount --make-slave /dir      */
	TOMOYO_MOUNT_MAKE_SHARED,     /* mount --make-shared /dir     */
	TOMOYO_MAX_SPECIAL_MOUNT
};

/* Index numbers for functionality. */
T
Tetsuo Handa 已提交
172 173 174 175 176
enum tomoyo_mac_index {
	TOMOYO_MAC_FILE_EXECUTE,
	TOMOYO_MAC_FILE_OPEN,
	TOMOYO_MAC_FILE_CREATE,
	TOMOYO_MAC_FILE_UNLINK,
T
Tetsuo Handa 已提交
177
	TOMOYO_MAC_FILE_GETATTR,
T
Tetsuo Handa 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
	TOMOYO_MAC_FILE_MKDIR,
	TOMOYO_MAC_FILE_RMDIR,
	TOMOYO_MAC_FILE_MKFIFO,
	TOMOYO_MAC_FILE_MKSOCK,
	TOMOYO_MAC_FILE_TRUNCATE,
	TOMOYO_MAC_FILE_SYMLINK,
	TOMOYO_MAC_FILE_MKBLOCK,
	TOMOYO_MAC_FILE_MKCHAR,
	TOMOYO_MAC_FILE_LINK,
	TOMOYO_MAC_FILE_RENAME,
	TOMOYO_MAC_FILE_CHMOD,
	TOMOYO_MAC_FILE_CHOWN,
	TOMOYO_MAC_FILE_CHGRP,
	TOMOYO_MAC_FILE_IOCTL,
	TOMOYO_MAC_FILE_CHROOT,
	TOMOYO_MAC_FILE_MOUNT,
	TOMOYO_MAC_FILE_UMOUNT,
	TOMOYO_MAC_FILE_PIVOT_ROOT,
	TOMOYO_MAX_MAC_INDEX
};

T
Tetsuo Handa 已提交
199
/* Index numbers for category of functionality. */
T
Tetsuo Handa 已提交
200 201 202 203 204
enum tomoyo_mac_category_index {
	TOMOYO_MAC_CATEGORY_FILE,
	TOMOYO_MAX_MAC_CATEGORY_INDEX
};

205
/*
T
Tetsuo Handa 已提交
206 207
 * Retry this request. Returned by tomoyo_supervisor() if policy violation has
 * occurred in enforcing mode and the userspace daemon decided to retry.
208
 *
T
Tetsuo Handa 已提交
209 210
 * We must choose a positive value in order to distinguish "granted" (which is
 * 0) and "rejected" (which is a negative value) and "retry".
211
 */
T
Tetsuo Handa 已提交
212 213 214 215 216
#define TOMOYO_RETRY_REQUEST 1

/********** Structure definitions. **********/

/* Common header for holding ACL entries. */
217 218 219 220 221
struct tomoyo_acl_head {
	struct list_head list;
	bool is_deleted;
} __packed;

T
Tetsuo Handa 已提交
222
/* Structure for request info. */
223 224
struct tomoyo_request_info {
	struct tomoyo_domain_info *domain;
225 226 227 228
	/* For holding parameters. */
	union {
		struct {
			const struct tomoyo_path_info *filename;
229 230
			/* For using wildcards at tomoyo_find_next_domain(). */
			const struct tomoyo_path_info *matched_path;
T
Tetsuo Handa 已提交
231
			/* One of values in "enum tomoyo_path_acl_index". */
232 233 234 235 236
			u8 operation;
		} path;
		struct {
			const struct tomoyo_path_info *filename1;
			const struct tomoyo_path_info *filename2;
T
Tetsuo Handa 已提交
237
			/* One of values in "enum tomoyo_path2_acl_index". */
238 239 240 241 242 243 244
			u8 operation;
		} path2;
		struct {
			const struct tomoyo_path_info *filename;
			unsigned int mode;
			unsigned int major;
			unsigned int minor;
T
Tetsuo Handa 已提交
245
			/* One of values in "enum tomoyo_mkdev_acl_index". */
246 247 248 249 250
			u8 operation;
		} mkdev;
		struct {
			const struct tomoyo_path_info *filename;
			unsigned long number;
T
Tetsuo Handa 已提交
251 252 253 254
			/*
			 * One of values in
			 * "enum tomoyo_path_number_acl_index".
			 */
255 256 257 258 259 260 261 262 263 264 265 266
			u8 operation;
		} path_number;
		struct {
			const struct tomoyo_path_info *type;
			const struct tomoyo_path_info *dir;
			const struct tomoyo_path_info *dev;
			unsigned long flags;
			int need_dev;
		} mount;
	} param;
	u8 param_type;
	bool granted;
267 268
	u8 retry;
	u8 profile;
269
	u8 mode; /* One of tomoyo_mode_index . */
T
Tetsuo Handa 已提交
270
	u8 type;
271 272
};

T
Tetsuo Handa 已提交
273
/* Structure for holding a token. */
274 275 276 277 278 279 280 281
struct tomoyo_path_info {
	const char *name;
	u32 hash;          /* = full_name_hash(name, strlen(name)) */
	u16 const_len;     /* = tomoyo_const_part_length(name)     */
	bool is_dir;       /* = tomoyo_strendswith(name, "/")      */
	bool is_patterned; /* = tomoyo_path_contains_pattern(name) */
};

T
Tetsuo Handa 已提交
282
/* Structure for holding string data. */
T
Tetsuo Handa 已提交
283
struct tomoyo_name {
T
Tetsuo Handa 已提交
284 285 286 287
	struct list_head list;
	atomic_t users;
	struct tomoyo_path_info entry;
};
288

T
Tetsuo Handa 已提交
289
/* Structure for holding a word. */
290
struct tomoyo_name_union {
T
Tetsuo Handa 已提交
291
	/* Either @filename or @group is NULL. */
292
	const struct tomoyo_path_info *filename;
293
	struct tomoyo_group *group;
T
Tetsuo Handa 已提交
294
	/* True if @group != NULL, false if @filename != NULL. */
295 296 297
	u8 is_group;
};

T
Tetsuo Handa 已提交
298
/* Structure for holding a number. */
299 300
struct tomoyo_number_union {
	unsigned long values[2];
T
Tetsuo Handa 已提交
301 302
	struct tomoyo_group *group; /* Maybe NULL. */
	/* One of values in "enum tomoyo_value_type". */
303 304
	u8 min_type;
	u8 max_type;
T
Tetsuo Handa 已提交
305
	/* True if @group != NULL, false otherwise. */
306 307 308
	u8 is_group;
};

309 310
/* Structure for "path_group"/"number_group" directive. */
struct tomoyo_group {
311 312 313 314 315 316
	struct list_head list;
	const struct tomoyo_path_info *group_name;
	struct list_head member_list;
	atomic_t users;
};

317
/* Structure for "path_group" directive. */
318
struct tomoyo_path_group {
319
	struct tomoyo_acl_head head;
320 321 322
	const struct tomoyo_path_info *member_name;
};

323
/* Structure for "number_group" directive. */
324
struct tomoyo_number_group {
325
	struct tomoyo_acl_head head;
326 327 328
	struct tomoyo_number_union number;
};

T
Tetsuo Handa 已提交
329
/* Common header for individual entries. */
330 331
struct tomoyo_acl_info {
	struct list_head list;
332
	bool is_deleted;
T
Tetsuo Handa 已提交
333
	u8 type; /* One of values in "enum tomoyo_acl_entry_type_index". */
334 335
} __packed;

T
Tetsuo Handa 已提交
336
/* Structure for domain information. */
337 338 339 340 341 342
struct tomoyo_domain_info {
	struct list_head list;
	struct list_head acl_info_list;
	/* Name of this domain. Never NULL.          */
	const struct tomoyo_path_info *domainname;
	u8 profile;        /* Profile number to use. */
343
	bool is_deleted;   /* Delete flag.           */
344
	bool quota_warned; /* Quota warnning flag.   */
T
Tetsuo Handa 已提交
345
	bool transition_failed; /* Domain transition failed flag. */
346
	atomic_t users; /* Number of referring credentials. */
347 348 349
};

/*
T
Tetsuo Handa 已提交
350 351 352
 * Structure for "file execute", "file read", "file write", "file append",
 * "file unlink", "file getattr", "file rmdir", "file truncate",
 * "file symlink", "file chroot" and "file unmount" directive.
353
 */
T
Tetsuo Handa 已提交
354 355
struct tomoyo_path_acl {
	struct tomoyo_acl_info head; /* type = TOMOYO_TYPE_PATH_ACL */
T
Tetsuo Handa 已提交
356
	u16 perm; /* Bitmask of values in "enum tomoyo_path_acl_index". */
357
	struct tomoyo_name_union name;
358 359
};

360
/*
T
Tetsuo Handa 已提交
361 362
 * Structure for "file create", "file mkdir", "file mkfifo", "file mksock",
 * "file ioctl", "file chmod", "file chown" and "file chgrp" directive.
363 364 365
 */
struct tomoyo_path_number_acl {
	struct tomoyo_acl_info head; /* type = TOMOYO_TYPE_PATH_NUMBER_ACL */
T
Tetsuo Handa 已提交
366
	/* Bitmask of values in "enum tomoyo_path_number_acl_index". */
367 368 369 370 371
	u8 perm;
	struct tomoyo_name_union name;
	struct tomoyo_number_union number;
};

T
Tetsuo Handa 已提交
372
/* Structure for "file mkblock" and "file mkchar" directive. */
T
Tetsuo Handa 已提交
373 374
struct tomoyo_mkdev_acl {
	struct tomoyo_acl_info head; /* type = TOMOYO_TYPE_MKDEV_ACL */
T
Tetsuo Handa 已提交
375
	u8 perm; /* Bitmask of values in "enum tomoyo_mkdev_acl_index". */
376 377 378 379 380 381
	struct tomoyo_name_union name;
	struct tomoyo_number_union mode;
	struct tomoyo_number_union major;
	struct tomoyo_number_union minor;
};

382
/*
T
Tetsuo Handa 已提交
383
 * Structure for "file rename", "file link" and "file pivot_root" directive.
384
 */
T
Tetsuo Handa 已提交
385 386
struct tomoyo_path2_acl {
	struct tomoyo_acl_info head; /* type = TOMOYO_TYPE_PATH2_ACL */
T
Tetsuo Handa 已提交
387
	u8 perm; /* Bitmask of values in "enum tomoyo_path2_acl_index". */
388 389
	struct tomoyo_name_union name1;
	struct tomoyo_name_union name2;
390 391
};

T
Tetsuo Handa 已提交
392
/* Structure for "file mount" directive. */
T
Tetsuo Handa 已提交
393 394 395 396 397 398 399 400
struct tomoyo_mount_acl {
	struct tomoyo_acl_info head; /* type = TOMOYO_TYPE_MOUNT_ACL */
	struct tomoyo_name_union dev_name;
	struct tomoyo_name_union dir_name;
	struct tomoyo_name_union fs_type;
	struct tomoyo_number_union flags;
};

401 402
#define TOMOYO_MAX_IO_READ_QUEUE 32

403
/*
404 405
 * Structure for reading/writing policy via /sys/kernel/security/tomoyo
 * interfaces.
406
 */
407
struct tomoyo_io_buffer {
408
	void (*read) (struct tomoyo_io_buffer *);
409
	int (*write) (struct tomoyo_io_buffer *);
410
	int (*poll) (struct file *file, poll_table *wait);
411 412
	/* Exclusive lock for this structure.   */
	struct mutex io_sem;
413 414
	/* Index returned by tomoyo_read_lock(). */
	int reader_idx;
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
	char __user *read_user_buf;
	int read_user_buf_avail;
	struct {
		struct list_head *domain;
		struct list_head *group;
		struct list_head *acl;
		int avail;
		int step;
		int query_index;
		u16 index;
		u8 bit;
		u8 w_pos;
		bool eof;
		bool print_this_domain_only;
		bool print_execute_only;
		const char *w[TOMOYO_MAX_IO_READ_QUEUE];
	} r;
432 433 434 435 436 437 438 439 440 441 442 443
	/* The position currently writing to.   */
	struct tomoyo_domain_info *write_var1;
	/* Buffer for reading.                  */
	char *read_buf;
	/* Size of read buffer.                 */
	int readbuf_size;
	/* Buffer for writing.                  */
	char *write_buf;
	/* Bytes available for writing.         */
	int write_avail;
	/* Size of write buffer.                */
	int writebuf_size;
444 445
	/* Type of this interface.              */
	u8 type;
446 447
};

T
Tetsuo Handa 已提交
448
/*
T
Tetsuo Handa 已提交
449 450
 * Structure for "initialize_domain"/"no_initialize_domain"/"keep_domain"/
 * "no_keep_domain" keyword.
T
Tetsuo Handa 已提交
451
 */
452
struct tomoyo_transition_control {
453
	struct tomoyo_acl_head head;
454
	u8 type; /* One of values in "enum tomoyo_transition_type".  */
T
Tetsuo Handa 已提交
455 456
	/* True if the domainname is tomoyo_get_last_name(). */
	bool is_last_name;
457 458
	const struct tomoyo_path_info *domainname; /* Maybe NULL */
	const struct tomoyo_path_info *program;    /* Maybe NULL */
T
Tetsuo Handa 已提交
459 460
};

T
Tetsuo Handa 已提交
461
/* Structure for "aggregator" keyword. */
T
Tetsuo Handa 已提交
462
struct tomoyo_aggregator {
463
	struct tomoyo_acl_head head;
464 465 466 467
	const struct tomoyo_path_info *original_name;
	const struct tomoyo_path_info *aggregated_name;
};

T
Tetsuo Handa 已提交
468
/* Structure for policy manager. */
T
Tetsuo Handa 已提交
469
struct tomoyo_manager {
470 471
	struct tomoyo_acl_head head;
	bool is_domain;  /* True if manager is a domainname. */
T
Tetsuo Handa 已提交
472 473 474 475
	/* A path to program or a domainname. */
	const struct tomoyo_path_info *manager;
};

T
Tetsuo Handa 已提交
476 477 478 479 480 481 482
struct tomoyo_preference {
	unsigned int learning_max_entry;
	bool enforcing_verbose;
	bool learning_verbose;
	bool permissive_verbose;
};

T
Tetsuo Handa 已提交
483
/* Structure for /sys/kernel/security/tomnoyo/profile interface. */
T
Tetsuo Handa 已提交
484 485 486 487 488 489 490 491 492 493
struct tomoyo_profile {
	const struct tomoyo_path_info *comment;
	struct tomoyo_preference *learning;
	struct tomoyo_preference *permissive;
	struct tomoyo_preference *enforcing;
	struct tomoyo_preference preference;
	u8 default_config;
	u8 config[TOMOYO_MAX_MAC_INDEX + TOMOYO_MAX_MAC_CATEGORY_INDEX];
};

T
Tetsuo Handa 已提交
494 495
/********** Function prototypes. **********/

496 497 498 499 500 501 502 503
bool tomoyo_str_starts(char **src, const char *find);
const char *tomoyo_get_exe(void);
void tomoyo_normalize_line(unsigned char *buffer);
void tomoyo_warn_log(struct tomoyo_request_info *r, const char *fmt, ...)
     __attribute__ ((format(printf, 2, 3)));
void tomoyo_check_profile(void);
int tomoyo_open_control(const u8 type, struct file *file);
int tomoyo_close_control(struct file *file);
T
Tetsuo Handa 已提交
504
int tomoyo_poll_control(struct file *file, poll_table *wait);
505 506 507 508 509 510
int tomoyo_read_control(struct file *file, char __user *buffer,
			const int buffer_len);
int tomoyo_write_control(struct file *file, const char __user *buffer,
			 const int buffer_len);
bool tomoyo_domain_quota_is_ok(struct tomoyo_request_info *r);
void tomoyo_warn_oom(const char *function);
511 512 513
const struct tomoyo_path_info *
tomoyo_compare_name_union(const struct tomoyo_path_info *name,
			  const struct tomoyo_name_union *ptr);
T
Tetsuo Handa 已提交
514 515
bool tomoyo_compare_number_union(const unsigned long value,
				 const struct tomoyo_number_union *ptr);
T
Tetsuo Handa 已提交
516
int tomoyo_get_mode(const u8 profile, const u8 index);
517
void tomoyo_io_printf(struct tomoyo_io_buffer *head, const char *fmt, ...)
518
	__attribute__ ((format(printf, 2, 3)));
T
Tetsuo Handa 已提交
519 520 521 522
bool tomoyo_correct_domain(const unsigned char *domainname);
bool tomoyo_correct_path(const char *filename);
bool tomoyo_correct_word(const char *string);
bool tomoyo_domain_def(const unsigned char *buffer);
523 524
bool tomoyo_parse_name_union(const char *filename,
			     struct tomoyo_name_union *ptr);
525 526 527
const struct tomoyo_path_info *
tomoyo_path_matches_group(const struct tomoyo_path_info *pathname,
			  const struct tomoyo_group *group);
528 529
bool tomoyo_number_matches_group(const unsigned long min,
				 const unsigned long max,
530
				 const struct tomoyo_group *group);
531 532
bool tomoyo_path_matches_pattern(const struct tomoyo_path_info *filename,
				 const struct tomoyo_path_info *pattern);
533
bool tomoyo_parse_number_union(char *data, struct tomoyo_number_union *num);
534
bool tomoyo_tokenize(char *buffer, char *w[], size_t size);
535
bool tomoyo_verbose_mode(const struct tomoyo_domain_info *domain);
T
Tetsuo Handa 已提交
536
int tomoyo_init_request_info(struct tomoyo_request_info *r,
T
Tetsuo Handa 已提交
537 538
			     struct tomoyo_domain_info *domain,
			     const u8 index);
T
Tetsuo Handa 已提交
539 540 541
int tomoyo_mount_permission(char *dev_name, struct path *path,
			    const char *type, unsigned long flags,
			    void *data_page);
T
Tetsuo Handa 已提交
542
int tomoyo_write_aggregator(char *data, const bool is_delete);
543 544
int tomoyo_write_transition_control(char *data, const bool is_delete,
				    const u8 type);
T
Tetsuo Handa 已提交
545 546 547 548
int tomoyo_write_file(char *data, struct tomoyo_domain_info *domain,
		      const bool is_delete);
int tomoyo_write_mount(char *data, struct tomoyo_domain_info *domain,
		       const bool is_delete);
549
int tomoyo_write_group(char *data, const bool is_delete, const u8 type);
550 551
int tomoyo_supervisor(struct tomoyo_request_info *r, const char *fmt, ...)
     __attribute__ ((format(printf, 2, 3)));
552
struct tomoyo_domain_info *tomoyo_find_domain(const char *domainname);
T
Tetsuo Handa 已提交
553 554
struct tomoyo_domain_info *tomoyo_assign_domain(const char *domainname,
						const u8 profile);
T
Tetsuo Handa 已提交
555
struct tomoyo_profile *tomoyo_profile(const u8 profile);
556
struct tomoyo_group *tomoyo_get_group(const char *group_name, const u8 type);
557 558 559 560
unsigned int tomoyo_check_flags(const struct tomoyo_domain_info *domain,
				const u8 index);
void tomoyo_fill_path_info(struct tomoyo_path_info *ptr);
void tomoyo_load_policy(const char *filename);
561
void tomoyo_put_number_union(struct tomoyo_number_union *ptr);
T
Tetsuo Handa 已提交
562
char *tomoyo_encode(const char *str);
T
Tetsuo Handa 已提交
563
char *tomoyo_realpath_nofollow(const char *pathname);
T
Tetsuo Handa 已提交
564 565
char *tomoyo_realpath_from_path(struct path *path);
bool tomoyo_memory_ok(void *ptr);
566
void *tomoyo_commit_ok(void *data, const unsigned int size);
T
Tetsuo Handa 已提交
567
const struct tomoyo_path_info *tomoyo_get_name(const char *name);
568
void tomoyo_read_memory_counter(struct tomoyo_io_buffer *head);
T
Tetsuo Handa 已提交
569
int tomoyo_write_memory_quota(struct tomoyo_io_buffer *head);
570
void __init tomoyo_mm_init(void);
571
int tomoyo_path_permission(struct tomoyo_request_info *r, u8 operation,
T
Tetsuo Handa 已提交
572 573 574
			   const struct tomoyo_path_info *filename);
int tomoyo_check_open_permission(struct tomoyo_domain_info *domain,
				 struct path *path, const int flag);
575 576
int tomoyo_path_number_perm(const u8 operation, struct path *path,
			    unsigned long number);
T
Tetsuo Handa 已提交
577 578
int tomoyo_mkdev_perm(const u8 operation, struct path *path,
		      const unsigned int mode, unsigned int dev);
579 580 581
int tomoyo_path_perm(const u8 operation, struct path *path);
int tomoyo_path2_perm(const u8 operation, struct path *path1,
		      struct path *path2);
T
Tetsuo Handa 已提交
582
int tomoyo_find_next_domain(struct linux_binprm *bprm);
583 584
void tomoyo_print_ulong(char *buffer, const int buffer_len,
			const unsigned long value, const u8 type);
585
void tomoyo_put_name_union(struct tomoyo_name_union *ptr);
T
Tetsuo Handa 已提交
586 587
void tomoyo_run_gc(void);
void tomoyo_memory_free(void *ptr);
588 589 590 591 592 593 594 595 596
int tomoyo_update_domain(struct tomoyo_acl_info *new_entry, const int size,
			 bool is_delete, struct tomoyo_domain_info *domain,
			 bool (*check_duplicate) (const struct tomoyo_acl_info
						  *,
						  const struct tomoyo_acl_info
						  *),
			 bool (*merge_duplicate) (struct tomoyo_acl_info *,
						  struct tomoyo_acl_info *,
						  const bool));
597 598 599 600 601 602
int tomoyo_update_policy(struct tomoyo_acl_head *new_entry, const int size,
			 bool is_delete, struct list_head *list,
			 bool (*check_duplicate) (const struct tomoyo_acl_head
						  *,
						  const struct tomoyo_acl_head
						  *));
603
void tomoyo_check_acl(struct tomoyo_request_info *r,
604
		      bool (*check_entry) (struct tomoyo_request_info *,
605
					   const struct tomoyo_acl_info *));
606

T
Tetsuo Handa 已提交
607 608 609 610 611 612 613 614
/********** External variable definitions. **********/

/* Lock for GC. */
extern struct srcu_struct tomoyo_ss;

/* The list for "struct tomoyo_domain_info". */
extern struct list_head tomoyo_domain_list;

615 616
extern struct list_head tomoyo_policy_list[TOMOYO_MAX_POLICY];
extern struct list_head tomoyo_group_list[TOMOYO_MAX_GROUP];
T
Tetsuo Handa 已提交
617 618
extern struct list_head tomoyo_name_list[TOMOYO_MAX_HASH];

T
Tetsuo Handa 已提交
619 620 621 622 623 624 625 626 627
/* Lock for protecting policy. */
extern struct mutex tomoyo_policy_lock;

/* Has /sbin/init started? */
extern bool tomoyo_policy_loaded;

/* The kernel's domain. */
extern struct tomoyo_domain_info tomoyo_kernel_domain;

628 629 630 631 632
extern const char *tomoyo_path_keyword[TOMOYO_MAX_PATH_OPERATION];
extern const char *tomoyo_mkdev_keyword[TOMOYO_MAX_MKDEV_OPERATION];
extern const char *tomoyo_path2_keyword[TOMOYO_MAX_PATH2_OPERATION];
extern const char *tomoyo_path_number_keyword[TOMOYO_MAX_PATH_NUMBER_OPERATION];

633 634 635
extern unsigned int tomoyo_quota_for_query;
extern unsigned int tomoyo_query_memory_size;

T
Tetsuo Handa 已提交
636 637
/********** Inlined functions. **********/

T
Tetsuo Handa 已提交
638 639 640 641 642
/**
 * tomoyo_read_lock - Take lock for protecting policy.
 *
 * Returns index number for tomoyo_read_unlock().
 */
T
Tetsuo Handa 已提交
643 644 645 646 647
static inline int tomoyo_read_lock(void)
{
	return srcu_read_lock(&tomoyo_ss);
}

T
Tetsuo Handa 已提交
648 649 650 651 652 653 654
/**
 * tomoyo_read_unlock - Release lock for protecting policy.
 *
 * @idx: Index number returned by tomoyo_read_lock().
 *
 * Returns nothing.
 */
T
Tetsuo Handa 已提交
655 656 657 658 659
static inline void tomoyo_read_unlock(int idx)
{
	srcu_read_unlock(&tomoyo_ss, idx);
}

T
Tetsuo Handa 已提交
660 661 662 663 664 665 666 667
/**
 * tomoyo_pathcmp - strcmp() for "struct tomoyo_path_info" structure.
 *
 * @a: Pointer to "struct tomoyo_path_info".
 * @b: Pointer to "struct tomoyo_path_info".
 *
 * Returns true if @a == @b, false otherwise.
 */
668 669 670 671 672 673 674
static inline bool tomoyo_pathcmp(const struct tomoyo_path_info *a,
				  const struct tomoyo_path_info *b)
{
	return a->hash != b->hash || strcmp(a->name, b->name);
}

/**
T
Tetsuo Handa 已提交
675
 * tomoyo_valid - Check whether the character is a valid char.
676 677 678 679 680
 *
 * @c: The character to check.
 *
 * Returns true if @c is a valid character, false otherwise.
 */
T
Tetsuo Handa 已提交
681
static inline bool tomoyo_valid(const unsigned char c)
682 683 684 685 686
{
	return c > ' ' && c < 127;
}

/**
T
Tetsuo Handa 已提交
687
 * tomoyo_invalid - Check whether the character is an invalid char.
688 689 690 691 692
 *
 * @c: The character to check.
 *
 * Returns true if @c is an invalid character, false otherwise.
 */
T
Tetsuo Handa 已提交
693
static inline bool tomoyo_invalid(const unsigned char c)
694 695 696 697
{
	return c && (c <= ' ' || c >= 127);
}

T
Tetsuo Handa 已提交
698 699 700 701 702 703 704
/**
 * tomoyo_put_name - Drop reference on "struct tomoyo_name".
 *
 * @name: Pointer to "struct tomoyo_path_info". Maybe NULL.
 *
 * Returns nothing.
 */
T
Tetsuo Handa 已提交
705 706 707
static inline void tomoyo_put_name(const struct tomoyo_path_info *name)
{
	if (name) {
T
Tetsuo Handa 已提交
708 709
		struct tomoyo_name *ptr =
			container_of(name, typeof(*ptr), entry);
T
Tetsuo Handa 已提交
710 711 712
		atomic_dec(&ptr->users);
	}
}
713

T
Tetsuo Handa 已提交
714 715 716 717 718 719 720
/**
 * tomoyo_put_group - Drop reference on "struct tomoyo_group".
 *
 * @group: Pointer to "struct tomoyo_group". Maybe NULL.
 *
 * Returns nothing.
 */
721
static inline void tomoyo_put_group(struct tomoyo_group *group)
722 723 724 725 726
{
	if (group)
		atomic_dec(&group->users);
}

T
Tetsuo Handa 已提交
727 728 729 730 731
/**
 * tomoyo_domain - Get "struct tomoyo_domain_info" for current thread.
 *
 * Returns pointer to "struct tomoyo_domain_info" for current thread.
 */
T
Tetsuo Handa 已提交
732 733 734 735
static inline struct tomoyo_domain_info *tomoyo_domain(void)
{
	return current_cred()->security;
}
736

T
Tetsuo Handa 已提交
737 738 739 740 741 742 743
/**
 * tomoyo_real_domain - Get "struct tomoyo_domain_info" for specified thread.
 *
 * @task: Pointer to "struct task_struct".
 *
 * Returns pointer to "struct tomoyo_security" for specified thread.
 */
T
Tetsuo Handa 已提交
744 745 746 747 748
static inline struct tomoyo_domain_info *tomoyo_real_domain(struct task_struct
							    *task)
{
	return task_cred_xxx(task, security);
}
749

T
Tetsuo Handa 已提交
750
static inline bool tomoyo_same_acl_head(const struct tomoyo_acl_info *p1,
T
Tetsuo Handa 已提交
751
					const struct tomoyo_acl_info *p2)
752 753 754 755
{
	return p1->type == p2->type;
}

T
Tetsuo Handa 已提交
756 757 758 759 760 761 762 763
/**
 * tomoyo_same_name_union - Check for duplicated "struct tomoyo_name_union" entry.
 *
 * @a: Pointer to "struct tomoyo_name_union".
 * @b: Pointer to "struct tomoyo_name_union".
 *
 * Returns true if @a == @b, false otherwise.
 */
T
Tetsuo Handa 已提交
764
static inline bool tomoyo_same_name_union
T
Tetsuo Handa 已提交
765
(const struct tomoyo_name_union *a, const struct tomoyo_name_union *b)
766
{
T
Tetsuo Handa 已提交
767 768
	return a->filename == b->filename && a->group == b->group &&
		a->is_group == b->is_group;
769 770
}

T
Tetsuo Handa 已提交
771 772 773 774 775 776 777 778
/**
 * tomoyo_same_number_union - Check for duplicated "struct tomoyo_number_union" entry.
 *
 * @a: Pointer to "struct tomoyo_number_union".
 * @b: Pointer to "struct tomoyo_number_union".
 *
 * Returns true if @a == @b, false otherwise.
 */
T
Tetsuo Handa 已提交
779
static inline bool tomoyo_same_number_union
T
Tetsuo Handa 已提交
780
(const struct tomoyo_number_union *a, const struct tomoyo_number_union *b)
781
{
T
Tetsuo Handa 已提交
782 783 784
	return a->values[0] == b->values[0] && a->values[1] == b->values[1] &&
		a->group == b->group && a->min_type == b->min_type &&
		a->max_type == b->max_type && a->is_group == b->is_group;
785 786
}

787 788 789 790 791
/**
 * list_for_each_cookie - iterate over a list with cookie.
 * @pos:        the &struct list_head to use as a loop cursor.
 * @head:       the head for your list.
 */
T
Tetsuo Handa 已提交
792 793 794 795
#define list_for_each_cookie(pos, head)					\
	if (!pos)							\
		pos =  srcu_dereference((head)->next, &tomoyo_ss);	\
	for ( ; pos != (head); pos = srcu_dereference(pos->next, &tomoyo_ss))
796

797
#endif /* !defined(_SECURITY_TOMOYO_COMMON_H) */