security.c 52.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/*
 * 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>
7
 * Copyright (C) 2016 Mellanox Technologies
L
Linus Torvalds 已提交
8 9 10 11 12 13 14
 *
 *	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.
 */

15 16
#define pr_fmt(fmt) "LSM: " fmt

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

35
#define MAX_LSM_EVM_XATTR	2
L
Linus Torvalds 已提交
36

37 38 39
/* How many LSMs were built into the kernel? */
#define LSM_COUNT (__end_lsm_info - __start_lsm_info)

40
struct security_hook_heads security_hook_heads __lsm_ro_after_init;
41 42
static ATOMIC_NOTIFIER_HEAD(lsm_notifier_chain);

43 44
static struct kmem_cache *lsm_file_cache;

45
char *lsm_names;
46 47
static struct lsm_blob_sizes blob_sizes __lsm_ro_after_init;

48
/* Boot-time LSM user choice */
49
static __initdata const char *chosen_lsm_order;
50
static __initdata const char *chosen_major_lsm;
L
Linus Torvalds 已提交
51

K
Kees Cook 已提交
52 53
static __initconst const char * const builtin_lsm_order = CONFIG_LSM;

54 55
/* Ordered list of LSMs to initialize. */
static __initdata struct lsm_info **ordered_lsms;
56
static __initdata struct lsm_info *exclusive;
57

58 59 60 61 62 63 64
static __initdata bool debug;
#define init_debug(...)						\
	do {							\
		if (debug)					\
			pr_info(__VA_ARGS__);			\
	} while (0)

65 66
static bool __init is_enabled(struct lsm_info *lsm)
{
67 68
	if (!lsm->enabled)
		return false;
69

70
	return *lsm->enabled;
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
}

/* Mark an LSM's enabled flag. */
static int lsm_enabled_true __initdata = 1;
static int lsm_enabled_false __initdata = 0;
static void __init set_enabled(struct lsm_info *lsm, bool enabled)
{
	/*
	 * When an LSM hasn't configured an enable variable, we can use
	 * a hard-coded location for storing the default enabled state.
	 */
	if (!lsm->enabled) {
		if (enabled)
			lsm->enabled = &lsm_enabled_true;
		else
			lsm->enabled = &lsm_enabled_false;
	} else if (lsm->enabled == &lsm_enabled_true) {
		if (!enabled)
			lsm->enabled = &lsm_enabled_false;
	} else if (lsm->enabled == &lsm_enabled_false) {
		if (enabled)
			lsm->enabled = &lsm_enabled_true;
	} else {
		*lsm->enabled = enabled;
	}
}

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
/* Is an LSM already listed in the ordered LSMs list? */
static bool __init exists_ordered_lsm(struct lsm_info *lsm)
{
	struct lsm_info **check;

	for (check = ordered_lsms; *check; check++)
		if (*check == lsm)
			return true;

	return false;
}

/* Append an LSM to the list of ordered LSMs to initialize. */
static int last_lsm __initdata;
static void __init append_ordered_lsm(struct lsm_info *lsm, const char *from)
{
	/* Ignore duplicate selections. */
	if (exists_ordered_lsm(lsm))
		return;

	if (WARN(last_lsm == LSM_COUNT, "%s: out of LSM slots!?\n", from))
		return;

121 122 123
	/* Enable this LSM, if it is not already set. */
	if (!lsm->enabled)
		lsm->enabled = &lsm_enabled_true;
124
	ordered_lsms[last_lsm++] = lsm;
125

126 127 128 129
	init_debug("%s ordering: %s (%sabled)\n", from, lsm->name,
		   is_enabled(lsm) ? "en" : "dis");
}

130 131 132 133 134 135 136
/* Is an LSM allowed to be initialized? */
static bool __init lsm_allowed(struct lsm_info *lsm)
{
	/* Skip if the LSM is disabled. */
	if (!is_enabled(lsm))
		return false;

137 138 139 140 141 142
	/* Not allowed if another exclusive LSM already initialized. */
	if ((lsm->flags & LSM_FLAG_EXCLUSIVE) && exclusive) {
		init_debug("exclusive disabled: %s\n", lsm->name);
		return false;
	}

143 144 145
	return true;
}

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
static void __init lsm_set_blob_size(int *need, int *lbs)
{
	int offset;

	if (*need > 0) {
		offset = *lbs;
		*lbs += *need;
		*need = offset;
	}
}

static void __init lsm_set_blob_sizes(struct lsm_blob_sizes *needed)
{
	if (!needed)
		return;

	lsm_set_blob_size(&needed->lbs_cred, &blob_sizes.lbs_cred);
163
	lsm_set_blob_size(&needed->lbs_file, &blob_sizes.lbs_file);
164 165
}

166 167
/* Prepare LSM for initialization. */
static void __init prepare_lsm(struct lsm_info *lsm)
168 169 170 171 172 173
{
	int enabled = lsm_allowed(lsm);

	/* Record enablement (to handle any following exclusive LSMs). */
	set_enabled(lsm, enabled);

174
	/* If enabled, do pre-initialization work. */
175
	if (enabled) {
176 177 178 179
		if ((lsm->flags & LSM_FLAG_EXCLUSIVE) && !exclusive) {
			exclusive = lsm;
			init_debug("exclusive chosen: %s\n", lsm->name);
		}
180 181

		lsm_set_blob_sizes(lsm->blobs);
182 183 184 185 186 187 188 189
	}
}

/* Initialize a given LSM, if it is enabled. */
static void __init initialize_lsm(struct lsm_info *lsm)
{
	if (is_enabled(lsm)) {
		int ret;
190

191 192 193 194 195 196
		init_debug("initializing %s\n", lsm->name);
		ret = lsm->init();
		WARN(ret, "%s failed to initialize: %d\n", lsm->name, ret);
	}
}

K
Kees Cook 已提交
197
/* Populate ordered LSMs list from comma-separated LSM name list. */
198
static void __init ordered_lsm_parse(const char *order, const char *origin)
199 200
{
	struct lsm_info *lsm;
K
Kees Cook 已提交
201 202
	char *sep, *name, *next;

K
Kees Cook 已提交
203 204 205 206 207 208
	/* LSM_ORDER_FIRST is always first. */
	for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
		if (lsm->order == LSM_ORDER_FIRST)
			append_ordered_lsm(lsm, "first");
	}

209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
	/* Process "security=", if given. */
	if (chosen_major_lsm) {
		struct lsm_info *major;

		/*
		 * To match the original "security=" behavior, this
		 * explicitly does NOT fallback to another Legacy Major
		 * if the selected one was separately disabled: disable
		 * all non-matching Legacy Major LSMs.
		 */
		for (major = __start_lsm_info; major < __end_lsm_info;
		     major++) {
			if ((major->flags & LSM_FLAG_LEGACY_MAJOR) &&
			    strcmp(major->name, chosen_major_lsm) != 0) {
				set_enabled(major, false);
				init_debug("security=%s disabled: %s\n",
					   chosen_major_lsm, major->name);
			}
		}
	}
229

K
Kees Cook 已提交
230 231 232 233 234 235 236
	sep = kstrdup(order, GFP_KERNEL);
	next = sep;
	/* Walk the list, looking for matching LSMs. */
	while ((name = strsep(&next, ",")) != NULL) {
		bool found = false;

		for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
K
Kees Cook 已提交
237 238
			if (lsm->order == LSM_ORDER_MUTABLE &&
			    strcmp(lsm->name, name) == 0) {
K
Kees Cook 已提交
239 240 241 242 243 244 245
				append_ordered_lsm(lsm, origin);
				found = true;
			}
		}

		if (!found)
			init_debug("%s ignored: %s\n", origin, name);
246
	}
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265

	/* Process "security=", if given. */
	if (chosen_major_lsm) {
		for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
			if (exists_ordered_lsm(lsm))
				continue;
			if (strcmp(lsm->name, chosen_major_lsm) == 0)
				append_ordered_lsm(lsm, "security=");
		}
	}

	/* Disable all LSMs not in the ordered list. */
	for (lsm = __start_lsm_info; lsm < __end_lsm_info; lsm++) {
		if (exists_ordered_lsm(lsm))
			continue;
		set_enabled(lsm, false);
		init_debug("%s disabled: %s\n", origin, lsm->name);
	}

K
Kees Cook 已提交
266
	kfree(sep);
267 268
}

