security.c 53.5 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * Security plug functions
 *
 * Copyright (C) 2001 WireX Communications, Inc <chris@wirex.com>
 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
 * Copyright (C) 2001 Networks Associates Technology, Inc <ssmalley@nai.com>
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 */

14
#include <linux/capability.h>
15
#include <linux/dcache.h>
L
Linus Torvalds 已提交
16 17 18
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
C
Casey Schaufler 已提交
19
#include <linux/lsm_hooks.h>
20
#include <linux/integrity.h>
21
#include <linux/ima.h>
22
#include <linux/evm.h>
A
Al Viro 已提交
23
#include <linux/fsnotify.h>
24 25 26
#include <linux/mman.h>
#include <linux/mount.h>
#include <linux/personality.h>
P
Paul Mundt 已提交
27
#include <linux/backing-dev.h>
A
Al Viro 已提交
28
#include <net/flow.h>
L
Linus Torvalds 已提交
29

30
#define MAX_LSM_EVM_XATTR	2
L
Linus Torvalds 已提交
31

C
Casey Schaufler 已提交
32 33 34
/* Maximum number of letters for an LSM name string */
#define SECURITY_NAME_MAX	10

35
/* Boot-time LSM user choice */
J
John Johansen 已提交
36 37
static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
	CONFIG_DEFAULT_SECURITY;
L
Linus Torvalds 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

static void __init do_security_initcalls(void)
{
	initcall_t *call;
	call = __security_initcall_start;
	while (call < __security_initcall_end) {
		(*call) ();
		call++;
	}
}

/**
 * security_init - initializes the security framework
 *
 * This should be called early in the kernel initialization sequence.
 */
int __init security_init(void)
{
C
Casey Schaufler 已提交
56
	pr_info("Security Framework initialized\n");
L
Linus Torvalds 已提交
57

C
Casey Schaufler 已提交
58
	/*
59
	 * Load minor LSMs, with the capability module always first.
C
Casey Schaufler 已提交
60 61 62
	 */
	capability_add_hooks();
	yama_add_hooks();
63
	loadpin_add_hooks();
64

C
Casey Schaufler 已提交
65
	/*
66
	 * Load all the remaining security modules.
C
Casey Schaufler 已提交
67
	 */
L
Linus Torvalds 已提交
68 69 70 71 72
	do_security_initcalls();

	return 0;
}

73 74 75 76 77 78 79 80 81 82
/* Save user chosen LSM */
static int __init choose_lsm(char *str)
{
	strncpy(chosen_lsm, str, SECURITY_NAME_MAX);
	return 1;
}
__setup("security=", choose_lsm);

/**
 * security_module_enable - Load given security module on boot ?
C
Casey Schaufler 已提交
83
 * @module: the name of the module
84 85 86
 *
 * Each LSM must pass this method before registering its own operations
 * to avoid security registration races. This method may also be used
87
 * to check if your LSM is currently loaded during kernel initialization.
88 89 90
 *
 * Return true if:
 *	-The passed LSM is the one chosen by user at boot time,
J
John Johansen 已提交
91
 *	-or the passed LSM is configured as the default and the user did not
92
 *	 choose an alternate LSM at boot time.
93 94
 * Otherwise, return false.
 */
C
Casey Schaufler 已提交
95
int __init security_module_enable(const char *module)
96
{
C
Casey Schaufler 已提交
97
	return !strcmp(module, chosen_lsm);
98 99
}

100
/*
C
Casey Schaufler 已提交
101
 * Hook list operation macros.
L
Linus Torvalds 已提交
102
 *
103 104
 * call_void_hook:
 *	This is a hook that does not return a value.
L
Linus Torvalds 已提交
105
 *
106 107
 * call_int_hook:
 *	This is a hook that returns a value.
L
Linus Torvalds 已提交
108 109
 */

C
Casey Schaufler 已提交
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
#define call_void_hook(FUNC, ...)				\
	do {							\
		struct security_hook_list *P;			\
								\
		list_for_each_entry(P, &security_hook_heads.FUNC, list)	\
			P->hook.FUNC(__VA_ARGS__);		\
	} while (0)

#define call_int_hook(FUNC, IRC, ...) ({			\
	int RC = IRC;						\
	do {							\
		struct security_hook_list *P;			\
								\
		list_for_each_entry(P, &security_hook_heads.FUNC, list) { \
			RC = P->hook.FUNC(__VA_ARGS__);		\
			if (RC != 0)				\
				break;				\
		}						\
	} while (0);						\
	RC;							\
})
L
Linus Torvalds 已提交
131

132 133
/* Security operations */

134 135
int security_binder_set_context_mgr(struct task_struct *mgr)
{
136
	return call_int_hook(binder_set_context_mgr, 0, mgr);
137 138 139 140 141
}

int security_binder_transaction(struct task_struct *from,
				struct task_struct *to)
{
142
	return call_int_hook(binder_transaction, 0, from, to);
143 144 145 146 147
}

int security_binder_transfer_binder(struct task_struct *from,
				    struct task_struct *to)
{
148
	return call_int_hook(binder_transfer_binder, 0, from, to);
149 150 151 152 153
}

int security_binder_transfer_file(struct task_struct *from,
				  struct task_struct *to, struct file *file)
{
154
	return call_int_hook(binder_transfer_file, 0, from, to, file);
155 156
}

157
int security_ptrace_access_check(struct task_struct *child, unsigned int mode)
158
{
159
	return call_int_hook(ptrace_access_check, 0, child, mode);
160 161 162 163
}

int security_ptrace_traceme(struct task_struct *parent)
{
164
	return call_int_hook(ptrace_traceme, 0, parent);
165 166 167 168 169 170 171
}

int security_capget(struct task_struct *target,
		     kernel_cap_t *effective,
		     kernel_cap_t *inheritable,
		     kernel_cap_t *permitted)
{
172 173
	return call_int_hook(capget, 0, target,
				effective, inheritable, permitted);
174 175
}

D
David Howells 已提交
176 177 178 179
int security_capset(struct cred *new, const struct cred *old,
		    const kernel_cap_t *effective,
		    const kernel_cap_t *inheritable,
		    const kernel_cap_t *permitted)
180
{
181 182
	return call_int_hook(capset, 0, new, old,
				effective, inheritable, permitted);
183 184
}

185
int security_capable(const struct cred *cred, struct user_namespace *ns,
186
		     int cap)
187
{
188
	return call_int_hook(capable, 0, cred, ns, cap, SECURITY_CAP_AUDIT);
189 190
}

191 192
int security_capable_noaudit(const struct cred *cred, struct user_namespace *ns,
			     int cap)
193
{
194
	return call_int_hook(capable, 0, cred, ns, cap, SECURITY_CAP_NOAUDIT);
195 196 197 198
}

int security_quotactl(int cmds, int type, int id, struct super_block *sb)
{
199
	return call_int_hook(quotactl, 0, cmds, type, id, sb);
200 201 202 203
}

int security_quota_on(struct dentry *dentry)
{
204
	return call_int_hook(quota_on, 0, dentry);
205 206
}

207
int security_syslog(int type)
208
{
209
	return call_int_hook(syslog, 0, type);
210 211
}

212
int security_settime64(const struct timespec64 *ts, const struct timezone *tz)
213
{
214
	return call_int_hook(settime, 0, ts, tz);
215 216 217 218
}

int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
C
Casey Schaufler 已提交
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	struct security_hook_list *hp;
	int cap_sys_admin = 1;
	int rc;

	/*
	 * The module will respond with a positive value if
	 * it thinks the __vm_enough_memory() call should be
	 * made with the cap_sys_admin set. If all of the modules
	 * agree that it should be set it will. If any module
	 * thinks it should not be set it won't.
	 */
	list_for_each_entry(hp, &security_hook_heads.vm_enough_memory, list) {
		rc = hp->hook.vm_enough_memory(mm, pages);
		if (rc <= 0) {
			cap_sys_admin = 0;
			break;
		}
	}
	return __vm_enough_memory(mm, pages, cap_sys_admin);
238 239
}

240
int security_bprm_set_creds(struct linux_binprm *bprm)
241
{
242
	return call_int_hook(bprm_set_creds, 0, bprm);
243 244
}

245
int security_bprm_check(struct linux_binprm *bprm)
246
{
247 248
	int ret;

249
	ret = call_int_hook(bprm_check_security, 0, bprm);
250 251 252
	if (ret)
		return ret;
	return ima_bprm_check(bprm);
253 254
}

255
void security_bprm_committing_creds(struct linux_binprm *bprm)
256
{
257
	call_void_hook(bprm_committing_creds, bprm);
258 259
}

260
void security_bprm_committed_creds(struct linux_binprm *bprm)
261
{
262
	call_void_hook(bprm_committed_creds, bprm);
263 264 265 266
}

int security_bprm_secureexec(struct linux_binprm *bprm)
{
267
	return call_int_hook(bprm_secureexec, 0, bprm);
268 269 270 271
}

int security_sb_alloc(struct super_block *sb)
{
272
	return call_int_hook(sb_alloc_security, 0, sb);
273 274 275 276
}

void security_sb_free(struct super_block *sb)
{
277
	call_void_hook(sb_free_security, sb);
278 279
}

280
int security_sb_copy_data(char *orig, char *copy)
281
{
282
	return call_int_hook(sb_copy_data, 0, orig, copy);
283
}
284
EXPORT_SYMBOL(security_sb_copy_data);
285

286 287
int security_sb_remount(struct super_block *sb, void *data)
{
288
	return call_int_hook(sb_remount, 0, sb, data);
289 290
}

291
int security_sb_kern_mount(struct super_block *sb, int flags, void *data)
292
{
293
	return call_int_hook(sb_kern_mount, 0, sb, flags, data);
294 295
}

296 297
int security_sb_show_options(struct seq_file *m, struct super_block *sb)
{
298
	return call_int_hook(sb_show_options, 0, m, sb);
299 300
}

301 302
int security_sb_statfs(struct dentry *dentry)
{
303
	return call_int_hook(sb_statfs, 0, dentry);
304 305
}

A
Al Viro 已提交
306
int security_sb_mount(const char *dev_name, const struct path *path,
A
Al Viro 已提交
307
                       const char *type, unsigned long flags, void *data)
308
{
309
	return call_int_hook(sb_mount, 0, dev_name, path, type, flags, data);
310 311 312 313
}

int security_sb_umount(struct vfsmount *mnt, int flags)
{
314
	return call_int_hook(sb_umount, 0, mnt, flags);
315 316
}

A
Al Viro 已提交
317
int security_sb_pivotroot(const struct path *old_path, const struct path *new_path)
318
{
319
	return call_int_hook(sb_pivotroot, 0, old_path, new_path);
320 321
}

322
int security_sb_set_mnt_opts(struct super_block *sb,
323 324 325
				struct security_mnt_opts *opts,
				unsigned long kern_flags,
				unsigned long *set_kern_flags)
326
{
C
Casey Schaufler 已提交
327 328 329
	return call_int_hook(sb_set_mnt_opts,
				opts->num_mnt_opts ? -EOPNOTSUPP : 0, sb,
				opts, kern_flags, set_kern_flags);
330
}
331
EXPORT_SYMBOL(security_sb_set_mnt_opts);
332

333
int security_sb_clone_mnt_opts(const struct super_block *oldsb,
334 335
				struct super_block *newsb)
{
336
	return call_int_hook(sb_clone_mnt_opts, 0, oldsb, newsb);
337
}
338 339 340 341
EXPORT_SYMBOL(security_sb_clone_mnt_opts);

int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts)
{
342
	return call_int_hook(sb_parse_opts_str, 0, options, opts);
343 344
}
EXPORT_SYMBOL(security_sb_parse_opts_str);
345

346 347 348
int security_inode_alloc(struct inode *inode)
{
	inode->i_security = NULL;
349
	return call_int_hook(inode_alloc_security, 0, inode);
350 351 352 353
}

void security_inode_free(struct inode *inode)
{
354
	integrity_inode_free(inode);
355
	call_void_hook(inode_free_security, inode);
356 357
}

358 359 360 361
int security_dentry_init_security(struct dentry *dentry, int mode,
					struct qstr *name, void **ctx,
					u32 *ctxlen)
{
C
Casey Schaufler 已提交
362 363
	return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
				name, ctx, ctxlen);
364 365 366
}
EXPORT_SYMBOL(security_dentry_init_security);

367
int security_inode_init_security(struct inode *inode, struct inode *dir,
368 369
				 const struct qstr *qstr,
				 const initxattrs initxattrs, void *fs_data)
370
{
371 372
	struct xattr new_xattrs[MAX_LSM_EVM_XATTR + 1];
	struct xattr *lsm_xattr, *evm_xattr, *xattr;
373 374
	int ret;

375
	if (unlikely(IS_PRIVATE(inode)))
376
		return 0;
377 378

	if (!initxattrs)
379 380
		return call_int_hook(inode_init_security, -EOPNOTSUPP, inode,
				     dir, qstr, NULL, NULL, NULL);
381
	memset(new_xattrs, 0, sizeof(new_xattrs));
382
	lsm_xattr = new_xattrs;
C
Casey Schaufler 已提交
383
	ret = call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir, qstr,
384 385 386 387 388
						&lsm_xattr->name,
						&lsm_xattr->value,
						&lsm_xattr->value_len);
	if (ret)
		goto out;
389 390 391 392 393

	evm_xattr = lsm_xattr + 1;
	ret = evm_inode_init_security(inode, lsm_xattr, evm_xattr);
	if (ret)
		goto out;
394 395
	ret = initxattrs(inode, new_xattrs, fs_data);
out:
396
	for (xattr = new_xattrs; xattr->value != NULL; xattr++)
397
		kfree(xattr->value);
398 399 400 401 402
	return (ret == -EOPNOTSUPP) ? 0 : ret;
}
EXPORT_SYMBOL(security_inode_init_security);

int security_old_inode_init_security(struct inode *inode, struct inode *dir,
403
				     const struct qstr *qstr, const char **name,
404
				     void **value, size_t *len)
405 406
{
	if (unlikely(IS_PRIVATE(inode)))
407
		return -EOPNOTSUPP;
408 409
	return call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir,
			     qstr, name, value, len);
410
}
411
EXPORT_SYMBOL(security_old_inode_init_security);
412

413
#ifdef CONFIG_SECURITY_PATH
414
int security_path_mknod(const struct path *dir, struct dentry *dentry, umode_t mode,
415 416
			unsigned int dev)
{
417
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
418
		return 0;
419
	return call_int_hook(path_mknod, 0, dir, dentry, mode, dev);
420 421 422
}
EXPORT_SYMBOL(security_path_mknod);

423
int security_path_mkdir(const struct path *dir, struct dentry *dentry, umode_t mode)
424
{
425
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
426
		return 0;
427
	return call_int_hook(path_mkdir, 0, dir, dentry, mode);
428
}
429
EXPORT_SYMBOL(security_path_mkdir);
430

A
Al Viro 已提交
431
int security_path_rmdir(const struct path *dir, struct dentry *dentry)
432
{
433
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
434
		return 0;
435
	return call_int_hook(path_rmdir, 0, dir, dentry);
436 437
}

A
Al Viro 已提交
438
int security_path_unlink(const struct path *dir, struct dentry *dentry)
439
{
440
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
441
		return 0;
442
	return call_int_hook(path_unlink, 0, dir, dentry);
443
}
444
EXPORT_SYMBOL(security_path_unlink);
445

446
int security_path_symlink(const struct path *dir, struct dentry *dentry,
447 448
			  const char *old_name)
{
449
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
450
		return 0;
451
	return call_int_hook(path_symlink, 0, dir, dentry, old_name);
452 453
}

A
Al Viro 已提交
454
int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
455 456
		       struct dentry *new_dentry)
{
457
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
458
		return 0;
459
	return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
460 461
}

A
Al Viro 已提交
462 463
int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
			 const struct path *new_dir, struct dentry *new_dentry,
464
			 unsigned int flags)
465
{
466 467
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
		     (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
468
		return 0;
M
Miklos Szeredi 已提交
469 470

	if (flags & RENAME_EXCHANGE) {
471 472
		int err = call_int_hook(path_rename, 0, new_dir, new_dentry,
					old_dir, old_dentry);
M
Miklos Szeredi 已提交
473 474 475 476
		if (err)
			return err;
	}

477 478
	return call_int_hook(path_rename, 0, old_dir, old_dentry, new_dir,
				new_dentry);
479
}
480
EXPORT_SYMBOL(security_path_rename);
481

A
Al Viro 已提交
482
int security_path_truncate(const struct path *path)
483
{
484
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
485
		return 0;
486
	return call_int_hook(path_truncate, 0, path);
487
}
488

489
int security_path_chmod(const struct path *path, umode_t mode)
490
{
491
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
492
		return 0;
493
	return call_int_hook(path_chmod, 0, path, mode);
494 495
}

496
int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
497
{
498
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
499
		return 0;
500
	return call_int_hook(path_chown, 0, path, uid, gid);
501
}
T
Tetsuo Handa 已提交
502

A
Al Viro 已提交
503
int security_path_chroot(const struct path *path)
T
Tetsuo Handa 已提交
504
{
505
	return call_int_hook(path_chroot, 0, path);
T
Tetsuo Handa 已提交
506
}
507 508
#endif

A
Al Viro 已提交
509
int security_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
510 511 512
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
513
	return call_int_hook(inode_create, 0, dir, dentry, mode);
514
}
515
EXPORT_SYMBOL_GPL(security_inode_create);
516 517 518 519

int security_inode_link(struct dentry *old_dentry, struct inode *dir,
			 struct dentry *new_dentry)
{
520
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
521
		return 0;
522
	return call_int_hook(inode_link, 0, old_dentry, dir, new_dentry);
523 524 525 526
}