269 270 271 272 273 274 275
static void __init ordered_lsm_init(void)
{
	struct lsm_info **lsm;

	ordered_lsms = kcalloc(LSM_COUNT + 1, sizeof(*ordered_lsms),
				GFP_KERNEL);

276 277 278 279
	if (chosen_lsm_order)
		ordered_lsm_parse(chosen_lsm_order, "cmdline");
	else
		ordered_lsm_parse(builtin_lsm_order, "builtin");
280 281

	for (lsm = ordered_lsms; *lsm; lsm++)
282 283
		prepare_lsm(*lsm);

284
	init_debug("cred blob size     = %d\n", blob_sizes.lbs_cred);
285 286 287 288 289 290 291 292 293
	init_debug("file blob size     = %d\n", blob_sizes.lbs_file);

	/*
	 * Create any kmem_caches needed for blobs
	 */
	if (blob_sizes.lbs_file)
		lsm_file_cache = kmem_cache_create("lsm_file_cache",
						   blob_sizes.lbs_file, 0,
						   SLAB_PANIC, NULL);
294

295 296
	for (lsm = ordered_lsms; *lsm; lsm++)
		initialize_lsm(*lsm);
297 298 299 300

	kfree(ordered_lsms);
}

L
Linus Torvalds 已提交
301 302 303 304 305 306 307
/**
 * security_init - initializes the security framework
 *
 * This should be called early in the kernel initialization sequence.
 */
int __init security_init(void)
{
308
	int i;
309
	struct hlist_head *list = (struct hlist_head *) &security_hook_heads;
310

311 312
	pr_info("Security Framework initializing\n");

313
	for (i = 0; i < sizeof(security_hook_heads) / sizeof(struct hlist_head);
314
	     i++)
315
		INIT_HLIST_HEAD(&list[i]);
L
Linus Torvalds 已提交
316

317 318 319
	/* Load LSMs in specified order. */
	ordered_lsm_init();

L
Linus Torvalds 已提交
320 321 322
	return 0;
}

323
/* Save user chosen LSM */
324
static int __init choose_major_lsm(char *str)
325
{
326
	chosen_major_lsm = str;
327 328
	return 1;
}
329
__setup("security=", choose_major_lsm);
330

331 332 333 334 335 336 337 338
/* Explicitly choose LSM initialization order. */
static int __init choose_lsm_order(char *str)
{
	chosen_lsm_order = str;
	return 1;
}
__setup("lsm=", choose_lsm_order);

339 340 341 342 343 344 345 346
/* Enable LSM order debugging. */
static int __init enable_debug(char *str)
{
	debug = true;
	return 1;
}
__setup("lsm.debug", enable_debug);

347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
static bool match_last_lsm(const char *list, const char *lsm)
{
	const char *last;

	if (WARN_ON(!list || !lsm))
		return false;
	last = strrchr(list, ',');
	if (last)
		/* Pass the comma, strcmp() will check for '\0' */
		last++;
	else
		last = list;
	return !strcmp(last, lsm);
}

362 363 364 365 366 367
static int lsm_append(char *new, char **result)
{
	char *cp;

	if (*result == NULL) {
		*result = kstrdup(new, GFP_KERNEL);
368 369
		if (*result == NULL)
			return -ENOMEM;
370
	} else {
371 372 373
		/* Check if it is the last registered name */
		if (match_last_lsm(*result, new))
			return 0;
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
		cp = kasprintf(GFP_KERNEL, "%s,%s", *result, new);
		if (cp == NULL)
			return -ENOMEM;
		kfree(*result);
		*result = cp;
	}
	return 0;
}

/**
 * security_add_hooks - Add a modules hooks to the hook lists.
 * @hooks: the hooks to add
 * @count: the number of hooks to add
 * @lsm: the name of the security module
 *
 * Each LSM has to register its hooks with the infrastructure.
 */
void __init security_add_hooks(struct security_hook_list *hooks, int count,
				char *lsm)
{
	int i;

	for (i = 0; i < count; i++) {
		hooks[i].lsm = lsm;
398
		hlist_add_tail_rcu(&hooks[i].list, hooks[i].head);
399 400 401 402 403
	}
	if (lsm_append(lsm, &lsm_names) < 0)
		panic("%s - Cannot get early memory.\n", __func__);
}

404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
int call_lsm_notifier(enum lsm_event event, void *data)
{
	return atomic_notifier_call_chain(&lsm_notifier_chain, event, data);
}
EXPORT_SYMBOL(call_lsm_notifier);

int register_lsm_notifier(struct notifier_block *nb)
{
	return atomic_notifier_chain_register(&lsm_notifier_chain, nb);
}
EXPORT_SYMBOL(register_lsm_notifier);

int unregister_lsm_notifier(struct notifier_block *nb)
{
	return atomic_notifier_chain_unregister(&lsm_notifier_chain, nb);
}
EXPORT_SYMBOL(unregister_lsm_notifier);

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
/**
 * lsm_cred_alloc - allocate a composite cred blob
 * @cred: the cred that needs a blob
 * @gfp: allocation type
 *
 * Allocate the cred blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
static int lsm_cred_alloc(struct cred *cred, gfp_t gfp)
{
	if (blob_sizes.lbs_cred == 0) {
		cred->security = NULL;
		return 0;
	}

	cred->security = kzalloc(blob_sizes.lbs_cred, gfp);
	if (cred->security == NULL)
		return -ENOMEM;
	return 0;
}

/**
 * lsm_early_cred - during initialization allocate a composite cred blob
 * @cred: the cred that needs a blob
 *
 * Allocate the cred blob for all the modules if it's not already there
 */
void __init lsm_early_cred(struct cred *cred)
{
	int rc;

	if (cred == NULL)
		panic("%s: NULL cred.\n", __func__);
	if (cred->security != NULL)
		return;
	rc = lsm_cred_alloc(cred, GFP_KERNEL);
	if (rc)
		panic("%s: Early cred alloc failed.\n", __func__);
}

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
/**
 * lsm_file_alloc - allocate a composite file blob
 * @file: the file that needs a blob
 *
 * Allocate the file blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
static int lsm_file_alloc(struct file *file)
{
	if (!lsm_file_cache) {
		file->f_security = NULL;
		return 0;
	}

	file->f_security = kmem_cache_zalloc(lsm_file_cache, GFP_KERNEL);
	if (file->f_security == NULL)
		return -ENOMEM;
	return 0;
}

484
/*
C
Casey Schaufler 已提交
485
 * Hook list operation macros.
L
Linus Torvalds 已提交
486
 *
487 488
 * call_void_hook:
 *	This is a hook that does not return a value.
L
Linus Torvalds 已提交
489
 *
490 491
 * call_int_hook:
 *	This is a hook that returns a value.
L
Linus Torvalds 已提交
492 493
 */

C
Casey Schaufler 已提交
494 495 496 497
#define call_void_hook(FUNC, ...)				\
	do {							\
		struct security_hook_list *P;			\
								\
498
		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) \
C
Casey Schaufler 已提交
499 500 501 502 503 504 505 506
			P->hook.FUNC(__VA_ARGS__);		\
	} while (0)

#define call_int_hook(FUNC, IRC, ...) ({			\
	int RC = IRC;						\
	do {							\
		struct security_hook_list *P;			\
								\
507
		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) { \
C
Casey Schaufler 已提交
508 509 510 511 512 513 514
			RC = P->hook.FUNC(__VA_ARGS__);		\
			if (RC != 0)				\
				break;				\
		}						\
	} while (0);						\
	RC;							\
})
L
Linus Torvalds 已提交
515

516 517
/* Security operations */

518 519
int security_binder_set_context_mgr(struct task_struct *mgr)
{
520
	return call_int_hook(binder_set_context_mgr, 0, mgr);
521 522 523 524 525
}

int security_binder_transaction(struct task_struct *from,
				struct task_struct *to)
{
526
	return call_int_hook(binder_transaction, 0, from, to);
527 528 529 530 531
}

int security_binder_transfer_binder(struct task_struct *from,
				    struct task_struct *to)
{
532
	return call_int_hook(binder_transfer_binder, 0, from, to);
533 534 535 536 537
}

int security_binder_transfer_file(struct task_struct *from,
				  struct task_struct *to, struct file *file)
{
538
	return call_int_hook(binder_transfer_file, 0, from, to, file);
539 540
}

541
int security_ptrace_access_check(struct task_struct *child, unsigned int mode)
542
{
543
	return call_int_hook(ptrace_access_check, 0, child, mode);
544 545 546 547
}

int security_ptrace_traceme(struct task_struct *parent)
{
548
	return call_int_hook(ptrace_traceme, 0, parent);
549 550 551 552 553 554 555
}

int security_capget(struct task_struct *target,
		     kernel_cap_t *effective,
		     kernel_cap_t *inheritable,
		     kernel_cap_t *permitted)
{
556 557
	return call_int_hook(capget, 0, target,
				effective, inheritable, permitted);
558 559
}

D
David Howells 已提交
560 561 562 563
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)
564
{
565 566
	return call_int_hook(capset, 0, new, old,
				effective, inheritable, permitted);
567 568
}