int security_inode_unlink(struct inode *dir, struct dentry *dentry)
{
527
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
528
		return 0;
529
	return call_int_hook(inode_unlink, 0, dir, dentry);
530 531 532 533 534 535 536
}

int security_inode_symlink(struct inode *dir, struct dentry *dentry,
			    const char *old_name)
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
537
	return call_int_hook(inode_symlink, 0, dir, dentry, old_name);
538 539
}

540
int security_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
541 542 543
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
544
	return call_int_hook(inode_mkdir, 0, dir, dentry, mode);
545
}
546
EXPORT_SYMBOL_GPL(security_inode_mkdir);
547 548 549

int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
{
550
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
551
		return 0;
552
	return call_int_hook(inode_rmdir, 0, dir, dentry);
553 554
}

A
Al Viro 已提交
555
int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
556 557 558
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
559
	return call_int_hook(inode_mknod, 0, dir, dentry, mode, dev);
560 561 562
}

int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
563 564
			   struct inode *new_dir, struct dentry *new_dentry,
			   unsigned int flags)
565
{
566 567
        if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
            (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
568
		return 0;
M
Miklos Szeredi 已提交
569 570

	if (flags & RENAME_EXCHANGE) {
571
		int err = call_int_hook(inode_rename, 0, new_dir, new_dentry,
M
Miklos Szeredi 已提交
572 573 574 575 576
						     old_dir, old_dentry);
		if (err)
			return err;
	}

577
	return call_int_hook(inode_rename, 0, old_dir, old_dentry,
578 579 580 581 582
					   new_dir, new_dentry);
}

int security_inode_readlink(struct dentry *dentry)
{
583
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
584
		return 0;
585
	return call_int_hook(inode_readlink, 0, dentry);
586 587
}

588 589
int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
			       bool rcu)
590
{
591
	if (unlikely(IS_PRIVATE(inode)))
592
		return 0;
593
	return call_int_hook(inode_follow_link, 0, dentry, inode, rcu);
594 595
}

596
int security_inode_permission(struct inode *inode, int mask)
597 598 599
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
600
	return call_int_hook(inode_permission, 0, inode, mask);
601 602 603 604
}

int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
{
605 606
	int ret;

607
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
608
		return 0;
609
	ret = call_int_hook(inode_setattr, 0, dentry, attr);
610 611 612
	if (ret)
		return ret;
	return evm_inode_setattr(dentry, attr);
613
}
614
EXPORT_SYMBOL_GPL(security_inode_setattr);
615

616
int security_inode_getattr(const struct path *path)
617
{
618
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
619
		return 0;
620
	return call_int_hook(inode_getattr, 0, path);
621 622
}

623 624
int security_inode_setxattr(struct dentry *dentry, const char *name,
			    const void *value, size_t size, int flags)
625
{
626 627
	int ret;

628
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
629
		return 0;
C
Casey Schaufler 已提交
630 631 632 633 634
	/*
	 * SELinux and Smack integrate the cap call,
	 * so assume that all LSMs supplying this call do so.
	 */
	ret = call_int_hook(inode_setxattr, 1, dentry, name, value, size,
635
				flags);
C
Casey Schaufler 已提交
636 637 638

	if (ret == 1)
		ret = cap_inode_setxattr(dentry, name, value, size, flags);
639 640 641
	if (ret)
		return ret;
	ret = ima_inode_setxattr(dentry, name, value, size);
642 643 644
	if (ret)
		return ret;
	return evm_inode_setxattr(dentry, name, value, size);
645 646
}

647 648
void security_inode_post_setxattr(struct dentry *dentry, const char *name,
				  const void *value, size_t size, int flags)
649
{
650
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
651
		return;
652
	call_void_hook(inode_post_setxattr, dentry, name, value, size, flags);
653
	evm_inode_post_setxattr(dentry, name, value, size);
654 655
}

656
int security_inode_getxattr(struct dentry *dentry, const char *name)
657
{
658
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
659
		return 0;
660
	return call_int_hook(inode_getxattr, 0, dentry, name);
661 662 663 664
}

int security_inode_listxattr(struct dentry *dentry)
{
665
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
666
		return 0;
667
	return call_int_hook(inode_listxattr, 0, dentry);
668 669
}

670
int security_inode_removexattr(struct dentry *dentry, const char *name)
671
{
672 673
	int ret;

674
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
675
		return 0;
C
Casey Schaufler 已提交
676 677 678 679 680 681 682
	/*
	 * SELinux and Smack integrate the cap call,
	 * so assume that all LSMs supplying this call do so.
	 */
	ret = call_int_hook(inode_removexattr, 1, dentry, name);
	if (ret == 1)
		ret = cap_inode_removexattr(dentry, name);
683 684 685
	if (ret)
		return ret;
	ret = ima_inode_removexattr(dentry, name);
686 687 688
	if (ret)
		return ret;
	return evm_inode_removexattr(dentry, name);
689 690
}

691 692
int security_inode_need_killpriv(struct dentry *dentry)
{
693
	return call_int_hook(inode_need_killpriv, 0, dentry);
694 695 696 697
}

int security_inode_killpriv(struct dentry *dentry)
{
698
	return call_int_hook(inode_killpriv, 0, dentry);
699 700
}

701
int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
702 703
{
	if (unlikely(IS_PRIVATE(inode)))
704
		return -EOPNOTSUPP;
C
Casey Schaufler 已提交
705 706
	return call_int_hook(inode_getsecurity, -EOPNOTSUPP, inode, name,
				buffer, alloc);
707 708 709 710 711
}

int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
{
	if (unlikely(IS_PRIVATE(inode)))
712
		return -EOPNOTSUPP;
C
Casey Schaufler 已提交
713 714
	return call_int_hook(inode_setsecurity, -EOPNOTSUPP, inode, name,
				value, size, flags);
715 716 717 718 719 720
}

int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
721
	return call_int_hook(inode_listsecurity, 0, inode, buffer, buffer_size);
722
}
723
EXPORT_SYMBOL(security_inode_listsecurity);
724

725
void security_inode_getsecid(struct inode *inode, u32 *secid)
726
{
727
	call_void_hook(inode_getsecid, inode, secid);
728 729
}

730 731
int security_file_permission(struct file *file, int mask)
{
732 733
	int ret;

734
	ret = call_int_hook(file_permission, 0, file, mask);
735 736 737 738
	if (ret)
		return ret;

	return fsnotify_perm(file, mask);
739 740 741 742
}

int security_file_alloc(struct file *file)
{
743
	return call_int_hook(file_alloc_security, 0, file);
744 745 746 747
}

void security_file_free(struct file *file)
{
748
	call_void_hook(file_free_security, file);
749 750 751 752
}

int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
753
	return call_int_hook(file_ioctl, 0, file, cmd, arg);
754 755
}

756
static inline unsigned long mmap_prot(struct file *file, unsigned long prot)
757
{
758
	/*
759 760
	 * Does we have PROT_READ and does the application expect
	 * it to imply PROT_EXEC?  If not, nothing to talk about...
761
	 */
762 763
	if ((prot & (PROT_READ | PROT_EXEC)) != PROT_READ)
		return prot;
764
	if (!(current->personality & READ_IMPLIES_EXEC))
765 766 767 768 769 770 771 772
		return prot;
	/*
	 * if that's an anonymous mapping, let it.
	 */
	if (!file)
		return prot | PROT_EXEC;
	/*
	 * ditto if it's not on noexec mount, except that on !MMU we need
773
	 * NOMMU_MAP_EXEC (== VM_MAYEXEC) in this case
774
	 */
775
	if (!path_noexec(&file->f_path)) {
776
#ifndef CONFIG_MMU
777 778 779 780 781
		if (file->f_op->mmap_capabilities) {
			unsigned caps = file->f_op->mmap_capabilities(file);
			if (!(caps & NOMMU_MAP_EXEC))
				return prot;
		}
782
#endif
783
		return prot | PROT_EXEC;
784
	}
785 786 787 788 789 790 791 792
	/* anything on noexec mount won't get PROT_EXEC */
	return prot;
}

int security_mmap_file(struct file *file, unsigned long prot,
			unsigned long flags)
{
	int ret;
793
	ret = call_int_hook(mmap_file, 0, file, prot,
794
					mmap_prot(file, prot), flags);
795 796 797
	if (ret)
		return ret;
	return ima_file_mmap(file, prot);
798 799
}

800 801
int security_mmap_addr(unsigned long addr)
{
802
	return call_int_hook(mmap_addr, 0, addr);
803 804
}

805 806 807
int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot,
			    unsigned long prot)
{
808
	return call_int_hook(file_mprotect, 0, vma, reqprot, prot);
809 810 811 812
}

int security_file_lock(struct file *file, unsigned int cmd)
{
813
	return call_int_hook(file_lock, 0, file, cmd);
814 815 816 817
}

int security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
{
818
	return call_int_hook(file_fcntl, 0, file, cmd, arg);
819 820
}

821
void security_file_set_fowner(struct file *file)
822
{
823
	call_void_hook(file_set_fowner, file);
824 825 826 827 828
}