569
int security_capable(const struct cred *cred, struct user_namespace *ns,
570
		     int cap)
571
{
572
	return call_int_hook(capable, 0, cred, ns, cap, SECURITY_CAP_AUDIT);
573 574
}

575 576
int security_capable_noaudit(const struct cred *cred, struct user_namespace *ns,
			     int cap)
577
{
578
	return call_int_hook(capable, 0, cred, ns, cap, SECURITY_CAP_NOAUDIT);
579 580 581 582
}

int security_quotactl(int cmds, int type, int id, struct super_block *sb)
{
583
	return call_int_hook(quotactl, 0, cmds, type, id, sb);
584 585 586 587
}

int security_quota_on(struct dentry *dentry)
{
588
	return call_int_hook(quota_on, 0, dentry);
589 590
}

591
int security_syslog(int type)
592
{
593
	return call_int_hook(syslog, 0, type);
594 595
}

596
int security_settime64(const struct timespec64 *ts, const struct timezone *tz)
597
{
598
	return call_int_hook(settime, 0, ts, tz);
599 600 601 602
}

int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
C
Casey Schaufler 已提交
603 604 605 606 607 608 609 610 611 612 613
	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.
	 */
614
	hlist_for_each_entry(hp, &security_hook_heads.vm_enough_memory, list) {
C
Casey Schaufler 已提交
615 616 617 618 619 620 621
		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);
622 623
}

624
int security_bprm_set_creds(struct linux_binprm *bprm)
625
{
626
	return call_int_hook(bprm_set_creds, 0, bprm);
627 628
}

629
int security_bprm_check(struct linux_binprm *bprm)
630
{
631 632
	int ret;

633
	ret = call_int_hook(bprm_check_security, 0, bprm);
634 635 636
	if (ret)
		return ret;
	return ima_bprm_check(bprm);
637 638
}

639
void security_bprm_committing_creds(struct linux_binprm *bprm)
640
{
641
	call_void_hook(bprm_committing_creds, bprm);
642 643
}

644
void security_bprm_committed_creds(struct linux_binprm *bprm)
645
{
646
	call_void_hook(bprm_committed_creds, bprm);
647 648 649 650
}

int security_sb_alloc(struct super_block *sb)
{
651
	return call_int_hook(sb_alloc_security, 0, sb);
652 653 654 655
}

void security_sb_free(struct super_block *sb)
{
656
	call_void_hook(sb_free_security, sb);
657 658
}

659
void security_free_mnt_opts(void **mnt_opts)
660
{
661 662 663 664
	if (!*mnt_opts)
		return;
	call_void_hook(sb_free_mnt_opts, *mnt_opts);
	*mnt_opts = NULL;
665
}
666
EXPORT_SYMBOL(security_free_mnt_opts);
667

668
int security_sb_eat_lsm_opts(char *options, void **mnt_opts)
669
{
670
	return call_int_hook(sb_eat_lsm_opts, 0, options, mnt_opts);
671
}
A
Al Viro 已提交
672
EXPORT_SYMBOL(security_sb_eat_lsm_opts);
673

674
int security_sb_remount(struct super_block *sb,
675
			void *mnt_opts)
676
{
677
	return call_int_hook(sb_remount, 0, sb, mnt_opts);
678
}
A
Al Viro 已提交
679
EXPORT_SYMBOL(security_sb_remount);
680

681
int security_sb_kern_mount(struct super_block *sb)
682
{
683
	return call_int_hook(sb_kern_mount, 0, sb);
684 685
}

686 687
int security_sb_show_options(struct seq_file *m, struct super_block *sb)
{
688
	return call_int_hook(sb_show_options, 0, m, sb);
689 690
}

691 692
int security_sb_statfs(struct dentry *dentry)
{
693
	return call_int_hook(sb_statfs, 0, dentry);
694 695
}

A
Al Viro 已提交
696
int security_sb_mount(const char *dev_name, const struct path *path,
A
Al Viro 已提交
697
                       const char *type, unsigned long flags, void *data)
698
{
699
	return call_int_hook(sb_mount, 0, dev_name, path, type, flags, data);
700 701 702 703
}

int security_sb_umount(struct vfsmount *mnt, int flags)
{
704
	return call_int_hook(sb_umount, 0, mnt, flags);
705 706
}

A
Al Viro 已提交
707
int security_sb_pivotroot(const struct path *old_path, const struct path *new_path)
708
{
709
	return call_int_hook(sb_pivotroot, 0, old_path, new_path);
710 711
}

712
int security_sb_set_mnt_opts(struct super_block *sb,
713
				void *mnt_opts,
714 715
				unsigned long kern_flags,
				unsigned long *set_kern_flags)
716
{
C
Casey Schaufler 已提交
717
	return call_int_hook(sb_set_mnt_opts,
718 719
				mnt_opts ? -EOPNOTSUPP : 0, sb,
				mnt_opts, kern_flags, set_kern_flags);
720
}
721
EXPORT_SYMBOL(security_sb_set_mnt_opts);
722

723
int security_sb_clone_mnt_opts(const struct super_block *oldsb,
724 725 726
				struct super_block *newsb,
				unsigned long kern_flags,
				unsigned long *set_kern_flags)
727
{
728 729
	return call_int_hook(sb_clone_mnt_opts, 0, oldsb, newsb,
				kern_flags, set_kern_flags);
730
}
731 732
EXPORT_SYMBOL(security_sb_clone_mnt_opts);

A
Al Viro 已提交
733 734
int security_add_mnt_opt(const char *option, const char *val, int len,
			 void **mnt_opts)
735
{
A
Al Viro 已提交
736 737
	return call_int_hook(sb_add_mnt_opt, -EINVAL,
					option, val, len, mnt_opts);
738
}
A
Al Viro 已提交
739
EXPORT_SYMBOL(security_add_mnt_opt);
740

741 742 743
int security_inode_alloc(struct inode *inode)
{
	inode->i_security = NULL;
744
	return call_int_hook(inode_alloc_security, 0, inode);
745 746 747 748
}

void security_inode_free(struct inode *inode)
{
749
	integrity_inode_free(inode);
750
	call_void_hook(inode_free_security, inode);
751 752
}

753
int security_dentry_init_security(struct dentry *dentry, int mode,
A
Al Viro 已提交
754
					const struct qstr *name, void **ctx,
755 756
					u32 *ctxlen)
{
C
Casey Schaufler 已提交
757 758
	return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
				name, ctx, ctxlen);
759 760 761
}
EXPORT_SYMBOL(security_dentry_init_security);

762 763 764 765 766 767 768 769 770
int security_dentry_create_files_as(struct dentry *dentry, int mode,
				    struct qstr *name,
				    const struct cred *old, struct cred *new)
{
	return call_int_hook(dentry_create_files_as, 0, dentry, mode,
				name, old, new);
}
EXPORT_SYMBOL(security_dentry_create_files_as);

771
int security_inode_init_security(struct inode *inode, struct inode *dir,
772 773
				 const struct qstr *qstr,
				 const initxattrs initxattrs, void *fs_data)
774
{
775 776
	struct xattr new_xattrs[MAX_LSM_EVM_XATTR + 1];
	struct xattr *lsm_xattr, *evm_xattr, *xattr;
777 778
	int ret;

779
	if (unlikely(IS_PRIVATE(inode)))
780
		return 0;
781 782

	if (!initxattrs)
783 784
		return call_int_hook(inode_init_security, -EOPNOTSUPP, inode,
				     dir, qstr, NULL, NULL, NULL);
785
	memset(new_xattrs, 0, sizeof(new_xattrs));
786
	lsm_xattr = new_xattrs;
C
Casey Schaufler 已提交
787
	ret = call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir, qstr,
788 789 790 791 792
						&lsm_xattr->name,
						&lsm_xattr->value,
						&lsm_xattr->value_len);
	if (ret)
		goto out;
793 794 795 796 797

	evm_xattr = lsm_xattr + 1;
	ret = evm_inode_init_security(inode, lsm_xattr, evm_xattr);
	if (ret)
		goto out;
798 799
	ret = initxattrs(inode, new_xattrs, fs_data);
out:
800
	for (xattr = new_xattrs; xattr->value != NULL; xattr++)
801
		kfree(xattr->value);
802 803 804 805 806
	return (ret == -EOPNOTSUPP) ? 0 : ret;
}
EXPORT_SYMBOL(security_inode_init_security);

int security_old_inode_init_security(struct inode *inode, struct inode *dir,
807
				     const struct qstr *qstr, const char **name,
808
				     void **value, size_t *len)