int security_file_send_sigiotask(struct task_struct *tsk,
				  struct fown_struct *fown, int sig)
{
829
	return call_int_hook(file_send_sigiotask, 0, tsk, fown, sig);
830 831 832 833
}

int security_file_receive(struct file *file)
{
834
	return call_int_hook(file_receive, 0, file);
835 836
}

837
int security_file_open(struct file *file, const struct cred *cred)
838
{
839 840
	int ret;

841
	ret = call_int_hook(file_open, 0, file, cred);
842 843 844 845
	if (ret)
		return ret;

	return fsnotify_perm(file, MAY_OPEN);
846 847 848 849
}

int security_task_create(unsigned long clone_flags)
{
850
	return call_int_hook(task_create, 0, clone_flags);
851 852
}

853 854
void security_task_free(struct task_struct *task)
{
855
	call_void_hook(task_free, task);
856 857
}

858 859
int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
{
860
	return call_int_hook(cred_alloc_blank, 0, cred, gfp);
861 862
}

D
David Howells 已提交
863
void security_cred_free(struct cred *cred)
864
{
865
	call_void_hook(cred_free, cred);
866 867
}

D
David Howells 已提交
868
int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp)
869
{
870
	return call_int_hook(cred_prepare, 0, new, old, gfp);
D
David Howells 已提交
871 872
}

873 874
void security_transfer_creds(struct cred *new, const struct cred *old)
{
875
	call_void_hook(cred_transfer, new, old);
876 877
}

878 879
int security_kernel_act_as(struct cred *new, u32 secid)
{
880
	return call_int_hook(kernel_act_as, 0, new, secid);
881 882 883 884
}

int security_kernel_create_files_as(struct cred *new, struct inode *inode)
{
885
	return call_int_hook(kernel_create_files_as, 0, new, inode);
886 887
}

888
int security_kernel_module_request(char *kmod_name)
889
{
890
	return call_int_hook(kernel_module_request, 0, kmod_name);
891 892
}

893 894 895 896 897 898 899 900 901 902 903
int security_kernel_read_file(struct file *file, enum kernel_read_file_id id)
{
	int ret;

	ret = call_int_hook(kernel_read_file, 0, file, id);
	if (ret)
		return ret;
	return ima_read_file(file, id);
}
EXPORT_SYMBOL_GPL(security_kernel_read_file);

904 905
int security_kernel_post_read_file(struct file *file, char *buf, loff_t size,
				   enum kernel_read_file_id id)
906
{
907 908 909 910 911 912
	int ret;

	ret = call_int_hook(kernel_post_read_file, 0, file, buf, size, id);
	if (ret)
		return ret;
	return ima_post_read_file(file, buf, size, id);
913 914 915
}
EXPORT_SYMBOL_GPL(security_kernel_post_read_file);

D
David Howells 已提交
916 917
int security_task_fix_setuid(struct cred *new, const struct cred *old,
			     int flags)
918
{
919
	return call_int_hook(task_fix_setuid, 0, new, old, flags);
920 921 922 923
}

int security_task_setpgid(struct task_struct *p, pid_t pgid)
{
924
	return call_int_hook(task_setpgid, 0, p, pgid);
925 926 927 928
}

int security_task_getpgid(struct task_struct *p)
{
929
	return call_int_hook(task_getpgid, 0, p);
930 931 932 933
}

int security_task_getsid(struct task_struct *p)
{
934
	return call_int_hook(task_getsid, 0, p);
935 936 937 938
}

void security_task_getsecid(struct task_struct *p, u32 *secid)
{
C
Casey Schaufler 已提交
939
	*secid = 0;
940
	call_void_hook(task_getsecid, p, secid);
941 942 943 944 945
}
EXPORT_SYMBOL(security_task_getsecid);

int security_task_setnice(struct task_struct *p, int nice)
{
946
	return call_int_hook(task_setnice, 0, p, nice);
947 948 949 950
}

int security_task_setioprio(struct task_struct *p, int ioprio)
{
951
	return call_int_hook(task_setioprio, 0, p, ioprio);
952 953 954 955
}

int security_task_getioprio(struct task_struct *p)
{
956
	return call_int_hook(task_getioprio, 0, p);
957 958
}

959 960
int security_task_setrlimit(struct task_struct *p, unsigned int resource,
		struct rlimit *new_rlim)
961
{
962
	return call_int_hook(task_setrlimit, 0, p, resource, new_rlim);
963 964
}

965
int security_task_setscheduler(struct task_struct *p)
966
{
967
	return call_int_hook(task_setscheduler, 0, p);
968 969 970 971
}

int security_task_getscheduler(struct task_struct *p)
{
972
	return call_int_hook(task_getscheduler, 0, p);
973 974 975 976
}

int security_task_movememory(struct task_struct *p)
{
977
	return call_int_hook(task_movememory, 0, p);
978 979 980 981 982
}

int security_task_kill(struct task_struct *p, struct siginfo *info,
			int sig, u32 secid)
{
983
	return call_int_hook(task_kill, 0, p, info, sig, secid);
984 985 986 987
}

int security_task_wait(struct task_struct *p)
{
988
	return call_int_hook(task_wait, 0, p);
989 990 991
}

int security_task_prctl(int option, unsigned long arg2, unsigned long arg3,
D
David Howells 已提交
992
			 unsigned long arg4, unsigned long arg5)
993
{
C
Casey Schaufler 已提交
994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
	int thisrc;
	int rc = -ENOSYS;
	struct security_hook_list *hp;

	list_for_each_entry(hp, &security_hook_heads.task_prctl, list) {
		thisrc = hp->hook.task_prctl(option, arg2, arg3, arg4, arg5);
		if (thisrc != -ENOSYS) {
			rc = thisrc;
			if (thisrc != 0)
				break;
		}
	}
	return rc;
1007 1008 1009 1010
}

void security_task_to_inode(struct task_struct *p, struct inode *inode)
{
1011
	call_void_hook(task_to_inode, p, inode);
1012 1013 1014 1015
}

int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
{
1016
	return call_int_hook(ipc_permission, 0, ipcp, flag);
1017 1018
}

1019 1020
void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
{
C
Casey Schaufler 已提交
1021
	*secid = 0;
1022
	call_void_hook(ipc_getsecid, ipcp, secid);
1023 1024
}

1025 1026
int security_msg_msg_alloc(struct msg_msg *msg)
{
1027
	return call_int_hook(msg_msg_alloc_security, 0, msg);
1028 1029 1030 1031
}

void security_msg_msg_free(struct msg_msg *msg)
{
1032
	call_void_hook(msg_msg_free_security, msg);
1033 1034 1035 1036
}

int security_msg_queue_alloc(struct msg_queue *msq)
{
1037
	return call_int_hook(msg_queue_alloc_security, 0, msq);
1038 1039 1040 1041
}

void security_msg_queue_free(struct msg_queue *msq)
{
1042
	call_void_hook(msg_queue_free_security, msq);
1043 1044 1045 1046
}

int security_msg_queue_associate(struct msg_queue *msq, int msqflg)
{
1047
	return call_int_hook(msg_queue_associate, 0, msq, msqflg);
1048 1049 1050 1051
}

int security_msg_queue_msgctl(struct msg_queue *msq, int cmd)
{
1052
	return call_int_hook(msg_queue_msgctl, 0, msq, cmd);
1053 1054 1055 1056 1057
}

int security_msg_queue_msgsnd(struct msg_queue *msq,
			       struct msg_msg *msg, int msqflg)
{
1058
	return call_int_hook(msg_queue_msgsnd, 0, msq, msg, msqflg);
1059 1060 1061 1062 1063
}

int security_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
			       struct task_struct *target, long type, int mode)
{
1064
	return call_int_hook(msg_queue_msgrcv, 0, msq, msg, target, type, mode);
1065 1066 1067 1068
}

int security_shm_alloc(struct shmid_kernel *shp)
{
1069
	return call_int_hook(shm_alloc_security, 0, shp);
1070 1071 1072 1073
}

void security_shm_free(struct shmid_kernel *shp)
{
1074
	call_void_hook(shm_free_security, shp);
1075 1076 1077 1078
}

int security_shm_associate(struct shmid_kernel *shp, int shmflg)
{
1079
	return call_int_hook(shm_associate, 0, shp, shmflg);
1080 1081 1082 1083
}

int security_shm_shmctl(struct shmid_kernel *shp, int cmd)
{
1084
	return call_int_hook(shm_shmctl, 0, shp, cmd);
1085 1086 1087 1088
}

int security_shm_shmat(struct shmid_kernel *shp, char __user *shmaddr, int shmflg)
{
1089
	return call_int_hook(shm_shmat, 0, shp, shmaddr, shmflg);
1090 1091 1092 1093
}

int security_sem_alloc(struct sem_array *sma)
{
1094
	return call_int_hook(sem_alloc_security, 0, sma);
1095 1096 1097 1098
}

void security_sem_free(struct sem_array *sma)
{
1099
	call_void_hook(sem_free_security, sma);
1100 1101 1102 1103
}