809 810
{
	if (unlikely(IS_PRIVATE(inode)))
811
		return -EOPNOTSUPP;
812 813
	return call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir,
			     qstr, name, value, len);
814
}
815
EXPORT_SYMBOL(security_old_inode_init_security);
816

817
#ifdef CONFIG_SECURITY_PATH
818
int security_path_mknod(const struct path *dir, struct dentry *dentry, umode_t mode,
819 820
			unsigned int dev)
{
821
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
822
		return 0;
823
	return call_int_hook(path_mknod, 0, dir, dentry, mode, dev);
824 825 826
}
EXPORT_SYMBOL(security_path_mknod);

827
int security_path_mkdir(const struct path *dir, struct dentry *dentry, umode_t mode)
828
{
829
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
830
		return 0;
831
	return call_int_hook(path_mkdir, 0, dir, dentry, mode);
832
}
833
EXPORT_SYMBOL(security_path_mkdir);
834

A
Al Viro 已提交
835
int security_path_rmdir(const struct path *dir, struct dentry *dentry)
836
{
837
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
838
		return 0;
839
	return call_int_hook(path_rmdir, 0, dir, dentry);
840 841
}

A
Al Viro 已提交
842
int security_path_unlink(const struct path *dir, struct dentry *dentry)
843
{
844
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
845
		return 0;
846
	return call_int_hook(path_unlink, 0, dir, dentry);
847
}
848
EXPORT_SYMBOL(security_path_unlink);
849

850
int security_path_symlink(const struct path *dir, struct dentry *dentry,
851 852
			  const char *old_name)
{
853
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
854
		return 0;
855
	return call_int_hook(path_symlink, 0, dir, dentry, old_name);
856 857
}

A
Al Viro 已提交
858
int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
859 860
		       struct dentry *new_dentry)
{
861
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
862
		return 0;
863
	return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
864 865
}

A
Al Viro 已提交
866 867
int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
			 const struct path *new_dir, struct dentry *new_dentry,
868
			 unsigned int flags)
869
{
870 871
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
		     (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
872
		return 0;
M
Miklos Szeredi 已提交
873 874

	if (flags & RENAME_EXCHANGE) {
875 876
		int err = call_int_hook(path_rename, 0, new_dir, new_dentry,
					old_dir, old_dentry);
M
Miklos Szeredi 已提交
877 878 879 880
		if (err)
			return err;
	}

881 882
	return call_int_hook(path_rename, 0, old_dir, old_dentry, new_dir,
				new_dentry);
883
}
884
EXPORT_SYMBOL(security_path_rename);
885

A
Al Viro 已提交
886
int security_path_truncate(const struct path *path)
887
{
888
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
889
		return 0;
890
	return call_int_hook(path_truncate, 0, path);
891
}
892

893
int security_path_chmod(const struct path *path, umode_t mode)
894
{
895
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
896
		return 0;
897
	return call_int_hook(path_chmod, 0, path, mode);
898 899
}

900
int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
901
{
902
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
903
		return 0;
904
	return call_int_hook(path_chown, 0, path, uid, gid);
905
}
T
Tetsuo Handa 已提交
906

A
Al Viro 已提交
907
int security_path_chroot(const struct path *path)
T
Tetsuo Handa 已提交
908
{
909
	return call_int_hook(path_chroot, 0, path);
T
Tetsuo Handa 已提交
910
}
911 912
#endif

A
Al Viro 已提交
913
int security_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
914 915 916
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
917
	return call_int_hook(inode_create, 0, dir, dentry, mode);
918
}
919
EXPORT_SYMBOL_GPL(security_inode_create);
920 921 922 923

int security_inode_link(struct dentry *old_dentry, struct inode *dir,
			 struct dentry *new_dentry)
{
924
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
925
		return 0;
926
	return call_int_hook(inode_link, 0, old_dentry, dir, new_dentry);
927 928 929 930
}

int security_inode_unlink(struct inode *dir, struct dentry *dentry)
{
931
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
932
		return 0;
933
	return call_int_hook(inode_unlink, 0, dir, dentry);
934 935 936 937 938 939 940
}

int security_inode_symlink(struct inode *dir, struct dentry *dentry,
			    const char *old_name)
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
941
	return call_int_hook(inode_symlink, 0, dir, dentry, old_name);
942 943
}

944
int security_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
945 946 947
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
948
	return call_int_hook(inode_mkdir, 0, dir, dentry, mode);
949
}
950
EXPORT_SYMBOL_GPL(security_inode_mkdir);
951 952 953

int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
{
954
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
955
		return 0;
956
	return call_int_hook(inode_rmdir, 0, dir, dentry);
957 958
}

A
Al Viro 已提交
959
int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
960 961 962
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
963
	return call_int_hook(inode_mknod, 0, dir, dentry, mode, dev);
964 965 966
}

int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
967 968
			   struct inode *new_dir, struct dentry *new_dentry,
			   unsigned int flags)
969
{
970 971
        if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
            (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
972
		return 0;
M
Miklos Szeredi 已提交
973 974

	if (flags & RENAME_EXCHANGE) {
975
		int err = call_int_hook(inode_rename, 0, new_dir, new_dentry,
M
Miklos Szeredi 已提交
976 977 978 979 980
						     old_dir, old_dentry);
		if (err)
			return err;
	}

981
	return call_int_hook(inode_rename, 0, old_dir, old_dentry,
982 983 984 985 986
					   new_dir, new_dentry);
}

int security_inode_readlink(struct dentry *dentry)
{
987
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
988
		return 0;
989
	return call_int_hook(inode_readlink, 0, dentry);
990 991
}

992 993
int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
			       bool rcu)
994
{
995
	if (unlikely(IS_PRIVATE(inode)))
996
		return 0;
997
	return call_int_hook(inode_follow_link, 0, dentry, inode, rcu);
998 999
}

1000
int security_inode_permission(struct inode *inode, int mask)
1001 1002 1003
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
1004
	return call_int_hook(inode_permission, 0, inode, mask);
1005 1006 1007 1008
}

int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
{
1009 1010
	int ret;

1011
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1012
		return 0;
1013
	ret = call_int_hook(inode_setattr, 0, dentry, attr);
1014 1015 1016
	if (ret)
		return ret;
	return evm_inode_setattr(dentry, attr);
1017
}
1018
EXPORT_SYMBOL_GPL(security_inode_setattr);
1019

1020
int security_inode_getattr(const struct path *path)
1021
{
1022
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
1023
		return 0;
1024
	return call_int_hook(inode_getattr, 0, path);
1025 1026
}

1027 1028
int security_inode_setxattr(struct dentry *dentry, const char *name,
			    const void *value, size_t size, int flags)
1029
{
1030 1031
	int ret;

1032
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1033
		return 0;
C
Casey Schaufler 已提交
1034 1035 1036 1037 1038
	/*
	 * 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,
1039
				flags);
C
Casey Schaufler 已提交
1040 1041 1042

	if (ret == 1)
		ret = cap_inode_setxattr(dentry, name, value, size, flags);
1043 1044 1045
	if (ret)
		return ret;
	ret = ima_inode_setxattr(dentry, name, value, size);
1046 1047 1048
	if (ret)
		return ret;
	return evm_inode_setxattr(dentry, name, value, size);
1049 1050
}

1051 1052
void security_inode_post_setxattr(struct dentry *dentry, const char *name,
				  const void *value, size_t size, int flags)
1053
{
1054
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1055
		return;
1056
	call_void_hook(inode_post_setxattr, dentry, name, value, size, flags);
1057
	evm_inode_post_setxattr(dentry, name, value, size);
1058 1059
}

1060
int security_inode_getxattr(struct dentry *dentry, const char *name)
1061
{
1062
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1063
		return 0;
1064
	return call_int_hook(inode_getxattr, 0, dentry, name);
1065 1066 1067 1068
}

int security_inode_listxattr(struct dentry *dentry)
{
1069
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1070
		return 0;
1071
	return call_int_hook(inode_listxattr, 0, dentry);
1072 1073
}

1074
int security_inode_removexattr(struct dentry *dentry, const char *name)
1075
{
1076 1077
	int ret;

1078
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1079
		return 0;
C
Casey Schaufler 已提交
1080 1081 1082 1083 1084 1085 1086
	/*
	 * 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);
1087 1088 1089
	if (ret)
		return ret;
	ret = ima_inode_removexattr(dentry, name);
1090 1091 1092
	if (ret)
		return ret;
	return evm_inode_removexattr(dentry, name);
1093 1094
}

1095 1096
int security_inode_need_killpriv(struct dentry *dentry)
{
1097
	return call_int_hook(inode_need_killpriv, 0, dentry);
1098 1099 1100 1101
}

int security_inode_killpriv(struct dentry *dentry)
{
1102
	return call_int_hook(inode_killpriv, 0, dentry);
1103 1104
}

1105
int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
1106
{
1107 1108 1109
	struct security_hook_list *hp;
	int rc;

1110
	if (unlikely(IS_PRIVATE(inode)))
1111
		return -EOPNOTSUPP;
1112 1113 1114
	/*
	 * Only one module will provide an attribute with a given name.
	 */
1115
	hlist_for_each_entry(hp, &security_hook_heads.inode_getsecurity, list) {
1116 1117 1118 1119 1120
		rc = hp->hook.inode_getsecurity(inode, name, buffer, alloc);
		if (rc != -EOPNOTSUPP)
			return rc;
	}
	return -EOPNOTSUPP;
1121 1122 1123 1124
}

int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
{
1125 1126 1127
	struct security_hook_list *hp;
	int rc;

1128
	if (unlikely(IS_PRIVATE(inode)))
1129
		return -EOPNOTSUPP;
1130 1131 1132
	/*
	 * Only one module will provide an attribute with a given name.
	 */
1133
	hlist_for_each_entry(hp, &security_hook_heads.inode_setsecurity, list) {
1134 1135 1136 1137 1138 1139
		rc = hp->hook.inode_setsecurity(inode, name, value, size,
								flags);
		if (rc != -EOPNOTSUPP)
			return rc;
	}
	return -EOPNOTSUPP;
1140 1141 1142 1143 1144 1145
}

int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
1146
	return call_int_hook(inode_listsecurity, 0, inode, buffer, buffer_size);
1147
}
1148
EXPORT_SYMBOL(security_inode_listsecurity);
1149

1150
void security_inode_getsecid(struct inode *inode, u32 *secid)
1151
{
1152
	call_void_hook(inode_getsecid, inode, secid);
1153 1154
}

1155 1156 1157 1158 1159 1160
int security_inode_copy_up(struct dentry *src, struct cred **new)
{
	return call_int_hook(inode_copy_up, 0, src, new);
}
EXPORT_SYMBOL(security_inode_copy_up);

1161 1162 1163 1164 1165 1166
int security_inode_copy_up_xattr(const char *name)
{
	return call_int_hook(inode_copy_up_xattr, -EOPNOTSUPP, name);
}
EXPORT_SYMBOL(security_inode_copy_up_xattr);

1167 1168
int security_file_permission(struct file *file, int mask)
{
1169 1170
	int ret;

1171
	ret = call_int_hook(file_permission, 0, file, mask);
1172 1173 1174 1175
	if (ret)
		return ret;

	return fsnotify_perm(file, mask);
1176 1177 1178 1179
}

int security_file_alloc(struct file *file)
{
1180 1181 1182 1183 1184 1185 1186 1187
	int rc = lsm_file_alloc(file);

	if (rc)
		return rc;
	rc = call_int_hook(file_alloc_security, 0, file);
	if (unlikely(rc))
		security_file_free(file);
	return rc;
1188 1189 1190 1191
}

void security_file_free(struct file *file)
{
1192 1193
	void *blob;

1194
	call_void_hook(file_free_security, file);
1195 1196 1197 1198 1199 1200

	blob = file->f_security;
	if (blob) {
		file->f_security = NULL;
		kmem_cache_free(lsm_file_cache, blob);
	}
1201 1202 1203 1204
}

int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
1205
	return call_int_hook(file_ioctl, 0, file, cmd, arg);
1206 1207
}