int security_sem_associate(struct sem_array *sma, int semflg)
{
1104
	return call_int_hook(sem_associate, 0, sma, semflg);
1105 1106 1107 1108
}

int security_sem_semctl(struct sem_array *sma, int cmd)
{
1109
	return call_int_hook(sem_semctl, 0, sma, cmd);
1110 1111 1112 1113 1114
}

int security_sem_semop(struct sem_array *sma, struct sembuf *sops,
			unsigned nsops, int alter)
{
1115
	return call_int_hook(sem_semop, 0, sma, sops, nsops, alter);
1116 1117 1118 1119 1120 1121
}

void security_d_instantiate(struct dentry *dentry, struct inode *inode)
{
	if (unlikely(inode && IS_PRIVATE(inode)))
		return;
1122
	call_void_hook(d_instantiate, dentry, inode);
1123 1124 1125 1126 1127
}
EXPORT_SYMBOL(security_d_instantiate);

int security_getprocattr(struct task_struct *p, char *name, char **value)
{
C
Casey Schaufler 已提交
1128
	return call_int_hook(getprocattr, -EINVAL, p, name, value);
1129 1130 1131 1132
}

int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size)
{
C
Casey Schaufler 已提交
1133
	return call_int_hook(setprocattr, -EINVAL, p, name, value, size);
1134 1135 1136 1137
}

int security_netlink_send(struct sock *sk, struct sk_buff *skb)
{
1138
	return call_int_hook(netlink_send, 0, sk, skb);
1139 1140
}

1141 1142
int security_ismaclabel(const char *name)
{
1143
	return call_int_hook(ismaclabel, 0, name);
1144 1145 1146
}
EXPORT_SYMBOL(security_ismaclabel);

1147 1148
int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
{
C
Casey Schaufler 已提交
1149 1150
	return call_int_hook(secid_to_secctx, -EOPNOTSUPP, secid, secdata,
				seclen);
1151 1152 1153
}
EXPORT_SYMBOL(security_secid_to_secctx);

1154
int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
1155
{
C
Casey Schaufler 已提交
1156
	*secid = 0;
1157
	return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid);
1158 1159 1160
}
EXPORT_SYMBOL(security_secctx_to_secid);

1161 1162
void security_release_secctx(char *secdata, u32 seclen)
{
1163
	call_void_hook(release_secctx, secdata, seclen);
1164 1165 1166
}
EXPORT_SYMBOL(security_release_secctx);

1167 1168 1169 1170 1171 1172
void security_inode_invalidate_secctx(struct inode *inode)
{
	call_void_hook(inode_invalidate_secctx, inode);
}
EXPORT_SYMBOL(security_inode_invalidate_secctx);

1173 1174
int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
{
1175
	return call_int_hook(inode_notifysecctx, 0, inode, ctx, ctxlen);
1176 1177 1178 1179 1180
}
EXPORT_SYMBOL(security_inode_notifysecctx);

int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
{
1181
	return call_int_hook(inode_setsecctx, 0, dentry, ctx, ctxlen);
1182 1183 1184 1185 1186
}
EXPORT_SYMBOL(security_inode_setsecctx);

int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
{
C
Casey Schaufler 已提交
1187
	return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen);
1188 1189 1190
}
EXPORT_SYMBOL(security_inode_getsecctx);

1191 1192
#ifdef CONFIG_SECURITY_NETWORK

1193
int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk)
1194
{
1195
	return call_int_hook(unix_stream_connect, 0, sock, other, newsk);
1196 1197 1198 1199 1200
}
EXPORT_SYMBOL(security_unix_stream_connect);

int security_unix_may_send(struct socket *sock,  struct socket *other)
{
1201
	return call_int_hook(unix_may_send, 0, sock, other);
1202 1203 1204 1205 1206
}
EXPORT_SYMBOL(security_unix_may_send);

int security_socket_create(int family, int type, int protocol, int kern)
{
1207
	return call_int_hook(socket_create, 0, family, type, protocol, kern);
1208 1209 1210 1211 1212
}

int security_socket_post_create(struct socket *sock, int family,
				int type, int protocol, int kern)
{
1213
	return call_int_hook(socket_post_create, 0, sock, family, type,
1214 1215 1216 1217 1218
						protocol, kern);
}

int security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
{
1219
	return call_int_hook(socket_bind, 0, sock, address, addrlen);
1220 1221 1222 1223
}

int security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
{
1224
	return call_int_hook(socket_connect, 0, sock, address, addrlen);
1225 1226 1227 1228
}

int security_socket_listen(struct socket *sock, int backlog)
{
1229
	return call_int_hook(socket_listen, 0, sock, backlog);
1230 1231 1232 1233
}

int security_socket_accept(struct socket *sock, struct socket *newsock)
{
1234
	return call_int_hook(socket_accept, 0, sock, newsock);
1235 1236 1237 1238
}

int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)
{
1239
	return call_int_hook(socket_sendmsg, 0, sock, msg, size);
1240 1241 1242 1243 1244
}

int security_socket_recvmsg(struct socket *sock, struct msghdr *msg,
			    int size, int flags)
{
1245
	return call_int_hook(socket_recvmsg, 0, sock, msg, size, flags);
1246 1247 1248 1249
}

int security_socket_getsockname(struct socket *sock)
{
1250
	return call_int_hook(socket_getsockname, 0, sock);
1251 1252 1253 1254
}

int security_socket_getpeername(struct socket *sock)
{
1255
	return call_int_hook(socket_getpeername, 0, sock);
1256 1257 1258 1259
}

int security_socket_getsockopt(struct socket *sock, int level, int optname)
{
1260
	return call_int_hook(socket_getsockopt, 0, sock, level, optname);
1261 1262 1263 1264
}

int security_socket_setsockopt(struct socket *sock, int level, int optname)
{
1265
	return call_int_hook(socket_setsockopt, 0, sock, level, optname);
1266 1267 1268 1269
}

int security_socket_shutdown(struct socket *sock, int how)
{
1270
	return call_int_hook(socket_shutdown, 0, sock, how);
1271 1272 1273 1274
}

int security_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
{
1275
	return call_int_hook(socket_sock_rcv_skb, 0, sk, skb);
1276 1277 1278 1279 1280 1281
}
EXPORT_SYMBOL(security_sock_rcv_skb);

int security_socket_getpeersec_stream(struct socket *sock, char __user *optval,
				      int __user *optlen, unsigned len)
{
C
Casey Schaufler 已提交
1282 1283
	return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock,
				optval, optlen, len);
1284 1285 1286 1287
}

int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
{
1288 1289
	return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock,
			     skb, secid);
1290 1291 1292 1293 1294
}
EXPORT_SYMBOL(security_socket_getpeersec_dgram);

int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
{
1295
	return call_int_hook(sk_alloc_security, 0, sk, family, priority);
1296 1297 1298 1299
}

void security_sk_free(struct sock *sk)
{
1300
	call_void_hook(sk_free_security, sk);
1301 1302 1303 1304
}

void security_sk_clone(const struct sock *sk, struct sock *newsk)
{
1305
	call_void_hook(sk_clone_security, sk, newsk);
1306
}
1307
EXPORT_SYMBOL(security_sk_clone);
1308 1309 1310

void security_sk_classify_flow(struct sock *sk, struct flowi *fl)
{
1311
	call_void_hook(sk_getsecid, sk, &fl->flowi_secid);
1312 1313 1314 1315 1316
}
EXPORT_SYMBOL(security_sk_classify_flow);

void security_req_classify_flow(const struct request_sock *req, struct flowi *fl)
{
1317
	call_void_hook(req_classify_flow, req, fl);
1318 1319 1320 1321 1322
}
EXPORT_SYMBOL(security_req_classify_flow);

void security_sock_graft(struct sock *sk, struct socket *parent)
{
1323
	call_void_hook(sock_graft, sk, parent);
1324 1325 1326 1327 1328 1329
}
EXPORT_SYMBOL(security_sock_graft);

int security_inet_conn_request(struct sock *sk,
			struct sk_buff *skb, struct request_sock *req)
{
1330
	return call_int_hook(inet_conn_request, 0, sk, skb, req);
1331 1332 1333 1334 1335 1336
}
EXPORT_SYMBOL(security_inet_conn_request);

void security_inet_csk_clone(struct sock *newsk,
			const struct request_sock *req)
{
1337
	call_void_hook(inet_csk_clone, newsk, req);
1338 1339 1340 1341 1342
}

void security_inet_conn_established(struct sock *sk,
			struct sk_buff *skb)
{
1343
	call_void_hook(inet_conn_established, sk, skb);
1344 1345
}

1346 1347
int security_secmark_relabel_packet(u32 secid)
{
1348
	return call_int_hook(secmark_relabel_packet, 0, secid);
1349 1350 1351 1352 1353
}
EXPORT_SYMBOL(security_secmark_relabel_packet);

void security_secmark_refcount_inc(void)
{
1354
	call_void_hook(secmark_refcount_inc);
1355 1356 1357 1358 1359
}
EXPORT_SYMBOL(security_secmark_refcount_inc);

void security_secmark_refcount_dec(void)
{
1360
	call_void_hook(secmark_refcount_dec);
1361 1362 1363
}
EXPORT_SYMBOL(security_secmark_refcount_dec);

1364 1365
int security_tun_dev_alloc_security(void **security)
{
1366
	return call_int_hook(tun_dev_alloc_security, 0, security);
1367 1368 1369 1370 1371
}
EXPORT_SYMBOL(security_tun_dev_alloc_security);

void security_tun_dev_free_security(void *security)
{
1372
	call_void_hook(tun_dev_free_security, security);
1373 1374 1375
}
EXPORT_SYMBOL(security_tun_dev_free_security);

P
Paul Moore 已提交
1376 1377
int security_tun_dev_create(void)
{
1378
	return call_int_hook(tun_dev_create, 0);
P
Paul Moore 已提交
1379 1380 1381
}
EXPORT_SYMBOL(security_tun_dev_create);

1382
int security_tun_dev_attach_queue(void *security)
P
Paul Moore 已提交
1383
{
1384
	return call_int_hook(tun_dev_attach_queue, 0, security);
P
Paul Moore 已提交
1385
}
1386
EXPORT_SYMBOL(security_tun_dev_attach_queue);
P
Paul Moore 已提交
1387

1388
int security_tun_dev_attach(struct sock *sk, void *security)
P
Paul Moore 已提交
1389
{
1390
	return call_int_hook(tun_dev_attach, 0, sk, security);
P
Paul Moore 已提交
1391 1392 1393
}
EXPORT_SYMBOL(security_tun_dev_attach);

1394 1395
int security_tun_dev_open(void *security)
{
1396
	return call_int_hook(tun_dev_open, 0, security);
1397 1398 1399
}
EXPORT_SYMBOL(security_tun_dev_open);

1400 1401 1402 1403
#endif	/* CONFIG_SECURITY_NETWORK */

#ifdef CONFIG_SECURITY_NETWORK_XFRM

1404 1405 1406
int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
			       struct xfrm_user_sec_ctx *sec_ctx,
			       gfp_t gfp)
1407
{
1408
	return call_int_hook(xfrm_policy_alloc_security, 0, ctxp, sec_ctx, gfp);
1409 1410 1411
}
EXPORT_SYMBOL(security_xfrm_policy_alloc);

1412 1413
int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,
			      struct xfrm_sec_ctx **new_ctxp)
1414
{
1415
	return call_int_hook(xfrm_policy_clone_security, 0, old_ctx, new_ctxp);
1416 1417
}

1418
void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx)
1419
{
1420
	call_void_hook(xfrm_policy_free_security, ctx);
1421 1422 1423
}
EXPORT_SYMBOL(security_xfrm_policy_free);

1424
int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
1425
{
1426
	return call_int_hook(xfrm_policy_delete_security, 0, ctx);
1427 1428
}

1429 1430
int security_xfrm_state_alloc(struct xfrm_state *x,
			      struct xfrm_user_sec_ctx *sec_ctx)
1431
{
1432
	return call_int_hook(xfrm_state_alloc, 0, x, sec_ctx);
1433 1434 1435 1436 1437 1438
}
EXPORT_SYMBOL(security_xfrm_state_alloc);

int security_xfrm_state_alloc_acquire(struct xfrm_state *x,
				      struct xfrm_sec_ctx *polsec, u32 secid)
{
1439
	return call_int_hook(xfrm_state_alloc_acquire, 0, x, polsec, secid);
1440 1441 1442 1443
}

int security_xfrm_state_delete(struct xfrm_state *x)
{
1444
	return call_int_hook(xfrm_state_delete_security, 0, x);
1445 1446 1447 1448 1449
}
EXPORT_SYMBOL(security_xfrm_state_delete);

void security_xfrm_state_free(struct xfrm_state *x)
{
1450
	call_void_hook(xfrm_state_free_security, x);
1451 1452
}

1453
int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
1454
{
1455
	return call_int_hook(xfrm_policy_lookup, 0, ctx, fl_secid, dir);
1456 1457 1458
}

int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
1459 1460
				       struct xfrm_policy *xp,
				       const struct flowi *fl)
1461
{
C
Casey Schaufler 已提交
1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479
	struct security_hook_list *hp;
	int rc = 1;

	/*
	 * Since this function is expected to return 0 or 1, the judgment
	 * becomes difficult if multiple LSMs supply this call. Fortunately,
	 * we can use the first LSM's judgment because currently only SELinux
	 * supplies this call.
	 *
	 * For speed optimization, we explicitly break the loop rather than
	 * using the macro
	 */
	list_for_each_entry(hp, &security_hook_heads.xfrm_state_pol_flow_match,
				list) {
		rc = hp->hook.xfrm_state_pol_flow_match(x, xp, fl);
		break;
	}
	return rc;
1480 1481 1482 1483
}

int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid)
{
1484
	return call_int_hook(xfrm_decode_session, 0, skb, secid, 1);
1485 1486 1487 1488
}

void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl)
{
1489 1490
	int rc = call_int_hook(xfrm_decode_session, 0, skb, &fl->flowi_secid,
				0);
1491 1492 1493 1494 1495 1496 1497 1498 1499

	BUG_ON(rc);
}
EXPORT_SYMBOL(security_skb_classify_flow);

#endif	/* CONFIG_SECURITY_NETWORK_XFRM */

#ifdef CONFIG_KEYS

D
David Howells 已提交
1500 1501
int security_key_alloc(struct key *key, const struct cred *cred,
		       unsigned long flags)
1502
{
1503
	return call_int_hook(key_alloc, 0, key, cred, flags);
1504 1505 1506 1507
}

void security_key_free(struct key *key)
{
1508
	call_void_hook(key_free, key);
1509 1510 1511
}

int security_key_permission(key_ref_t key_ref,
1512
			    const struct cred *cred, unsigned perm)
1513
{
1514
	return call_int_hook(key_permission, 0, key_ref, cred, perm);
1515 1516
}

1517 1518
int security_key_getsecurity(struct key *key, char **_buffer)
{
C
Casey Schaufler 已提交
1519
	*_buffer = NULL;
1520
	return call_int_hook(key_getsecurity, 0, key, _buffer);
1521 1522
}

1523
#endif	/* CONFIG_KEYS */
1524 1525 1526 1527 1528

#ifdef CONFIG_AUDIT

int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule)
{
1529
	return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule);
1530 1531 1532 1533
}

int security_audit_rule_known(struct audit_krule *krule)
{
1534
	return call_int_hook(audit_rule_known, 0, krule);
1535 1536 1537 1538
}

void security_audit_rule_free(void *lsmrule)
{
1539
	call_void_hook(audit_rule_free, lsmrule);
1540 1541 1542 1543 1544
}

int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule,
			      struct audit_context *actx)
{
1545 1546
	return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule,
				actx);
1547
}
C
Casey Schaufler 已提交
1548
#endif /* CONFIG_AUDIT */
1549

C
Casey Schaufler 已提交
1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698
struct security_hook_heads security_hook_heads = {
	.binder_set_context_mgr =
		LIST_HEAD_INIT(security_hook_heads.binder_set_context_mgr),
	.binder_transaction =
		LIST_HEAD_INIT(security_hook_heads.binder_transaction),
	.binder_transfer_binder =
		LIST_HEAD_INIT(security_hook_heads.binder_transfer_binder),
	.binder_transfer_file =
		LIST_HEAD_INIT(security_hook_heads.binder_transfer_file),