1208
static inline unsigned long mmap_prot(struct file *file, unsigned long prot)
1209
{
1210
	/*
1211 1212
	 * Does we have PROT_READ and does the application expect
	 * it to imply PROT_EXEC?  If not, nothing to talk about...
1213
	 */
1214 1215
	if ((prot & (PROT_READ | PROT_EXEC)) != PROT_READ)
		return prot;
1216
	if (!(current->personality & READ_IMPLIES_EXEC))
1217 1218 1219 1220 1221 1222 1223 1224
		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
1225
	 * NOMMU_MAP_EXEC (== VM_MAYEXEC) in this case
1226
	 */
1227
	if (!path_noexec(&file->f_path)) {
1228
#ifndef CONFIG_MMU
1229 1230 1231 1232 1233
		if (file->f_op->mmap_capabilities) {
			unsigned caps = file->f_op->mmap_capabilities(file);
			if (!(caps & NOMMU_MAP_EXEC))
				return prot;
		}
1234
#endif
1235
		return prot | PROT_EXEC;
1236
	}
1237 1238 1239 1240 1241 1242 1243 1244
	/* 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;
1245
	ret = call_int_hook(mmap_file, 0, file, prot,
1246
					mmap_prot(file, prot), flags);
1247 1248 1249
	if (ret)
		return ret;
	return ima_file_mmap(file, prot);
1250 1251
}

1252 1253
int security_mmap_addr(unsigned long addr)
{
1254
	return call_int_hook(mmap_addr, 0, addr);
1255 1256
}

1257 1258 1259
int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot,
			    unsigned long prot)
{
1260
	return call_int_hook(file_mprotect, 0, vma, reqprot, prot);
1261 1262 1263 1264
}

int security_file_lock(struct file *file, unsigned int cmd)
{
1265
	return call_int_hook(file_lock, 0, file, cmd);
1266 1267 1268 1269
}

int security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
{
1270
	return call_int_hook(file_fcntl, 0, file, cmd, arg);
1271 1272
}

1273
void security_file_set_fowner(struct file *file)
1274
{
1275
	call_void_hook(file_set_fowner, file);
1276 1277 1278 1279 1280
}

int security_file_send_sigiotask(struct task_struct *tsk,
				  struct fown_struct *fown, int sig)
{
1281
	return call_int_hook(file_send_sigiotask, 0, tsk, fown, sig);
1282 1283 1284 1285
}

int security_file_receive(struct file *file)
{
1286
	return call_int_hook(file_receive, 0, file);
1287 1288
}

1289
int security_file_open(struct file *file)
1290
{
1291 1292
	int ret;

A
Al Viro 已提交
1293
	ret = call_int_hook(file_open, 0, file);
1294 1295 1296 1297
	if (ret)
		return ret;

	return fsnotify_perm(file, MAY_OPEN);
1298 1299
}

1300 1301 1302 1303 1304
int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
{
	return call_int_hook(task_alloc, 0, task, clone_flags);
}

1305 1306
void security_task_free(struct task_struct *task)
{
1307
	call_void_hook(task_free, task);
1308 1309
}

1310 1311
int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
{
1312 1313 1314 1315 1316 1317
	int rc = lsm_cred_alloc(cred, gfp);

	if (rc)
		return rc;

	rc = call_int_hook(cred_alloc_blank, 0, cred, gfp);
1318
	if (unlikely(rc))
1319 1320
		security_cred_free(cred);
	return rc;
1321 1322
}

D
David Howells 已提交
1323
void security_cred_free(struct cred *cred)
1324
{
1325
	call_void_hook(cred_free, cred);
1326 1327 1328

	kfree(cred->security);
	cred->security = NULL;
1329 1330
}

D
David Howells 已提交
1331
int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp)
1332
{
1333 1334 1335 1336 1337 1338
	int rc = lsm_cred_alloc(new, gfp);

	if (rc)
		return rc;

	rc = call_int_hook(cred_prepare, 0, new, old, gfp);
1339
	if (unlikely(rc))
1340 1341
		security_cred_free(new);
	return rc;
D
David Howells 已提交
1342 1343
}

1344 1345
void security_transfer_creds(struct cred *new, const struct cred *old)
{
1346
	call_void_hook(cred_transfer, new, old);
1347 1348
}

1349 1350 1351 1352 1353 1354 1355
void security_cred_getsecid(const struct cred *c, u32 *secid)
{
	*secid = 0;
	call_void_hook(cred_getsecid, c, secid);
}
EXPORT_SYMBOL(security_cred_getsecid);

1356 1357
int security_kernel_act_as(struct cred *new, u32 secid)
{
1358
	return call_int_hook(kernel_act_as, 0, new, secid);
1359 1360 1361 1362
}

int security_kernel_create_files_as(struct cred *new, struct inode *inode)
{
1363
	return call_int_hook(kernel_create_files_as, 0, new, inode);
1364 1365
}

1366
int security_kernel_module_request(char *kmod_name)
1367
{
1368 1369 1370 1371 1372 1373
	int ret;

	ret = call_int_hook(kernel_module_request, 0, kmod_name);
	if (ret)
		return ret;
	return integrity_kernel_module_request(kmod_name);
1374 1375
}

1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
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);

1387 1388
int security_kernel_post_read_file(struct file *file, char *buf, loff_t size,
				   enum kernel_read_file_id id)
1389
{
1390 1391 1392 1393 1394 1395
	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);
1396 1397 1398
}
EXPORT_SYMBOL_GPL(security_kernel_post_read_file);

1399 1400
int security_kernel_load_data(enum kernel_load_data_id id)
{
1401 1402 1403 1404 1405 1406
	int ret;

	ret = call_int_hook(kernel_load_data, 0, id);
	if (ret)
		return ret;
	return ima_load_data(id);
1407
}
1408
EXPORT_SYMBOL_GPL(security_kernel_load_data);
1409

D
David Howells 已提交
1410 1411
int security_task_fix_setuid(struct cred *new, const struct cred *old,
			     int flags)
1412
{
1413
	return call_int_hook(task_fix_setuid, 0, new, old, flags);
1414 1415 1416 1417
}

int security_task_setpgid(struct task_struct *p, pid_t pgid)
{
1418
	return call_int_hook(task_setpgid, 0, p, pgid);
1419 1420 1421 1422
}

int security_task_getpgid(struct task_struct *p)
{
1423
	return call_int_hook(task_getpgid, 0, p);
1424 1425 1426 1427
}

int security_task_getsid(struct task_struct *p)
{
1428
	return call_int_hook(task_getsid, 0, p);
1429 1430 1431 1432
}

void security_task_getsecid(struct task_struct *p, u32 *secid)
{
C
Casey Schaufler 已提交
1433
	*secid = 0;
1434
	call_void_hook(task_getsecid, p, secid);
1435 1436 1437 1438 1439
}
EXPORT_SYMBOL(security_task_getsecid);

int security_task_setnice(struct task_struct *p, int nice)
{
1440
	return call_int_hook(task_setnice, 0, p, nice);
1441 1442 1443 1444
}

int security_task_setioprio(struct task_struct *p, int ioprio)
{
1445
	return call_int_hook(task_setioprio, 0, p, ioprio);
1446 1447 1448 1449
}

int security_task_getioprio(struct task_struct *p)
{
1450
	return call_int_hook(task_getioprio, 0, p);
1451 1452
}

1453 1454 1455 1456 1457 1458
int security_task_prlimit(const struct cred *cred, const struct cred *tcred,
			  unsigned int flags)
{
	return call_int_hook(task_prlimit, 0, cred, tcred, flags);
}

1459 1460
int security_task_setrlimit(struct task_struct *p, unsigned int resource,
		struct rlimit *new_rlim)
1461
{
1462
	return call_int_hook(task_setrlimit, 0, p, resource, new_rlim);
1463 1464
}

1465
int security_task_setscheduler(struct task_struct *p)
1466
{
1467
	return call_int_hook(task_setscheduler, 0, p);
1468 1469 1470 1471
}

int security_task_getscheduler(struct task_struct *p)
{
1472
	return call_int_hook(task_getscheduler, 0, p);
1473 1474 1475 1476
}

int security_task_movememory(struct task_struct *p)
{
1477
	return call_int_hook(task_movememory, 0, p);
1478 1479
}

1480
int security_task_kill(struct task_struct *p, struct kernel_siginfo *info,
1481
			int sig, const struct cred *cred)
1482
{
1483
	return call_int_hook(task_kill, 0, p, info, sig, cred);
1484 1485 1486
}

int security_task_prctl(int option, unsigned long arg2, unsigned long arg3,
D
David Howells 已提交
1487
			 unsigned long arg4, unsigned long arg5)
1488
{
C
Casey Schaufler 已提交
1489 1490 1491 1492
	int thisrc;
	int rc = -ENOSYS;
	struct security_hook_list *hp;

1493
	hlist_for_each_entry(hp, &security_hook_heads.task_prctl, list) {
C
Casey Schaufler 已提交
1494 1495 1496 1497 1498 1499 1500 1501
		thisrc = hp->hook.task_prctl(option, arg2, arg3, arg4, arg5);
		if (thisrc != -ENOSYS) {
			rc = thisrc;
			if (thisrc != 0)
				break;
		}
	}
	return rc;
1502 1503 1504 1505
}

void security_task_to_inode(struct task_struct *p, struct inode *inode)
{
1506
	call_void_hook(task_to_inode, p, inode);
1507 1508 1509 1510
}

int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
{
1511
	return call_int_hook(ipc_permission, 0, ipcp, flag);
1512 1513
}

1514 1515
void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
{
C
Casey Schaufler 已提交
1516
	*secid = 0;
1517
	call_void_hook(ipc_getsecid, ipcp, secid);
1518 1519
}

1520 1521
int security_msg_msg_alloc(struct msg_msg *msg)
{
1522
	return call_int_hook(msg_msg_alloc_security, 0, msg);
1523 1524 1525 1526
}

void security_msg_msg_free(struct msg_msg *msg)
{
1527
	call_void_hook(msg_msg_free_security, msg);
1528 1529
}

1530
int security_msg_queue_alloc(struct kern_ipc_perm *msq)
1531
{
1532
	return call_int_hook(msg_queue_alloc_security, 0, msq);
1533 1534
}

1535
void security_msg_queue_free(struct kern_ipc_perm *msq)
1536
{
1537
	call_void_hook(msg_queue_free_security, msq);
1538 1539
}

1540
int security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
1541
{
1542
	return call_int_hook(msg_queue_associate, 0, msq, msqflg);
1543 1544
}

1545
int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
1546
{
1547
	return call_int_hook(msg_queue_msgctl, 0, msq, cmd);
1548 1549
}

1550
int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
1551 1552
			       struct msg_msg *msg, int msqflg)
{
1553
	return call_int_hook(msg_queue_msgsnd, 0, msq, msg, msqflg);
1554 1555
}

1556
int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
1557 1558
			       struct task_struct *target, long type, int mode)
{
1559
	return call_int_hook(msg_queue_msgrcv, 0, msq, msg, target, type, mode);
1560 1561
}

1562
int security_shm_alloc(struct kern_ipc_perm *shp)
1563
{
1564
	return call_int_hook(shm_alloc_security, 0, shp);
1565 1566
}

1567
void security_shm_free(struct kern_ipc_perm *shp)
1568
{
1569
	call_void_hook(shm_free_security, shp);
1570 1571
}

1572
int security_shm_associate(struct kern_ipc_perm *shp, int shmflg)
1573
{
1574
	return call_int_hook(shm_associate, 0, shp, shmflg);
1575 1576
}

1577
int security_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
1578
{
1579
	return call_int_hook(shm_shmctl, 0, shp, cmd);
1580 1581
}

1582
int security_shm_shmat(struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)
1583
{
1584
	return call_int_hook(shm_shmat, 0, shp, shmaddr, shmflg);
1585 1586
}

1587
int security_sem_alloc(struct kern_ipc_perm *sma)
1588
{
1589
	return call_int_hook(sem_alloc_security, 0, sma);
1590 1591
}

1592
void security_sem_free(struct kern_ipc_perm *sma)
1593
{
1594
	call_void_hook(sem_free_security, sma);
1595 1596
}

1597
int security_sem_associate(struct kern_ipc_perm *sma, int semflg)
1598
{
1599
	return call_int_hook(sem_associate, 0, sma, semflg);
1600 1601
}

1602
int security_sem_semctl(struct kern_ipc_perm *sma, int cmd)
1603
{
1604
	return call_int_hook(sem_semctl, 0, sma, cmd);
1605 1606
}

1607
int security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops,
1608 1609
			unsigned nsops, int alter)
{
1610
	return call_int_hook(sem_semop, 0, sma, sops, nsops, alter);
1611 1612 1613 1614 1615 1616
}

void security_d_instantiate(struct dentry *dentry, struct inode *inode)
{
	if (unlikely(inode && IS_PRIVATE(inode)))
		return;
1617
	call_void_hook(d_instantiate, dentry, inode);
1618 1619 1620
}
EXPORT_SYMBOL(security_d_instantiate);

1621 1622
int security_getprocattr(struct task_struct *p, const char *lsm, char *name,
				char **value)
1623
{
1624 1625 1626 1627 1628 1629 1630 1631
	struct security_hook_list *hp;

	hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) {
		if (lsm != NULL && strcmp(lsm, hp->lsm))
			continue;
		return hp->hook.getprocattr(p, name, value);
	}
	return -EINVAL;
1632 1633
}

1634 1635
int security_setprocattr(const char *lsm, const char *name, void *value,
			 size_t size)
1636
{
1637 1638 1639 1640 1641 1642 1643 1644
	struct security_hook_list *hp;

	hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) {
		if (lsm != NULL && strcmp(lsm, hp->lsm))
			continue;
		return hp->hook.setprocattr(name, value, size);
	}
	return -EINVAL;
1645 1646 1647 1648
}

int security_netlink_send(struct sock *sk, struct sk_buff *skb)
{
1649
	return call_int_hook(netlink_send, 0, sk, skb);
1650 1651
}

1652 1653
int security_ismaclabel(const char *name)
{
1654
	return call_int_hook(ismaclabel, 0, name);
1655 1656 1657
}
EXPORT_SYMBOL(security_ismaclabel);

1658 1659
int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
{
C
Casey Schaufler 已提交
1660 1661
	return call_int_hook(secid_to_secctx, -EOPNOTSUPP, secid, secdata,
				seclen);
1662 1663 1664
}
EXPORT_SYMBOL(security_secid_to_secctx);

1665
int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
1666
{
C
Casey Schaufler 已提交
1667
	*secid = 0;
1668
	return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid);
1669 1670 1671
}
EXPORT_SYMBOL(security_secctx_to_secid);

1672 1673
void security_release_secctx(char *secdata, u32 seclen)
{
1674
	call_void_hook(release_secctx, secdata, seclen);
1675 1676 1677
}
EXPORT_SYMBOL(security_release_secctx);

1678 1679 1680 1681 1682 1683
void security_inode_invalidate_secctx(struct inode *inode)
{
	call_void_hook(inode_invalidate_secctx, inode);
}
EXPORT_SYMBOL(security_inode_invalidate_secctx);

1684 1685
int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
{
1686
	return call_int_hook(inode_notifysecctx, 0, inode, ctx, ctxlen);
1687 1688 1689 1690 1691
}
EXPORT_SYMBOL(security_inode_notifysecctx);

int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
{
1692
	return call_int_hook(inode_setsecctx, 0, dentry, ctx, ctxlen);
1693 1694 1695 1696 1697
}
EXPORT_SYMBOL(security_inode_setsecctx);

int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
{
C
Casey Schaufler 已提交
1698
	return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen);
1699 1700 1701
}
EXPORT_SYMBOL(security_inode_getsecctx);

1702 1703
#ifdef CONFIG_SECURITY_NETWORK

1704
int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk)
1705
{
1706
	return call_int_hook(unix_stream_connect, 0, sock, other, newsk);
1707 1708 1709 1710 1711
}
EXPORT_SYMBOL(security_unix_stream_connect);

int security_unix_may_send(struct socket *sock,  struct socket *other)
{
1712
	return call_int_hook(unix_may_send, 0, sock, other);
1713 1714 1715 1716 1717
}
EXPORT_SYMBOL(security_unix_may_send);

int security_socket_create(int family, int type, int protocol, int kern)
{
1718
	return call_int_hook(socket_create, 0, family, type, protocol, kern);
1719 1720 1721 1722 1723
}

int security_socket_post_create(struct socket *sock, int family,
				int type, int protocol, int kern)
{
1724
	return call_int_hook(socket_post_create, 0, sock, family, type,
1725 1726 1727
						protocol, kern);
}

1728 1729 1730 1731 1732 1733
int security_socket_socketpair(struct socket *socka, struct socket *sockb)
{
	return call_int_hook(socket_socketpair, 0, socka, sockb);
}
EXPORT_SYMBOL(security_socket_socketpair);

1734 1735
int security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
{
1736
	return call_int_hook(socket_bind, 0, sock, address, addrlen);
1737 1738 1739 1740
}

int security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
{
1741
	return call_int_hook(socket_connect, 0, sock, address, addrlen);
1742 1743 1744 1745
}

int security_socket_listen(struct socket *sock, int backlog)
{
1746
	return call_int_hook(socket_listen, 0, sock, backlog);
1747 1748 1749 1750
}

int security_socket_accept(struct socket *sock, struct socket *newsock)
{
1751
	return call_int_hook(socket_accept, 0, sock, newsock);
1752 1753 1754 1755
}

int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)
{
1756
	return call_int_hook(socket_sendmsg, 0, sock, msg, size);
1757 1758 1759 1760 1761
}

int security_socket_recvmsg(struct socket *sock, struct msghdr *msg,
			    int size, int flags)
{
1762
	return call_int_hook(socket_recvmsg, 0, sock, msg, size, flags);
1763 1764 1765 1766
}

int security_socket_getsockname(struct socket *sock)
{
1767
	return call_int_hook(socket_getsockname, 0, sock);
1768 1769 1770 1771
}

int security_socket_getpeername(struct socket *sock)
{
1772
	return call_int_hook(socket_getpeername, 0, sock);
1773 1774 1775 1776
}

int security_socket_getsockopt(struct socket *sock, int level, int optname)
{
1777
	return call_int_hook(socket_getsockopt, 0, sock, level, optname);
1778 1779 1780 1781
}

int security_socket_setsockopt(struct socket *sock, int level, int optname)
{
1782
	return call_int_hook(socket_setsockopt, 0, sock, level, optname);
1783 1784 1785 1786
}

int security_socket_shutdown(struct socket *sock, int how)
{
1787
	return call_int_hook(socket_shutdown, 0, sock, how);
1788 1789 1790 1791
}

int security_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
{
1792
	return call_int_hook(socket_sock_rcv_skb, 0, sk, skb);
1793 1794 1795 1796 1797 1798
}
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 已提交
1799 1800
	return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock,
				optval, optlen, len);
1801 1802 1803 1804
}

int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
{
1805 1806
	return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock,
			     skb, secid);
1807 1808 1809 1810 1811
}
EXPORT_SYMBOL(security_socket_getpeersec_dgram);

int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
{
1812
	return call_int_hook(sk_alloc_security, 0, sk, family, priority);
1813 1814 1815 1816
}

void security_sk_free(struct sock *sk)
{
1817
	call_void_hook(sk_free_security, sk);
1818 1819 1820 1821
}

void security_sk_clone(const struct sock *sk, struct sock *newsk)
{
1822
	call_void_hook(sk_clone_security, sk, newsk);
1823
}
1824
EXPORT_SYMBOL(security_sk_clone);
1825 1826 1827

void security_sk_classify_flow(struct sock *sk, struct flowi *fl)
{
1828
	call_void_hook(sk_getsecid, sk, &fl->flowi_secid);
1829 1830 1831 1832 1833
}
EXPORT_SYMBOL(security_sk_classify_flow);

void security_req_classify_flow(const struct request_sock *req, struct flowi *fl)
{
1834
	call_void_hook(req_classify_flow, req, fl);
1835 1836 1837 1838 1839
}
EXPORT_SYMBOL(security_req_classify_flow);

void security_sock_graft(struct sock *sk, struct socket *parent)
{
1840
	call_void_hook(sock_graft, sk, parent);
1841 1842 1843 1844 1845 1846
}
EXPORT_SYMBOL(security_sock_graft);

int security_inet_conn_request(struct sock *sk,
			struct sk_buff *skb, struct request_sock *req)
{
1847
	return call_int_hook(inet_conn_request, 0, sk, skb, req);
1848 1849 1850 1851 1852 1853
}
EXPORT_SYMBOL(security_inet_conn_request);

void security_inet_csk_clone(struct sock *newsk,
			const struct request_sock *req)
{
1854
	call_void_hook(inet_csk_clone, newsk, req);
1855 1856 1857 1858 1859
}

void security_inet_conn_established(struct sock *sk,
			struct sk_buff *skb)
{
1860
	call_void_hook(inet_conn_established, sk, skb);
1861
}
1862
EXPORT_SYMBOL(security_inet_conn_established);
1863

1864 1865
int security_secmark_relabel_packet(u32 secid)
{
1866
	return call_int_hook(secmark_relabel_packet, 0, secid);
1867 1868 1869 1870 1871
}
EXPORT_SYMBOL(security_secmark_relabel_packet);

void security_secmark_refcount_inc(void)
{
1872
	call_void_hook(secmark_refcount_inc);
1873 1874 1875 1876 1877
}
EXPORT_SYMBOL(security_secmark_refcount_inc);

void security_secmark_refcount_dec(void)
{
1878
	call_void_hook(secmark_refcount_dec);
1879 1880 1881
}
EXPORT_SYMBOL(security_secmark_refcount_dec);

1882 1883
int security_tun_dev_alloc_security(void **security)
{
1884
	return call_int_hook(tun_dev_alloc_security, 0, security);
1885 1886 1887 1888 1889
}
EXPORT_SYMBOL(security_tun_dev_alloc_security);

void security_tun_dev_free_security(void *security)
{
1890
	call_void_hook(tun_dev_free_security, security);
1891 1892 1893
}
EXPORT_SYMBOL(security_tun_dev_free_security);

P
Paul Moore 已提交
1894 1895
int security_tun_dev_create(void)
{
1896
	return call_int_hook(tun_dev_create, 0);
P
Paul Moore 已提交
1897 1898 1899
}
EXPORT_SYMBOL(security_tun_dev_create);

1900
int security_tun_dev_attach_queue(void *security)
P
Paul Moore 已提交
1901
{
1902
	return call_int_hook(tun_dev_attach_queue, 0, security);
P
Paul Moore 已提交
1903
}
1904
EXPORT_SYMBOL(security_tun_dev_attach_queue);
P
Paul Moore 已提交
1905

1906
int security_tun_dev_attach(struct sock *sk, void *security)
P
Paul Moore 已提交
1907
{
1908
	return call_int_hook(tun_dev_attach, 0, sk, security);
P
Paul Moore 已提交
1909 1910 1911
}
EXPORT_SYMBOL(security_tun_dev_attach);

1912 1913
int security_tun_dev_open(void *security)
{
1914
	return call_int_hook(tun_dev_open, 0, security);
1915 1916 1917
}
EXPORT_SYMBOL(security_tun_dev_open);

1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938
int security_sctp_assoc_request(struct sctp_endpoint *ep, struct sk_buff *skb)
{
	return call_int_hook(sctp_assoc_request, 0, ep, skb);
}
EXPORT_SYMBOL(security_sctp_assoc_request);

int security_sctp_bind_connect(struct sock *sk, int optname,
			       struct sockaddr *address, int addrlen)
{
	return call_int_hook(sctp_bind_connect, 0, sk, optname,
			     address, addrlen);
}
EXPORT_SYMBOL(security_sctp_bind_connect);

void security_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
			    struct sock *newsk)
{
	call_void_hook(sctp_sk_clone, ep, sk, newsk);
}
EXPORT_SYMBOL(security_sctp_sk_clone);

1939 1940
#endif	/* CONFIG_SECURITY_NETWORK */

1941 1942 1943 1944 1945 1946 1947 1948
#ifdef CONFIG_SECURITY_INFINIBAND

int security_ib_pkey_access(void *sec, u64 subnet_prefix, u16 pkey)
{
	return call_int_hook(ib_pkey_access, 0, sec, subnet_prefix, pkey);
}
EXPORT_SYMBOL(security_ib_pkey_access);

1949 1950 1951 1952 1953 1954
int security_ib_endport_manage_subnet(void *sec, const char *dev_name, u8 port_num)
{
	return call_int_hook(ib_endport_manage_subnet, 0, sec, dev_name, port_num);
}
EXPORT_SYMBOL(security_ib_endport_manage_subnet);

1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967
int security_ib_alloc_security(void **sec)
{
	return call_int_hook(ib_alloc_security, 0, sec);
}
EXPORT_SYMBOL(security_ib_alloc_security);

void security_ib_free_security(void *sec)
{
	call_void_hook(ib_free_security, sec);
}
EXPORT_SYMBOL(security_ib_free_security);
#endif	/* CONFIG_SECURITY_INFINIBAND */

1968 1969
#ifdef CONFIG_SECURITY_NETWORK_XFRM

1970 1971 1972
int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
			       struct xfrm_user_sec_ctx *sec_ctx,
			       gfp_t gfp)
1973
{
1974
	return call_int_hook(xfrm_policy_alloc_security, 0, ctxp, sec_ctx, gfp);
1975 1976 1977
}
EXPORT_SYMBOL(security_xfrm_policy_alloc);

1978 1979
int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,
			      struct xfrm_sec_ctx **new_ctxp)
1980
{
1981
	return call_int_hook(xfrm_policy_clone_security, 0, old_ctx, new_ctxp);
1982 1983
}

1984
void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx)
1985
{
1986
	call_void_hook(xfrm_policy_free_security, ctx);
1987 1988 1989
}
EXPORT_SYMBOL(security_xfrm_policy_free);

1990
int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
1991
{
1992
	return call_int_hook(xfrm_policy_delete_security, 0, ctx);
1993 1994
}

1995 1996
int security_xfrm_state_alloc(struct xfrm_state *x,
			      struct xfrm_user_sec_ctx *sec_ctx)
1997
{
1998
	return call_int_hook(xfrm_state_alloc, 0, x, sec_ctx);
1999 2000 2001 2002 2003 2004
}
EXPORT_SYMBOL(security_xfrm_state_alloc);

int security_xfrm_state_alloc_acquire(struct xfrm_state *x,
				      struct xfrm_sec_ctx *polsec, u32 secid)
{
2005
	return call_int_hook(xfrm_state_alloc_acquire, 0, x, polsec, secid);
2006 2007 2008 2009
}