	.ptrace_access_check =
		LIST_HEAD_INIT(security_hook_heads.ptrace_access_check),
	.ptrace_traceme =
		LIST_HEAD_INIT(security_hook_heads.ptrace_traceme),
	.capget =	LIST_HEAD_INIT(security_hook_heads.capget),
	.capset =	LIST_HEAD_INIT(security_hook_heads.capset),
	.capable =	LIST_HEAD_INIT(security_hook_heads.capable),
	.quotactl =	LIST_HEAD_INIT(security_hook_heads.quotactl),
	.quota_on =	LIST_HEAD_INIT(security_hook_heads.quota_on),
	.syslog =	LIST_HEAD_INIT(security_hook_heads.syslog),
	.settime =	LIST_HEAD_INIT(security_hook_heads.settime),
	.vm_enough_memory =
		LIST_HEAD_INIT(security_hook_heads.vm_enough_memory),
	.bprm_set_creds =
		LIST_HEAD_INIT(security_hook_heads.bprm_set_creds),
	.bprm_check_security =
		LIST_HEAD_INIT(security_hook_heads.bprm_check_security),
	.bprm_secureexec =
		LIST_HEAD_INIT(security_hook_heads.bprm_secureexec),
	.bprm_committing_creds =
		LIST_HEAD_INIT(security_hook_heads.bprm_committing_creds),
	.bprm_committed_creds =
		LIST_HEAD_INIT(security_hook_heads.bprm_committed_creds),
	.sb_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.sb_alloc_security),
	.sb_free_security =
		LIST_HEAD_INIT(security_hook_heads.sb_free_security),
	.sb_copy_data =	LIST_HEAD_INIT(security_hook_heads.sb_copy_data),
	.sb_remount =	LIST_HEAD_INIT(security_hook_heads.sb_remount),
	.sb_kern_mount =
		LIST_HEAD_INIT(security_hook_heads.sb_kern_mount),
	.sb_show_options =
		LIST_HEAD_INIT(security_hook_heads.sb_show_options),
	.sb_statfs =	LIST_HEAD_INIT(security_hook_heads.sb_statfs),
	.sb_mount =	LIST_HEAD_INIT(security_hook_heads.sb_mount),
	.sb_umount =	LIST_HEAD_INIT(security_hook_heads.sb_umount),
	.sb_pivotroot =	LIST_HEAD_INIT(security_hook_heads.sb_pivotroot),
	.sb_set_mnt_opts =
		LIST_HEAD_INIT(security_hook_heads.sb_set_mnt_opts),
	.sb_clone_mnt_opts =
		LIST_HEAD_INIT(security_hook_heads.sb_clone_mnt_opts),
	.sb_parse_opts_str =
		LIST_HEAD_INIT(security_hook_heads.sb_parse_opts_str),
	.dentry_init_security =
		LIST_HEAD_INIT(security_hook_heads.dentry_init_security),
#ifdef CONFIG_SECURITY_PATH
	.path_unlink =	LIST_HEAD_INIT(security_hook_heads.path_unlink),
	.path_mkdir =	LIST_HEAD_INIT(security_hook_heads.path_mkdir),
	.path_rmdir =	LIST_HEAD_INIT(security_hook_heads.path_rmdir),
	.path_mknod =	LIST_HEAD_INIT(security_hook_heads.path_mknod),
	.path_truncate =
		LIST_HEAD_INIT(security_hook_heads.path_truncate),
	.path_symlink =	LIST_HEAD_INIT(security_hook_heads.path_symlink),
	.path_link =	LIST_HEAD_INIT(security_hook_heads.path_link),
	.path_rename =	LIST_HEAD_INIT(security_hook_heads.path_rename),
	.path_chmod =	LIST_HEAD_INIT(security_hook_heads.path_chmod),
	.path_chown =	LIST_HEAD_INIT(security_hook_heads.path_chown),
	.path_chroot =	LIST_HEAD_INIT(security_hook_heads.path_chroot),
#endif
	.inode_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.inode_alloc_security),
	.inode_free_security =
		LIST_HEAD_INIT(security_hook_heads.inode_free_security),
	.inode_init_security =
		LIST_HEAD_INIT(security_hook_heads.inode_init_security),
	.inode_create =	LIST_HEAD_INIT(security_hook_heads.inode_create),
	.inode_link =	LIST_HEAD_INIT(security_hook_heads.inode_link),
	.inode_unlink =	LIST_HEAD_INIT(security_hook_heads.inode_unlink),
	.inode_symlink =
		LIST_HEAD_INIT(security_hook_heads.inode_symlink),
	.inode_mkdir =	LIST_HEAD_INIT(security_hook_heads.inode_mkdir),
	.inode_rmdir =	LIST_HEAD_INIT(security_hook_heads.inode_rmdir),
	.inode_mknod =	LIST_HEAD_INIT(security_hook_heads.inode_mknod),
	.inode_rename =	LIST_HEAD_INIT(security_hook_heads.inode_rename),
	.inode_readlink =
		LIST_HEAD_INIT(security_hook_heads.inode_readlink),
	.inode_follow_link =
		LIST_HEAD_INIT(security_hook_heads.inode_follow_link),
	.inode_permission =
		LIST_HEAD_INIT(security_hook_heads.inode_permission),
	.inode_setattr =
		LIST_HEAD_INIT(security_hook_heads.inode_setattr),
	.inode_getattr =
		LIST_HEAD_INIT(security_hook_heads.inode_getattr),
	.inode_setxattr =
		LIST_HEAD_INIT(security_hook_heads.inode_setxattr),
	.inode_post_setxattr =
		LIST_HEAD_INIT(security_hook_heads.inode_post_setxattr),
	.inode_getxattr =
		LIST_HEAD_INIT(security_hook_heads.inode_getxattr),
	.inode_listxattr =
		LIST_HEAD_INIT(security_hook_heads.inode_listxattr),
	.inode_removexattr =
		LIST_HEAD_INIT(security_hook_heads.inode_removexattr),
	.inode_need_killpriv =
		LIST_HEAD_INIT(security_hook_heads.inode_need_killpriv),
	.inode_killpriv =
		LIST_HEAD_INIT(security_hook_heads.inode_killpriv),
	.inode_getsecurity =
		LIST_HEAD_INIT(security_hook_heads.inode_getsecurity),
	.inode_setsecurity =
		LIST_HEAD_INIT(security_hook_heads.inode_setsecurity),
	.inode_listsecurity =
		LIST_HEAD_INIT(security_hook_heads.inode_listsecurity),
	.inode_getsecid =
		LIST_HEAD_INIT(security_hook_heads.inode_getsecid),
	.file_permission =
		LIST_HEAD_INIT(security_hook_heads.file_permission),
	.file_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.file_alloc_security),
	.file_free_security =
		LIST_HEAD_INIT(security_hook_heads.file_free_security),
	.file_ioctl =	LIST_HEAD_INIT(security_hook_heads.file_ioctl),
	.mmap_addr =	LIST_HEAD_INIT(security_hook_heads.mmap_addr),
	.mmap_file =	LIST_HEAD_INIT(security_hook_heads.mmap_file),
	.file_mprotect =
		LIST_HEAD_INIT(security_hook_heads.file_mprotect),
	.file_lock =	LIST_HEAD_INIT(security_hook_heads.file_lock),
	.file_fcntl =	LIST_HEAD_INIT(security_hook_heads.file_fcntl),
	.file_set_fowner =
		LIST_HEAD_INIT(security_hook_heads.file_set_fowner),
	.file_send_sigiotask =
		LIST_HEAD_INIT(security_hook_heads.file_send_sigiotask),
	.file_receive =	LIST_HEAD_INIT(security_hook_heads.file_receive),
	.file_open =	LIST_HEAD_INIT(security_hook_heads.file_open),
	.task_create =	LIST_HEAD_INIT(security_hook_heads.task_create),
	.task_free =	LIST_HEAD_INIT(security_hook_heads.task_free),
	.cred_alloc_blank =
		LIST_HEAD_INIT(security_hook_heads.cred_alloc_blank),
	.cred_free =	LIST_HEAD_INIT(security_hook_heads.cred_free),
	.cred_prepare =	LIST_HEAD_INIT(security_hook_heads.cred_prepare),
	.cred_transfer =
		LIST_HEAD_INIT(security_hook_heads.cred_transfer),
	.kernel_act_as =
		LIST_HEAD_INIT(security_hook_heads.kernel_act_as),
	.kernel_create_files_as =
		LIST_HEAD_INIT(security_hook_heads.kernel_create_files_as),
	.kernel_module_request =
		LIST_HEAD_INIT(security_hook_heads.kernel_module_request),
1699 1700
	.kernel_read_file =
		LIST_HEAD_INIT(security_hook_heads.kernel_read_file),
1701 1702
	.kernel_post_read_file =
		LIST_HEAD_INIT(security_hook_heads.kernel_post_read_file),