int security_xfrm_state_delete(struct xfrm_state *x)
{
2010
	return call_int_hook(xfrm_state_delete_security, 0, x);
2011 2012 2013 2014 2015
}
EXPORT_SYMBOL(security_xfrm_state_delete);

void security_xfrm_state_free(struct xfrm_state *x)
{
2016
	call_void_hook(xfrm_state_free_security, x);
2017 2018
}

2019
int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
2020
{
2021
	return call_int_hook(xfrm_policy_lookup, 0, ctx, fl_secid, dir);
2022 2023 2024
}

int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
2025 2026
				       struct xfrm_policy *xp,
				       const struct flowi *fl)
2027
{
C
Casey Schaufler 已提交
2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
	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
	 */
2040
	hlist_for_each_entry(hp, &security_hook_heads.xfrm_state_pol_flow_match,
C
Casey Schaufler 已提交
2041 2042 2043 2044 2045
				list) {
		rc = hp->hook.xfrm_state_pol_flow_match(x, xp, fl);
		break;
	}
	return rc;
2046 2047 2048 2049
}

int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid)
{
2050
	return call_int_hook(xfrm_decode_session, 0, skb, secid, 1);
2051 2052 2053 2054
}

void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl)
{
2055 2056
	int rc = call_int_hook(xfrm_decode_session, 0, skb, &fl->flowi_secid,
				0);
2057 2058 2059 2060 2061 2062 2063 2064 2065

	BUG_ON(rc);
}
EXPORT_SYMBOL(security_skb_classify_flow);

#endif	/* CONFIG_SECURITY_NETWORK_XFRM */

#ifdef CONFIG_KEYS

D
David Howells 已提交
2066 2067
int security_key_alloc(struct key *key, const struct cred *cred,
		       unsigned long flags)
2068
{
2069
	return call_int_hook(key_alloc, 0, key, cred, flags);
2070 2071 2072 2073
}

void security_key_free(struct key *key)
{
2074
	call_void_hook(key_free, key);
2075 2076 2077
}

int security_key_permission(key_ref_t key_ref,
2078
			    const struct cred *cred, unsigned perm)
2079
{
2080
	return call_int_hook(key_permission, 0, key_ref, cred, perm);
2081 2082
}

2083 2084
int security_key_getsecurity(struct key *key, char **_buffer)
{
C
Casey Schaufler 已提交
2085
	*_buffer = NULL;
2086
	return call_int_hook(key_getsecurity, 0, key, _buffer);
2087 2088
}

2089
#endif	/* CONFIG_KEYS */
2090 2091 2092 2093 2094

#ifdef CONFIG_AUDIT

int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule)
{
2095
	return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule);
2096 2097 2098 2099
}

int security_audit_rule_known(struct audit_krule *krule)
{
2100
	return call_int_hook(audit_rule_known, 0, krule);
2101 2102 2103 2104
}

void security_audit_rule_free(void *lsmrule)
{
2105
	call_void_hook(audit_rule_free, lsmrule);
2106 2107 2108 2109 2110
}

int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule,
			      struct audit_context *actx)
{
2111 2112
	return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule,
				actx);
2113
}
C
Casey Schaufler 已提交
2114
#endif /* CONFIG_AUDIT */
2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145

#ifdef CONFIG_BPF_SYSCALL
int security_bpf(int cmd, union bpf_attr *attr, unsigned int size)
{
	return call_int_hook(bpf, 0, cmd, attr, size);
}
int security_bpf_map(struct bpf_map *map, fmode_t fmode)
{
	return call_int_hook(bpf_map, 0, map, fmode);
}
int security_bpf_prog(struct bpf_prog *prog)
{
	return call_int_hook(bpf_prog, 0, prog);
}
int security_bpf_map_alloc(struct bpf_map *map)
{
	return call_int_hook(bpf_map_alloc_security, 0, map);
}
int security_bpf_prog_alloc(struct bpf_prog_aux *aux)
{
	return call_int_hook(bpf_prog_alloc_security, 0, aux);
}
void security_bpf_map_free(struct bpf_map *map)
{
	call_void_hook(bpf_map_free_security, map);
}
void security_bpf_prog_free(struct bpf_prog_aux *aux)
{
	call_void_hook(bpf_prog_free_security, aux);
}
#endif /* CONFIG_BPF_SYSCALL */