C
Casey Schaufler 已提交
1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774
	.task_fix_setuid =
		LIST_HEAD_INIT(security_hook_heads.task_fix_setuid),
	.task_setpgid =	LIST_HEAD_INIT(security_hook_heads.task_setpgid),
	.task_getpgid =	LIST_HEAD_INIT(security_hook_heads.task_getpgid),
	.task_getsid =	LIST_HEAD_INIT(security_hook_heads.task_getsid),
	.task_getsecid =
		LIST_HEAD_INIT(security_hook_heads.task_getsecid),
	.task_setnice =	LIST_HEAD_INIT(security_hook_heads.task_setnice),
	.task_setioprio =
		LIST_HEAD_INIT(security_hook_heads.task_setioprio),
	.task_getioprio =
		LIST_HEAD_INIT(security_hook_heads.task_getioprio),
	.task_setrlimit =
		LIST_HEAD_INIT(security_hook_heads.task_setrlimit),
	.task_setscheduler =
		LIST_HEAD_INIT(security_hook_heads.task_setscheduler),
	.task_getscheduler =
		LIST_HEAD_INIT(security_hook_heads.task_getscheduler),
	.task_movememory =
		LIST_HEAD_INIT(security_hook_heads.task_movememory),
	.task_kill =	LIST_HEAD_INIT(security_hook_heads.task_kill),
	.task_wait =	LIST_HEAD_INIT(security_hook_heads.task_wait),
	.task_prctl =	LIST_HEAD_INIT(security_hook_heads.task_prctl),
	.task_to_inode =
		LIST_HEAD_INIT(security_hook_heads.task_to_inode),
	.ipc_permission =
		LIST_HEAD_INIT(security_hook_heads.ipc_permission),
	.ipc_getsecid =	LIST_HEAD_INIT(security_hook_heads.ipc_getsecid),
	.msg_msg_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.msg_msg_alloc_security),
	.msg_msg_free_security =
		LIST_HEAD_INIT(security_hook_heads.msg_msg_free_security),
	.msg_queue_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_alloc_security),
	.msg_queue_free_security =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_free_security),
	.msg_queue_associate =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_associate),
	.msg_queue_msgctl =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_msgctl),
	.msg_queue_msgsnd =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_msgsnd),
	.msg_queue_msgrcv =
		LIST_HEAD_INIT(security_hook_heads.msg_queue_msgrcv),
	.shm_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.shm_alloc_security),
	.shm_free_security =
		LIST_HEAD_INIT(security_hook_heads.shm_free_security),
	.shm_associate =
		LIST_HEAD_INIT(security_hook_heads.shm_associate),
	.shm_shmctl =	LIST_HEAD_INIT(security_hook_heads.shm_shmctl),
	.shm_shmat =	LIST_HEAD_INIT(security_hook_heads.shm_shmat),
	.sem_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.sem_alloc_security),
	.sem_free_security =
		LIST_HEAD_INIT(security_hook_heads.sem_free_security),
	.sem_associate =
		LIST_HEAD_INIT(security_hook_heads.sem_associate),
	.sem_semctl =	LIST_HEAD_INIT(security_hook_heads.sem_semctl),
	.sem_semop =	LIST_HEAD_INIT(security_hook_heads.sem_semop),
	.netlink_send =	LIST_HEAD_INIT(security_hook_heads.netlink_send),
	.d_instantiate =
		LIST_HEAD_INIT(security_hook_heads.d_instantiate),
	.getprocattr =	LIST_HEAD_INIT(security_hook_heads.getprocattr),
	.setprocattr =	LIST_HEAD_INIT(security_hook_heads.setprocattr),
	.ismaclabel =	LIST_HEAD_INIT(security_hook_heads.ismaclabel),
	.secid_to_secctx =
		LIST_HEAD_INIT(security_hook_heads.secid_to_secctx),
	.secctx_to_secid =
		LIST_HEAD_INIT(security_hook_heads.secctx_to_secid),
	.release_secctx =
		LIST_HEAD_INIT(security_hook_heads.release_secctx),
1775 1776
	.inode_invalidate_secctx =
		LIST_HEAD_INIT(security_hook_heads.inode_invalidate_secctx),
C
Casey Schaufler 已提交
1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893
	.inode_notifysecctx =
		LIST_HEAD_INIT(security_hook_heads.inode_notifysecctx),
	.inode_setsecctx =
		LIST_HEAD_INIT(security_hook_heads.inode_setsecctx),
	.inode_getsecctx =
		LIST_HEAD_INIT(security_hook_heads.inode_getsecctx),
#ifdef CONFIG_SECURITY_NETWORK
	.unix_stream_connect =
		LIST_HEAD_INIT(security_hook_heads.unix_stream_connect),
	.unix_may_send =
		LIST_HEAD_INIT(security_hook_heads.unix_may_send),
	.socket_create =
		LIST_HEAD_INIT(security_hook_heads.socket_create),
	.socket_post_create =
		LIST_HEAD_INIT(security_hook_heads.socket_post_create),
	.socket_bind =	LIST_HEAD_INIT(security_hook_heads.socket_bind),
	.socket_connect =
		LIST_HEAD_INIT(security_hook_heads.socket_connect),
	.socket_listen =
		LIST_HEAD_INIT(security_hook_heads.socket_listen),
	.socket_accept =
		LIST_HEAD_INIT(security_hook_heads.socket_accept),
	.socket_sendmsg =
		LIST_HEAD_INIT(security_hook_heads.socket_sendmsg),
	.socket_recvmsg =
		LIST_HEAD_INIT(security_hook_heads.socket_recvmsg),
	.socket_getsockname =
		LIST_HEAD_INIT(security_hook_heads.socket_getsockname),
	.socket_getpeername =
		LIST_HEAD_INIT(security_hook_heads.socket_getpeername),
	.socket_getsockopt =
		LIST_HEAD_INIT(security_hook_heads.socket_getsockopt),
	.socket_setsockopt =
		LIST_HEAD_INIT(security_hook_heads.socket_setsockopt),
	.socket_shutdown =
		LIST_HEAD_INIT(security_hook_heads.socket_shutdown),
	.socket_sock_rcv_skb =
		LIST_HEAD_INIT(security_hook_heads.socket_sock_rcv_skb),
	.socket_getpeersec_stream =
		LIST_HEAD_INIT(security_hook_heads.socket_getpeersec_stream),
	.socket_getpeersec_dgram =
		LIST_HEAD_INIT(security_hook_heads.socket_getpeersec_dgram),
	.sk_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.sk_alloc_security),
	.sk_free_security =
		LIST_HEAD_INIT(security_hook_heads.sk_free_security),
	.sk_clone_security =
		LIST_HEAD_INIT(security_hook_heads.sk_clone_security),
	.sk_getsecid =	LIST_HEAD_INIT(security_hook_heads.sk_getsecid),
	.sock_graft =	LIST_HEAD_INIT(security_hook_heads.sock_graft),
	.inet_conn_request =
		LIST_HEAD_INIT(security_hook_heads.inet_conn_request),
	.inet_csk_clone =
		LIST_HEAD_INIT(security_hook_heads.inet_csk_clone),
	.inet_conn_established =
		LIST_HEAD_INIT(security_hook_heads.inet_conn_established),
	.secmark_relabel_packet =
		LIST_HEAD_INIT(security_hook_heads.secmark_relabel_packet),
	.secmark_refcount_inc =
		LIST_HEAD_INIT(security_hook_heads.secmark_refcount_inc),
	.secmark_refcount_dec =
		LIST_HEAD_INIT(security_hook_heads.secmark_refcount_dec),
	.req_classify_flow =
		LIST_HEAD_INIT(security_hook_heads.req_classify_flow),
	.tun_dev_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.tun_dev_alloc_security),
	.tun_dev_free_security =
		LIST_HEAD_INIT(security_hook_heads.tun_dev_free_security),
	.tun_dev_create =
		LIST_HEAD_INIT(security_hook_heads.tun_dev_create),
	.tun_dev_attach_queue =
		LIST_HEAD_INIT(security_hook_heads.tun_dev_attach_queue),
	.tun_dev_attach =
		LIST_HEAD_INIT(security_hook_heads.tun_dev_attach),
	.tun_dev_open =	LIST_HEAD_INIT(security_hook_heads.tun_dev_open),
#endif	/* CONFIG_SECURITY_NETWORK */
#ifdef CONFIG_SECURITY_NETWORK_XFRM
	.xfrm_policy_alloc_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_policy_alloc_security),
	.xfrm_policy_clone_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_policy_clone_security),
	.xfrm_policy_free_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_policy_free_security),
	.xfrm_policy_delete_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_policy_delete_security),
	.xfrm_state_alloc =
		LIST_HEAD_INIT(security_hook_heads.xfrm_state_alloc),
	.xfrm_state_alloc_acquire =
		LIST_HEAD_INIT(security_hook_heads.xfrm_state_alloc_acquire),
	.xfrm_state_free_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_state_free_security),
	.xfrm_state_delete_security =
		LIST_HEAD_INIT(security_hook_heads.xfrm_state_delete_security),
	.xfrm_policy_lookup =
		LIST_HEAD_INIT(security_hook_heads.xfrm_policy_lookup),
	.xfrm_state_pol_flow_match =
		LIST_HEAD_INIT(security_hook_heads.xfrm_state_pol_flow_match),
	.xfrm_decode_session =
		LIST_HEAD_INIT(security_hook_heads.xfrm_decode_session),
#endif	/* CONFIG_SECURITY_NETWORK_XFRM */
#ifdef CONFIG_KEYS
	.key_alloc =	LIST_HEAD_INIT(security_hook_heads.key_alloc),
	.key_free =	LIST_HEAD_INIT(security_hook_heads.key_free),
	.key_permission =
		LIST_HEAD_INIT(security_hook_heads.key_permission),
	.key_getsecurity =
		LIST_HEAD_INIT(security_hook_heads.key_getsecurity),
#endif	/* CONFIG_KEYS */
#ifdef CONFIG_AUDIT
	.audit_rule_init =
		LIST_HEAD_INIT(security_hook_heads.audit_rule_init),
	.audit_rule_known =
		LIST_HEAD_INIT(security_hook_heads.audit_rule_known),
	.audit_rule_match =
		LIST_HEAD_INIT(security_hook_heads.audit_rule_match),
	.audit_rule_free =
		LIST_HEAD_INIT(security_hook_heads.audit_rule_free),
1894
#endif /* CONFIG_AUDIT */
C
Casey Schaufler 已提交
1895
};