security.c 58.7 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-or-later
L
Linus Torvalds 已提交
2 3 4 5 6 7
/*
 * 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>
8
 * Copyright (C) 2016 Mellanox Technologies
L
Linus Torvalds 已提交
9 10
 */

11 12
#define pr_fmt(fmt) "LSM: " fmt

13
#include <linux/bpf.h>
14
#include <linux/capability.h>
15
#include <linux/dcache.h>
16
#include <linux/export.h>
L
Linus Torvalds 已提交
17 18
#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>
28
#include <linux/string.h>
29
#include <linux/msg.h>
A
Al Viro 已提交
30
#include <net/flow.h>
L
Linus Torvalds 已提交
31

32
#define MAX_LSM_EVM_XATTR	2
L
Linus Torvalds 已提交
33

34 35
/* How many LSMs were built into the kernel? */
#define LSM_COUNT (__end_lsm_info - __start_lsm_info)
M
Matthew Garrett 已提交
36
#define EARLY_LSM_COUNT (__end_early_lsm_info - __start_early_lsm_info)
37

38
struct security_hook_heads security_hook_heads __lsm_ro_after_init;
39 40
static ATOMIC_NOTIFIER_HEAD(lsm_notifier_chain);

41
static struct kmem_cache *lsm_file_cache;
42
static struct kmem_cache *lsm_inode_cache;
43

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

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

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

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

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

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

69
	return *lsm->enabled;
70 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
}

/* 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;
	}
}

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
/* 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;

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

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

129 130 131 132 133 134 135
/* 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;

136 137 138 139 140 141
	/* 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;
	}

142 143 144
	return true;
}

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
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);
162
	lsm_set_blob_size(&needed->lbs_file, &blob_sizes.lbs_file);
163 164 165 166 167 168 169
	/*
	 * The inode blob gets an rcu_head in addition to
	 * what the modules might need.
	 */
	if (needed->lbs_inode && blob_sizes.lbs_inode == 0)
		blob_sizes.lbs_inode = sizeof(struct rcu_head);
	lsm_set_blob_size(&needed->lbs_inode, &blob_sizes.lbs_inode);
170 171
	lsm_set_blob_size(&needed->lbs_ipc, &blob_sizes.lbs_ipc);
	lsm_set_blob_size(&needed->lbs_msg_msg, &blob_sizes.lbs_msg_msg);
172
	lsm_set_blob_size(&needed->lbs_task, &blob_sizes.lbs_task);
173 174
}

175 176
/* Prepare LSM for initialization. */
static void __init prepare_lsm(struct lsm_info *lsm)
177 178 179 180 181 182
{
	int enabled = lsm_allowed(lsm);

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

183
	/* If enabled, do pre-initialization work. */
184
	if (enabled) {
185 186 187 188
		if ((lsm->flags & LSM_FLAG_EXCLUSIVE) && !exclusive) {
			exclusive = lsm;
			init_debug("exclusive chosen: %s\n", lsm->name);
		}
189 190

		lsm_set_blob_sizes(lsm->blobs);
191 192 193 194 195 196 197 198
	}
}

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

200 201 202 203 204 205
		init_debug("initializing %s\n", lsm->name);
		ret = lsm->init();
		WARN(ret, "%s failed to initialize: %d\n", lsm->name, ret);
	}
}

K
Kees Cook 已提交
206
/* Populate ordered LSMs list from comma-separated LSM name list. */
207
static void __init ordered_lsm_parse(const char *order, const char *origin)
208 209
{
	struct lsm_info *lsm;
K
Kees Cook 已提交
210 211
	char *sep, *name, *next;

K
Kees Cook 已提交
212 213 214 215 216 217
	/* 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");
	}

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	/* 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);
			}
		}
	}
238

K
Kees Cook 已提交
239 240 241 242 243 244 245
	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 已提交
246 247
			if (lsm->order == LSM_ORDER_MUTABLE &&
			    strcmp(lsm->name, name) == 0) {
K
Kees Cook 已提交
248 249 250 251 252 253 254
				append_ordered_lsm(lsm, origin);
				found = true;
			}
		}

		if (!found)
			init_debug("%s ignored: %s\n", origin, name);
255
	}
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274

	/* 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 已提交
275
	kfree(sep);
276 277
}

278 279 280
static void __init lsm_early_cred(struct cred *cred);
static void __init lsm_early_task(struct task_struct *task);

M
Matthew Garrett 已提交
281 282
static int lsm_append(const char *new, char **result);

283 284 285 286 287 288 289
static void __init ordered_lsm_init(void)
{
	struct lsm_info **lsm;

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

290 291 292 293 294
	if (chosen_lsm_order) {
		if (chosen_major_lsm) {
			pr_info("security= is ignored because it is superseded by lsm=\n");
			chosen_major_lsm = NULL;
		}
295
		ordered_lsm_parse(chosen_lsm_order, "cmdline");
296
	} else
297
		ordered_lsm_parse(builtin_lsm_order, "builtin");
298 299

	for (lsm = ordered_lsms; *lsm; lsm++)
300 301
		prepare_lsm(*lsm);

302
	init_debug("cred blob size     = %d\n", blob_sizes.lbs_cred);
303
	init_debug("file blob size     = %d\n", blob_sizes.lbs_file);
304
	init_debug("inode blob size    = %d\n", blob_sizes.lbs_inode);
305 306
	init_debug("ipc blob size      = %d\n", blob_sizes.lbs_ipc);
	init_debug("msg_msg blob size  = %d\n", blob_sizes.lbs_msg_msg);
307
	init_debug("task blob size     = %d\n", blob_sizes.lbs_task);
308 309 310 311 312 313 314 315

	/*
	 * 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);
316 317 318 319
	if (blob_sizes.lbs_inode)
		lsm_inode_cache = kmem_cache_create("lsm_inode_cache",
						    blob_sizes.lbs_inode, 0,
						    SLAB_PANIC, NULL);
320

321 322
	lsm_early_cred((struct cred *) current->cred);
	lsm_early_task(current);
323 324
	for (lsm = ordered_lsms; *lsm; lsm++)
		initialize_lsm(*lsm);
325 326 327 328

	kfree(ordered_lsms);
}

M
Matthew Garrett 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
int __init early_security_init(void)
{
	int i;
	struct hlist_head *list = (struct hlist_head *) &security_hook_heads;
	struct lsm_info *lsm;

	for (i = 0; i < sizeof(security_hook_heads) / sizeof(struct hlist_head);
	     i++)
		INIT_HLIST_HEAD(&list[i]);

	for (lsm = __start_early_lsm_info; lsm < __end_early_lsm_info; lsm++) {
		if (!lsm->enabled)
			lsm->enabled = &lsm_enabled_true;
		prepare_lsm(lsm);
		initialize_lsm(lsm);
	}

	return 0;
}

L
Linus Torvalds 已提交
349 350 351 352 353 354 355
/**
 * security_init - initializes the security framework
 *
 * This should be called early in the kernel initialization sequence.
 */
int __init security_init(void)
{
M
Matthew Garrett 已提交
356
	struct lsm_info *lsm;
357

358 359
	pr_info("Security Framework initializing\n");

M
Matthew Garrett 已提交
360 361 362 363 364 365 366 367
	/*
	 * Append the names of the early LSM modules now that kmalloc() is
	 * available
	 */
	for (lsm = __start_early_lsm_info; lsm < __end_early_lsm_info; lsm++) {
		if (lsm->enabled)
			lsm_append(lsm->name, &lsm_names);
	}
L
Linus Torvalds 已提交
368

369 370 371
	/* Load LSMs in specified order. */
	ordered_lsm_init();

L
Linus Torvalds 已提交
372 373 374
	return 0;
}

375
/* Save user chosen LSM */
376
static int __init choose_major_lsm(char *str)
377
{
378
	chosen_major_lsm = str;
379 380
	return 1;
}
381
__setup("security=", choose_major_lsm);
382

383 384 385 386 387 388 389 390
/* Explicitly choose LSM initialization order. */
static int __init choose_lsm_order(char *str)
{
	chosen_lsm_order = str;
	return 1;
}
__setup("lsm=", choose_lsm_order);

391 392 393 394 395 396 397 398
/* Enable LSM order debugging. */
static int __init enable_debug(char *str)
{
	debug = true;
	return 1;
}
__setup("lsm.debug", enable_debug);

399 400 401 402 403 404 405 406 407 408 409 410 411 412 413
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);
}

M
Matthew Garrett 已提交
414
static int lsm_append(const char *new, char **result)
415 416 417 418 419
{
	char *cp;

	if (*result == NULL) {
		*result = kstrdup(new, GFP_KERNEL);
420 421
		if (*result == NULL)
			return -ENOMEM;
422
	} else {
423 424 425
		/* Check if it is the last registered name */
		if (match_last_lsm(*result, new))
			return 0;
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
		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;
450
		hlist_add_tail_rcu(&hooks[i].list, hooks[i].head);
451
	}
M
Matthew Garrett 已提交
452 453 454 455 456 457 458 459 460

	/*
	 * Don't try to append during early_security_init(), we'll come back
	 * and fix this up afterwards.
	 */
	if (slab_is_available()) {
		if (lsm_append(lsm, &lsm_names) < 0)
			panic("%s - Cannot get early memory.\n", __func__);
	}
461 462
}

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
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);

481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
/**
 * 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
 *
507
 * Allocate the cred blob for all the modules
508
 */
509
static void __init lsm_early_cred(struct cred *cred)
510
{
511
	int rc = lsm_cred_alloc(cred, GFP_KERNEL);
512 513 514 515 516

	if (rc)
		panic("%s: Early cred alloc failed.\n", __func__);
}

517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
/**
 * 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;
}

538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
/**
 * lsm_inode_alloc - allocate a composite inode blob
 * @inode: the inode that needs a blob
 *
 * Allocate the inode blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
int lsm_inode_alloc(struct inode *inode)
{
	if (!lsm_inode_cache) {
		inode->i_security = NULL;
		return 0;
	}

	inode->i_security = kmem_cache_zalloc(lsm_inode_cache, GFP_NOFS);
	if (inode->i_security == NULL)
		return -ENOMEM;
	return 0;
}

559 560 561 562 563 564 565 566
/**
 * lsm_task_alloc - allocate a composite task blob
 * @task: the task that needs a blob
 *
 * Allocate the task blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
W
Wei Yongjun 已提交
567
static int lsm_task_alloc(struct task_struct *task)
568 569 570 571 572 573 574 575 576 577 578 579
{
	if (blob_sizes.lbs_task == 0) {
		task->security = NULL;
		return 0;
	}

	task->security = kzalloc(blob_sizes.lbs_task, GFP_KERNEL);
	if (task->security == NULL)
		return -ENOMEM;
	return 0;
}

580 581 582 583 584 585 586 587
/**
 * lsm_ipc_alloc - allocate a composite ipc blob
 * @kip: the ipc that needs a blob
 *
 * Allocate the ipc blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
W
Wei Yongjun 已提交
588
static int lsm_ipc_alloc(struct kern_ipc_perm *kip)
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608
{
	if (blob_sizes.lbs_ipc == 0) {
		kip->security = NULL;
		return 0;
	}

	kip->security = kzalloc(blob_sizes.lbs_ipc, GFP_KERNEL);
	if (kip->security == NULL)
		return -ENOMEM;
	return 0;
}

/**
 * lsm_msg_msg_alloc - allocate a composite msg_msg blob
 * @mp: the msg_msg that needs a blob
 *
 * Allocate the ipc blob for all the modules
 *
 * Returns 0, or -ENOMEM if memory can't be allocated.
 */
W
Wei Yongjun 已提交
609
static int lsm_msg_msg_alloc(struct msg_msg *mp)
610 611 612 613 614 615 616 617 618 619 620 621
{
	if (blob_sizes.lbs_msg_msg == 0) {
		mp->security = NULL;
		return 0;
	}

	mp->security = kzalloc(blob_sizes.lbs_msg_msg, GFP_KERNEL);
	if (mp->security == NULL)
		return -ENOMEM;
	return 0;
}

622 623 624 625
/**
 * lsm_early_task - during initialization allocate a composite task blob
 * @task: the task that needs a blob
 *
626
 * Allocate the task blob for all the modules
627
 */
628
static void __init lsm_early_task(struct task_struct *task)
629
{
630
	int rc = lsm_task_alloc(task);
631 632 633 634 635

	if (rc)
		panic("%s: Early task alloc failed.\n", __func__);
}

636
/*
C
Casey Schaufler 已提交
637
 * Hook list operation macros.
L
Linus Torvalds 已提交
638
 *
639 640
 * call_void_hook:
 *	This is a hook that does not return a value.
L
Linus Torvalds 已提交
641
 *
642 643
 * call_int_hook:
 *	This is a hook that returns a value.
L
Linus Torvalds 已提交
644 645
 */

C
Casey Schaufler 已提交
646 647 648 649
#define call_void_hook(FUNC, ...)				\
	do {							\
		struct security_hook_list *P;			\
								\
650
		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) \
C
Casey Schaufler 已提交
651 652 653 654 655 656 657 658
			P->hook.FUNC(__VA_ARGS__);		\
	} while (0)

#define call_int_hook(FUNC, IRC, ...) ({			\
	int RC = IRC;						\
	do {							\
		struct security_hook_list *P;			\
								\
659
		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) { \
C
Casey Schaufler 已提交
660 661 662 663 664 665 666
			RC = P->hook.FUNC(__VA_ARGS__);		\
			if (RC != 0)				\
				break;				\
		}						\
	} while (0);						\
	RC;							\
})
L
Linus Torvalds 已提交
667

668 669
/* Security operations */

670 671
int security_binder_set_context_mgr(struct task_struct *mgr)
{
672
	return call_int_hook(binder_set_context_mgr, 0, mgr);
673 674 675 676 677
}

int security_binder_transaction(struct task_struct *from,
				struct task_struct *to)
{
678
	return call_int_hook(binder_transaction, 0, from, to);
679 680 681 682 683
}

int security_binder_transfer_binder(struct task_struct *from,
				    struct task_struct *to)
{
684
	return call_int_hook(binder_transfer_binder, 0, from, to);
685 686 687 688 689
}

int security_binder_transfer_file(struct task_struct *from,
				  struct task_struct *to, struct file *file)
{
690
	return call_int_hook(binder_transfer_file, 0, from, to, file);
691 692
}

693
int security_ptrace_access_check(struct task_struct *child, unsigned int mode)
694
{
695
	return call_int_hook(ptrace_access_check, 0, child, mode);
696 697 698 699
}

int security_ptrace_traceme(struct task_struct *parent)
{
700
	return call_int_hook(ptrace_traceme, 0, parent);
701 702 703 704 705 706 707
}

int security_capget(struct task_struct *target,
		     kernel_cap_t *effective,
		     kernel_cap_t *inheritable,
		     kernel_cap_t *permitted)
{
708 709
	return call_int_hook(capget, 0, target,
				effective, inheritable, permitted);
710 711
}

D
David Howells 已提交
712 713 714 715
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)
716
{
717 718
	return call_int_hook(capset, 0, new, old,
				effective, inheritable, permitted);
719 720
}

721 722 723 724
int security_capable(const struct cred *cred,
		     struct user_namespace *ns,
		     int cap,
		     unsigned int opts)
725
{
726
	return call_int_hook(capable, 0, cred, ns, cap, opts);
727 728 729 730
}

int security_quotactl(int cmds, int type, int id, struct super_block *sb)
{
731
	return call_int_hook(quotactl, 0, cmds, type, id, sb);
732 733 734 735
}

int security_quota_on(struct dentry *dentry)
{
736
	return call_int_hook(quota_on, 0, dentry);
737 738
}

739
int security_syslog(int type)
740
{
741
	return call_int_hook(syslog, 0, type);
742 743
}

744
int security_settime64(const struct timespec64 *ts, const struct timezone *tz)
745
{
746
	return call_int_hook(settime, 0, ts, tz);
747 748 749 750
}

int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
{
C
Casey Schaufler 已提交
751 752 753 754 755 756 757 758 759 760 761
	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.
	 */
762
	hlist_for_each_entry(hp, &security_hook_heads.vm_enough_memory, list) {
C
Casey Schaufler 已提交
763 764 765 766 767 768 769
		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);
770 771
}

772
int security_bprm_set_creds(struct linux_binprm *bprm)
773
{
774
	return call_int_hook(bprm_set_creds, 0, bprm);
775 776
}

777
int security_bprm_check(struct linux_binprm *bprm)
778
{
779 780
	int ret;

781
	ret = call_int_hook(bprm_check_security, 0, bprm);
782 783 784
	if (ret)
		return ret;
	return ima_bprm_check(bprm);
785 786
}

787
void security_bprm_committing_creds(struct linux_binprm *bprm)
788
{
789
	call_void_hook(bprm_committing_creds, bprm);
790 791
}

792
void security_bprm_committed_creds(struct linux_binprm *bprm)
793
{
794
	call_void_hook(bprm_committed_creds, bprm);
795 796
}

A
Al Viro 已提交
797 798 799 800 801
int security_fs_context_dup(struct fs_context *fc, struct fs_context *src_fc)
{
	return call_int_hook(fs_context_dup, 0, fc, src_fc);
}

802 803 804 805 806
int security_fs_context_parse_param(struct fs_context *fc, struct fs_parameter *param)
{
	return call_int_hook(fs_context_parse_param, -ENOPARAM, fc, param);
}

807 808
int security_sb_alloc(struct super_block *sb)
{
809
	return call_int_hook(sb_alloc_security, 0, sb);
810 811 812 813
}

void security_sb_free(struct super_block *sb)
{
814
	call_void_hook(sb_free_security, sb);
815 816
}

817
void security_free_mnt_opts(void **mnt_opts)
818
{
819 820 821 822
	if (!*mnt_opts)
		return;
	call_void_hook(sb_free_mnt_opts, *mnt_opts);
	*mnt_opts = NULL;
823
}
824
EXPORT_SYMBOL(security_free_mnt_opts);
825

826
int security_sb_eat_lsm_opts(char *options, void **mnt_opts)
827
{
828
	return call_int_hook(sb_eat_lsm_opts, 0, options, mnt_opts);
829
}
A
Al Viro 已提交
830
EXPORT_SYMBOL(security_sb_eat_lsm_opts);
831

832
int security_sb_remount(struct super_block *sb,
833
			void *mnt_opts)
834
{
835
	return call_int_hook(sb_remount, 0, sb, mnt_opts);
836
}
A
Al Viro 已提交
837
EXPORT_SYMBOL(security_sb_remount);
838

839
int security_sb_kern_mount(struct super_block *sb)
840
{
841
	return call_int_hook(sb_kern_mount, 0, sb);
842 843
}

844 845
int security_sb_show_options(struct seq_file *m, struct super_block *sb)
{
846
	return call_int_hook(sb_show_options, 0, m, sb);
847 848
}

849 850
int security_sb_statfs(struct dentry *dentry)
{
851
	return call_int_hook(sb_statfs, 0, dentry);
852 853
}

A
Al Viro 已提交
854
int security_sb_mount(const char *dev_name, const struct path *path,
A
Al Viro 已提交
855
                       const char *type, unsigned long flags, void *data)
856
{
857
	return call_int_hook(sb_mount, 0, dev_name, path, type, flags, data);
858 859 860 861
}

int security_sb_umount(struct vfsmount *mnt, int flags)
{
862
	return call_int_hook(sb_umount, 0, mnt, flags);
863 864
}

A
Al Viro 已提交
865
int security_sb_pivotroot(const struct path *old_path, const struct path *new_path)
866
{
867
	return call_int_hook(sb_pivotroot, 0, old_path, new_path);
868 869
}

870
int security_sb_set_mnt_opts(struct super_block *sb,
871
				void *mnt_opts,
872 873
				unsigned long kern_flags,
				unsigned long *set_kern_flags)
874
{
C
Casey Schaufler 已提交
875
	return call_int_hook(sb_set_mnt_opts,
876 877
				mnt_opts ? -EOPNOTSUPP : 0, sb,
				mnt_opts, kern_flags, set_kern_flags);
878
}
879
EXPORT_SYMBOL(security_sb_set_mnt_opts);
880

881
int security_sb_clone_mnt_opts(const struct super_block *oldsb,
882 883 884
				struct super_block *newsb,
				unsigned long kern_flags,
				unsigned long *set_kern_flags)
885
{
886 887
	return call_int_hook(sb_clone_mnt_opts, 0, oldsb, newsb,
				kern_flags, set_kern_flags);
888
}
889 890
EXPORT_SYMBOL(security_sb_clone_mnt_opts);

A
Al Viro 已提交
891 892
int security_add_mnt_opt(const char *option, const char *val, int len,
			 void **mnt_opts)
893
{
A
Al Viro 已提交
894 895
	return call_int_hook(sb_add_mnt_opt, -EINVAL,
					option, val, len, mnt_opts);
896
}
A
Al Viro 已提交
897
EXPORT_SYMBOL(security_add_mnt_opt);
898

899 900 901 902 903
int security_move_mount(const struct path *from_path, const struct path *to_path)
{
	return call_int_hook(move_mount, 0, from_path, to_path);
}

904 905
int security_inode_alloc(struct inode *inode)
{
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
	int rc = lsm_inode_alloc(inode);

	if (unlikely(rc))
		return rc;
	rc = call_int_hook(inode_alloc_security, 0, inode);
	if (unlikely(rc))
		security_inode_free(inode);
	return rc;
}

static void inode_free_by_rcu(struct rcu_head *head)
{
	/*
	 * The rcu head is at the start of the inode blob
	 */
	kmem_cache_free(lsm_inode_cache, head);
922 923 924 925
}

void security_inode_free(struct inode *inode)
{
926
	integrity_inode_free(inode);
927
	call_void_hook(inode_free_security, inode);
928 929 930 931 932 933 934 935 936 937 938 939
	/*
	 * The inode may still be referenced in a path walk and
	 * a call to security_inode_permission() can be made
	 * after inode_free_security() is called. Ideally, the VFS
	 * wouldn't do this, but fixing that is a much harder
	 * job. For now, simply free the i_security via RCU, and
	 * leave the current inode->i_security pointer intact.
	 * The inode will be freed after the RCU grace period too.
	 */
	if (inode->i_security)
		call_rcu((struct rcu_head *)inode->i_security,
				inode_free_by_rcu);
940 941
}

942
int security_dentry_init_security(struct dentry *dentry, int mode,
A
Al Viro 已提交
943
					const struct qstr *name, void **ctx,
944 945
					u32 *ctxlen)
{
C
Casey Schaufler 已提交
946 947
	return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
				name, ctx, ctxlen);
948 949 950
}
EXPORT_SYMBOL(security_dentry_init_security);

951 952 953 954 955 956 957 958 959
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);

960
int security_inode_init_security(struct inode *inode, struct inode *dir,
961 962
				 const struct qstr *qstr,
				 const initxattrs initxattrs, void *fs_data)
963
{
964 965
	struct xattr new_xattrs[MAX_LSM_EVM_XATTR + 1];
	struct xattr *lsm_xattr, *evm_xattr, *xattr;
966 967
	int ret;

968
	if (unlikely(IS_PRIVATE(inode)))
969
		return 0;
970 971

	if (!initxattrs)
972 973
		return call_int_hook(inode_init_security, -EOPNOTSUPP, inode,
				     dir, qstr, NULL, NULL, NULL);
974
	memset(new_xattrs, 0, sizeof(new_xattrs));
975
	lsm_xattr = new_xattrs;
C
Casey Schaufler 已提交
976
	ret = call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir, qstr,
977 978 979 980 981
						&lsm_xattr->name,
						&lsm_xattr->value,
						&lsm_xattr->value_len);
	if (ret)
		goto out;
982 983 984 985 986

	evm_xattr = lsm_xattr + 1;
	ret = evm_inode_init_security(inode, lsm_xattr, evm_xattr);
	if (ret)
		goto out;
987 988
	ret = initxattrs(inode, new_xattrs, fs_data);
out:
989
	for (xattr = new_xattrs; xattr->value != NULL; xattr++)
990
		kfree(xattr->value);
991 992 993 994 995
	return (ret == -EOPNOTSUPP) ? 0 : ret;
}
EXPORT_SYMBOL(security_inode_init_security);

int security_old_inode_init_security(struct inode *inode, struct inode *dir,
996
				     const struct qstr *qstr, const char **name,
997
				     void **value, size_t *len)
998 999
{
	if (unlikely(IS_PRIVATE(inode)))
1000
		return -EOPNOTSUPP;
1001 1002
	return call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir,
			     qstr, name, value, len);
1003
}
1004
EXPORT_SYMBOL(security_old_inode_init_security);
1005

1006
#ifdef CONFIG_SECURITY_PATH
1007
int security_path_mknod(const struct path *dir, struct dentry *dentry, umode_t mode,
1008 1009
			unsigned int dev)
{
1010
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
1011
		return 0;
1012
	return call_int_hook(path_mknod, 0, dir, dentry, mode, dev);
1013 1014 1015
}
EXPORT_SYMBOL(security_path_mknod);

1016
int security_path_mkdir(const struct path *dir, struct dentry *dentry, umode_t mode)
1017
{
1018
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
1019
		return 0;
1020
	return call_int_hook(path_mkdir, 0, dir, dentry, mode);
1021
}
1022
EXPORT_SYMBOL(security_path_mkdir);
1023

A
Al Viro 已提交
1024
int security_path_rmdir(const struct path *dir, struct dentry *dentry)
1025
{
1026
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
1027
		return 0;
1028
	return call_int_hook(path_rmdir, 0, dir, dentry);
1029 1030
}

A
Al Viro 已提交
1031
int security_path_unlink(const struct path *dir, struct dentry *dentry)
1032
{
1033
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
1034
		return 0;
1035
	return call_int_hook(path_unlink, 0, dir, dentry);
1036
}
1037
EXPORT_SYMBOL(security_path_unlink);
1038

1039
int security_path_symlink(const struct path *dir, struct dentry *dentry,
1040 1041
			  const char *old_name)
{
1042
	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
1043
		return 0;
1044
	return call_int_hook(path_symlink, 0, dir, dentry, old_name);
1045 1046
}

A
Al Viro 已提交
1047
int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
1048 1049
		       struct dentry *new_dentry)
{
1050
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
1051
		return 0;
1052
	return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
1053 1054
}

A
Al Viro 已提交
1055 1056
int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
			 const struct path *new_dir, struct dentry *new_dentry,
1057
			 unsigned int flags)
1058
{
1059 1060
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
		     (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
1061
		return 0;
M
Miklos Szeredi 已提交
1062 1063

	if (flags & RENAME_EXCHANGE) {
1064 1065
		int err = call_int_hook(path_rename, 0, new_dir, new_dentry,
					old_dir, old_dentry);
M
Miklos Szeredi 已提交
1066 1067 1068 1069
		if (err)
			return err;
	}

1070 1071
	return call_int_hook(path_rename, 0, old_dir, old_dentry, new_dir,
				new_dentry);
1072
}
1073
EXPORT_SYMBOL(security_path_rename);
1074

A
Al Viro 已提交
1075
int security_path_truncate(const struct path *path)
1076
{
1077
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
1078
		return 0;
1079
	return call_int_hook(path_truncate, 0, path);
1080
}
1081

1082
int security_path_chmod(const struct path *path, umode_t mode)
1083
{
1084
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
1085
		return 0;
1086
	return call_int_hook(path_chmod, 0, path, mode);
1087 1088
}

1089
int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
1090
{
1091
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
1092
		return 0;
1093
	return call_int_hook(path_chown, 0, path, uid, gid);
1094
}
T
Tetsuo Handa 已提交
1095

A
Al Viro 已提交
1096
int security_path_chroot(const struct path *path)
T
Tetsuo Handa 已提交
1097
{
1098
	return call_int_hook(path_chroot, 0, path);
T
Tetsuo Handa 已提交
1099
}
1100 1101
#endif

A
Al Viro 已提交
1102
int security_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
1103 1104 1105
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
1106
	return call_int_hook(inode_create, 0, dir, dentry, mode);
1107
}
1108
EXPORT_SYMBOL_GPL(security_inode_create);
1109 1110 1111 1112

int security_inode_link(struct dentry *old_dentry, struct inode *dir,
			 struct dentry *new_dentry)
{
1113
	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
1114
		return 0;
1115
	return call_int_hook(inode_link, 0, old_dentry, dir, new_dentry);
1116 1117 1118 1119
}

int security_inode_unlink(struct inode *dir, struct dentry *dentry)
{
1120
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1121
		return 0;
1122
	return call_int_hook(inode_unlink, 0, dir, dentry);
1123 1124 1125 1126 1127 1128 1129
}

int security_inode_symlink(struct inode *dir, struct dentry *dentry,
			    const char *old_name)
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
1130
	return call_int_hook(inode_symlink, 0, dir, dentry, old_name);
1131 1132
}

1133
int security_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1134 1135 1136
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
1137
	return call_int_hook(inode_mkdir, 0, dir, dentry, mode);
1138
}
1139
EXPORT_SYMBOL_GPL(security_inode_mkdir);
1140 1141 1142

int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
{
1143
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1144
		return 0;
1145
	return call_int_hook(inode_rmdir, 0, dir, dentry);
1146 1147
}

A
Al Viro 已提交
1148
int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
1149 1150 1151
{
	if (unlikely(IS_PRIVATE(dir)))
		return 0;
1152
	return call_int_hook(inode_mknod, 0, dir, dentry, mode, dev);
1153 1154 1155
}

int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
1156 1157
			   struct inode *new_dir, struct dentry *new_dentry,
			   unsigned int flags)
1158
{
1159 1160
        if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
            (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
1161
		return 0;
M
Miklos Szeredi 已提交
1162 1163

	if (flags & RENAME_EXCHANGE) {
1164
		int err = call_int_hook(inode_rename, 0, new_dir, new_dentry,
M
Miklos Szeredi 已提交
1165 1166 1167 1168 1169
						     old_dir, old_dentry);
		if (err)
			return err;
	}

1170
	return call_int_hook(inode_rename, 0, old_dir, old_dentry,
1171 1172 1173 1174 1175
					   new_dir, new_dentry);
}

int security_inode_readlink(struct dentry *dentry)
{
1176
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1177
		return 0;
1178
	return call_int_hook(inode_readlink, 0, dentry);
1179 1180
}

1181 1182
int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
			       bool rcu)
1183
{
1184
	if (unlikely(IS_PRIVATE(inode)))
1185
		return 0;
1186
	return call_int_hook(inode_follow_link, 0, dentry, inode, rcu);
1187 1188
}

1189
int security_inode_permission(struct inode *inode, int mask)
1190 1191 1192
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
1193
	return call_int_hook(inode_permission, 0, inode, mask);
1194 1195 1196 1197
}

int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
{
1198 1199
	int ret;

1200
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1201
		return 0;
1202
	ret = call_int_hook(inode_setattr, 0, dentry, attr);
1203 1204 1205
	if (ret)
		return ret;
	return evm_inode_setattr(dentry, attr);
1206
}
1207
EXPORT_SYMBOL_GPL(security_inode_setattr);
1208

1209
int security_inode_getattr(const struct path *path)
1210
{
1211
	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
1212
		return 0;
1213
	return call_int_hook(inode_getattr, 0, path);
1214 1215
}

1216 1217
int security_inode_setxattr(struct dentry *dentry, const char *name,
			    const void *value, size_t size, int flags)
1218
{
1219 1220
	int ret;

1221
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1222
		return 0;
C
Casey Schaufler 已提交
1223 1224 1225 1226 1227
	/*
	 * 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,
1228
				flags);
C
Casey Schaufler 已提交
1229 1230 1231

	if (ret == 1)
		ret = cap_inode_setxattr(dentry, name, value, size, flags);
1232 1233 1234
	if (ret)
		return ret;
	ret = ima_inode_setxattr(dentry, name, value, size);
1235 1236 1237
	if (ret)
		return ret;
	return evm_inode_setxattr(dentry, name, value, size);
1238 1239
}

1240 1241
void security_inode_post_setxattr(struct dentry *dentry, const char *name,
				  const void *value, size_t size, int flags)
1242
{
1243
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1244
		return;
1245
	call_void_hook(inode_post_setxattr, dentry, name, value, size, flags);
1246
	evm_inode_post_setxattr(dentry, name, value, size);
1247 1248
}

1249
int security_inode_getxattr(struct dentry *dentry, const char *name)
1250
{
1251
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1252
		return 0;
1253
	return call_int_hook(inode_getxattr, 0, dentry, name);
1254 1255 1256 1257
}

int security_inode_listxattr(struct dentry *dentry)
{
1258
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1259
		return 0;
1260
	return call_int_hook(inode_listxattr, 0, dentry);
1261 1262
}

1263
int security_inode_removexattr(struct dentry *dentry, const char *name)
1264
{
1265 1266
	int ret;

1267
	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
1268
		return 0;
C
Casey Schaufler 已提交
1269 1270 1271 1272 1273 1274 1275
	/*
	 * 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);
1276 1277 1278
	if (ret)
		return ret;
	ret = ima_inode_removexattr(dentry, name);
1279 1280 1281
	if (ret)
		return ret;
	return evm_inode_removexattr(dentry, name);
1282 1283
}

1284 1285
int security_inode_need_killpriv(struct dentry *dentry)
{
1286
	return call_int_hook(inode_need_killpriv, 0, dentry);
1287 1288 1289 1290
}

int security_inode_killpriv(struct dentry *dentry)
{
1291
	return call_int_hook(inode_killpriv, 0, dentry);
1292 1293
}

1294
int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
1295
{
1296 1297 1298
	struct security_hook_list *hp;
	int rc;

1299
	if (unlikely(IS_PRIVATE(inode)))
1300
		return -EOPNOTSUPP;
1301 1302 1303
	/*
	 * Only one module will provide an attribute with a given name.
	 */
1304
	hlist_for_each_entry(hp, &security_hook_heads.inode_getsecurity, list) {
1305 1306 1307 1308 1309
		rc = hp->hook.inode_getsecurity(inode, name, buffer, alloc);
		if (rc != -EOPNOTSUPP)
			return rc;
	}
	return -EOPNOTSUPP;
1310 1311 1312 1313
}

int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
{
1314 1315 1316
	struct security_hook_list *hp;
	int rc;

1317
	if (unlikely(IS_PRIVATE(inode)))
1318
		return -EOPNOTSUPP;
1319 1320 1321
	/*
	 * Only one module will provide an attribute with a given name.
	 */
1322
	hlist_for_each_entry(hp, &security_hook_heads.inode_setsecurity, list) {
1323 1324 1325 1326 1327 1328
		rc = hp->hook.inode_setsecurity(inode, name, value, size,
								flags);
		if (rc != -EOPNOTSUPP)
			return rc;
	}
	return -EOPNOTSUPP;
1329 1330 1331 1332 1333 1334
}

int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
{
	if (unlikely(IS_PRIVATE(inode)))
		return 0;
1335
	return call_int_hook(inode_listsecurity, 0, inode, buffer, buffer_size);
1336
}
1337
EXPORT_SYMBOL(security_inode_listsecurity);
1338

1339
void security_inode_getsecid(struct inode *inode, u32 *secid)
1340
{
1341
	call_void_hook(inode_getsecid, inode, secid);
1342 1343
}

1344 1345 1346 1347 1348 1349
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);

1350 1351 1352 1353 1354 1355
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);

1356 1357 1358 1359 1360 1361
int security_kernfs_init_security(struct kernfs_node *kn_dir,
				  struct kernfs_node *kn)
{
	return call_int_hook(kernfs_init_security, 0, kn_dir, kn);
}

1362 1363
int security_file_permission(struct file *file, int mask)
{
1364 1365
	int ret;

1366
	ret = call_int_hook(file_permission, 0, file, mask);
1367 1368 1369 1370
	if (ret)
		return ret;

	return fsnotify_perm(file, mask);
1371 1372 1373 1374
}

int security_file_alloc(struct file *file)
{
1375 1376 1377 1378 1379 1380 1381 1382
	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;
1383 1384 1385 1386
}

void security_file_free(struct file *file)
{
1387 1388
	void *blob;

1389
	call_void_hook(file_free_security, file);
1390 1391 1392 1393 1394 1395

	blob = file->f_security;
	if (blob) {
		file->f_security = NULL;
		kmem_cache_free(lsm_file_cache, blob);
	}
1396 1397 1398 1399
}

int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
1400
	return call_int_hook(file_ioctl, 0, file, cmd, arg);
1401 1402
}

1403
static inline unsigned long mmap_prot(struct file *file, unsigned long prot)
1404
{
1405
	/*
1406 1407
	 * Does we have PROT_READ and does the application expect
	 * it to imply PROT_EXEC?  If not, nothing to talk about...
1408
	 */
1409 1410
	if ((prot & (PROT_READ | PROT_EXEC)) != PROT_READ)
		return prot;
1411
	if (!(current->personality & READ_IMPLIES_EXEC))
1412 1413 1414 1415 1416 1417 1418 1419
		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
1420
	 * NOMMU_MAP_EXEC (== VM_MAYEXEC) in this case
1421
	 */
1422
	if (!path_noexec(&file->f_path)) {
1423
#ifndef CONFIG_MMU
1424 1425 1426 1427 1428
		if (file->f_op->mmap_capabilities) {
			unsigned caps = file->f_op->mmap_capabilities(file);
			if (!(caps & NOMMU_MAP_EXEC))
				return prot;
		}
1429
#endif
1430
		return prot | PROT_EXEC;
1431
	}
1432 1433 1434 1435 1436 1437 1438 1439
	/* 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;
1440
	ret = call_int_hook(mmap_file, 0, file, prot,
1441
					mmap_prot(file, prot), flags);
1442 1443 1444
	if (ret)
		return ret;
	return ima_file_mmap(file, prot);
1445 1446
}

1447 1448
int security_mmap_addr(unsigned long addr)
{
1449
	return call_int_hook(mmap_addr, 0, addr);
1450 1451
}

1452 1453 1454
int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot,
			    unsigned long prot)
{
1455
	return call_int_hook(file_mprotect, 0, vma, reqprot, prot);
1456 1457 1458 1459
}

int security_file_lock(struct file *file, unsigned int cmd)
{
1460
	return call_int_hook(file_lock, 0, file, cmd);
1461 1462 1463 1464
}

int security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
{
1465
	return call_int_hook(file_fcntl, 0, file, cmd, arg);
1466 1467
}

1468
void security_file_set_fowner(struct file *file)
1469
{
1470
	call_void_hook(file_set_fowner, file);
1471 1472 1473 1474 1475
}

int security_file_send_sigiotask(struct task_struct *tsk,
				  struct fown_struct *fown, int sig)
{
1476
	return call_int_hook(file_send_sigiotask, 0, tsk, fown, sig);
1477 1478 1479 1480
}

int security_file_receive(struct file *file)
{
1481
	return call_int_hook(file_receive, 0, file);
1482 1483
}

1484
int security_file_open(struct file *file)
1485
{
1486 1487
	int ret;

A
Al Viro 已提交
1488
	ret = call_int_hook(file_open, 0, file);
1489 1490 1491 1492
	if (ret)
		return ret;

	return fsnotify_perm(file, MAY_OPEN);
1493 1494
}

1495 1496
int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
{
1497 1498 1499 1500 1501 1502 1503 1504
	int rc = lsm_task_alloc(task);

	if (rc)
		return rc;
	rc = call_int_hook(task_alloc, 0, task, clone_flags);
	if (unlikely(rc))
		security_task_free(task);
	return rc;
1505 1506
}

1507 1508
void security_task_free(struct task_struct *task)
{
1509
	call_void_hook(task_free, task);
1510 1511 1512

	kfree(task->security);
	task->security = NULL;
1513 1514
}

1515 1516
int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
{
1517 1518 1519 1520 1521 1522
	int rc = lsm_cred_alloc(cred, gfp);

	if (rc)
		return rc;

	rc = call_int_hook(cred_alloc_blank, 0, cred, gfp);
1523
	if (unlikely(rc))
1524 1525
		security_cred_free(cred);
	return rc;
1526 1527
}

D
David Howells 已提交
1528
void security_cred_free(struct cred *cred)
1529
{
1530 1531 1532 1533 1534 1535 1536
	/*
	 * There is a failure case in prepare_creds() that
	 * may result in a call here with ->security being NULL.
	 */
	if (unlikely(cred->security == NULL))
		return;

1537
	call_void_hook(cred_free, cred);
1538 1539 1540

	kfree(cred->security);
	cred->security = NULL;
1541 1542
}

D
David Howells 已提交
1543
int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp)
1544
{
1545 1546 1547 1548 1549 1550
	int rc = lsm_cred_alloc(new, gfp);

	if (rc)
		return rc;

	rc = call_int_hook(cred_prepare, 0, new, old, gfp);
1551
	if (unlikely(rc))
1552 1553
		security_cred_free(new);
	return rc;
D
David Howells 已提交
1554 1555
}

1556 1557
void security_transfer_creds(struct cred *new, const struct cred *old)
{
1558
	call_void_hook(cred_transfer, new, old);
1559 1560
}

1561 1562 1563 1564 1565 1566 1567
void security_cred_getsecid(const struct cred *c, u32 *secid)
{
	*secid = 0;
	call_void_hook(cred_getsecid, c, secid);
}
EXPORT_SYMBOL(security_cred_getsecid);

1568 1569
int security_kernel_act_as(struct cred *new, u32 secid)
{
1570
	return call_int_hook(kernel_act_as, 0, new, secid);
1571 1572 1573 1574
}

int security_kernel_create_files_as(struct cred *new, struct inode *inode)
{
1575
	return call_int_hook(kernel_create_files_as, 0, new, inode);
1576 1577
}

1578
int security_kernel_module_request(char *kmod_name)
1579
{
1580 1581 1582 1583 1584 1585
	int ret;

	ret = call_int_hook(kernel_module_request, 0, kmod_name);
	if (ret)
		return ret;
	return integrity_kernel_module_request(kmod_name);
1586 1587
}

1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
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);

1599 1600
int security_kernel_post_read_file(struct file *file, char *buf, loff_t size,
				   enum kernel_read_file_id id)
1601
{
1602 1603 1604 1605 1606 1607
	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);
1608 1609 1610
}
EXPORT_SYMBOL_GPL(security_kernel_post_read_file);

1611 1612
int security_kernel_load_data(enum kernel_load_data_id id)
{
1613 1614 1615 1616 1617 1618
	int ret;

	ret = call_int_hook(kernel_load_data, 0, id);
	if (ret)
		return ret;
	return ima_load_data(id);
1619
}
1620
EXPORT_SYMBOL_GPL(security_kernel_load_data);
1621

D
David Howells 已提交
1622 1623
int security_task_fix_setuid(struct cred *new, const struct cred *old,
			     int flags)
1624
{
1625
	return call_int_hook(task_fix_setuid, 0, new, old, flags);
1626 1627 1628 1629
}

int security_task_setpgid(struct task_struct *p, pid_t pgid)
{
1630
	return call_int_hook(task_setpgid, 0, p, pgid);
1631 1632 1633 1634
}

int security_task_getpgid(struct task_struct *p)
{
1635
	return call_int_hook(task_getpgid, 0, p);
1636 1637 1638 1639
}

int security_task_getsid(struct task_struct *p)
{
1640
	return call_int_hook(task_getsid, 0, p);
1641 1642 1643 1644
}

void security_task_getsecid(struct task_struct *p, u32 *secid)
{
C
Casey Schaufler 已提交
1645
	*secid = 0;
1646
	call_void_hook(task_getsecid, p, secid);
1647 1648 1649 1650 1651
}
EXPORT_SYMBOL(security_task_getsecid);

int security_task_setnice(struct task_struct *p, int nice)
{
1652
	return call_int_hook(task_setnice, 0, p, nice);
1653 1654 1655 1656
}

int security_task_setioprio(struct task_struct *p, int ioprio)
{
1657
	return call_int_hook(task_setioprio, 0, p, ioprio);
1658 1659 1660 1661
}

int security_task_getioprio(struct task_struct *p)
{
1662
	return call_int_hook(task_getioprio, 0, p);
1663 1664
}

1665 1666 1667 1668 1669 1670
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);
}

1671 1672
int security_task_setrlimit(struct task_struct *p, unsigned int resource,
		struct rlimit *new_rlim)
1673
{
1674
	return call_int_hook(task_setrlimit, 0, p, resource, new_rlim);
1675 1676
}

1677
int security_task_setscheduler(struct task_struct *p)
1678
{
1679
	return call_int_hook(task_setscheduler, 0, p);
1680 1681 1682 1683
}

int security_task_getscheduler(struct task_struct *p)
{
1684
	return call_int_hook(task_getscheduler, 0, p);
1685 1686 1687 1688
}

int security_task_movememory(struct task_struct *p)
{
1689
	return call_int_hook(task_movememory, 0, p);
1690 1691
}

1692
int security_task_kill(struct task_struct *p, struct kernel_siginfo *info,
1693
			int sig, const struct cred *cred)
1694
{
1695
	return call_int_hook(task_kill, 0, p, info, sig, cred);
1696 1697 1698
}

int security_task_prctl(int option, unsigned long arg2, unsigned long arg3,
D
David Howells 已提交
1699
			 unsigned long arg4, unsigned long arg5)
1700
{
C
Casey Schaufler 已提交
1701 1702 1703 1704
	int thisrc;
	int rc = -ENOSYS;
	struct security_hook_list *hp;

1705
	hlist_for_each_entry(hp, &security_hook_heads.task_prctl, list) {
C
Casey Schaufler 已提交
1706 1707 1708 1709 1710 1711 1712 1713
		thisrc = hp->hook.task_prctl(option, arg2, arg3, arg4, arg5);
		if (thisrc != -ENOSYS) {
			rc = thisrc;
			if (thisrc != 0)
				break;
		}
	}
	return rc;
1714 1715 1716 1717
}

void security_task_to_inode(struct task_struct *p, struct inode *inode)
{
1718
	call_void_hook(task_to_inode, p, inode);
1719 1720 1721 1722
}

int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
{
1723
	return call_int_hook(ipc_permission, 0, ipcp, flag);
1724 1725
}

1726 1727
void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
{
C
Casey Schaufler 已提交
1728
	*secid = 0;
1729
	call_void_hook(ipc_getsecid, ipcp, secid);
1730 1731
}

1732 1733
int security_msg_msg_alloc(struct msg_msg *msg)
{
1734 1735 1736 1737 1738 1739 1740 1741
	int rc = lsm_msg_msg_alloc(msg);

	if (unlikely(rc))
		return rc;
	rc = call_int_hook(msg_msg_alloc_security, 0, msg);
	if (unlikely(rc))
		security_msg_msg_free(msg);
	return rc;
1742 1743 1744 1745
}

void security_msg_msg_free(struct msg_msg *msg)
{
1746
	call_void_hook(msg_msg_free_security, msg);
1747 1748
	kfree(msg->security);
	msg->security = NULL;
1749 1750
}

1751
int security_msg_queue_alloc(struct kern_ipc_perm *msq)
1752
{
1753 1754 1755 1756 1757 1758 1759 1760
	int rc = lsm_ipc_alloc(msq);

	if (unlikely(rc))
		return rc;
	rc = call_int_hook(msg_queue_alloc_security, 0, msq);
	if (unlikely(rc))
		security_msg_queue_free(msq);
	return rc;
1761 1762
}

1763
void security_msg_queue_free(struct kern_ipc_perm *msq)
1764
{
1765
	call_void_hook(msg_queue_free_security, msq);
1766 1767
	kfree(msq->security);
	msq->security = NULL;
1768 1769
}

1770
int security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
1771
{
1772
	return call_int_hook(msg_queue_associate, 0, msq, msqflg);
1773 1774
}

1775
int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
1776
{
1777
	return call_int_hook(msg_queue_msgctl, 0, msq, cmd);
1778 1779
}

1780
int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
1781 1782
			       struct msg_msg *msg, int msqflg)
{
1783
	return call_int_hook(msg_queue_msgsnd, 0, msq, msg, msqflg);
1784 1785
}

1786
int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
1787 1788
			       struct task_struct *target, long type, int mode)
{
1789
	return call_int_hook(msg_queue_msgrcv, 0, msq, msg, target, type, mode);
1790 1791
}

1792
int security_shm_alloc(struct kern_ipc_perm *shp)
1793
{
1794 1795 1796 1797 1798 1799 1800 1801
	int rc = lsm_ipc_alloc(shp);

	if (unlikely(rc))
		return rc;
	rc = call_int_hook(shm_alloc_security, 0, shp);
	if (unlikely(rc))
		security_shm_free(shp);
	return rc;
1802 1803
}

1804
void security_shm_free(struct kern_ipc_perm *shp)
1805
{
1806
	call_void_hook(shm_free_security, shp);
1807 1808
	kfree(shp->security);
	shp->security = NULL;
1809 1810
}

1811
int security_shm_associate(struct kern_ipc_perm *shp, int shmflg)
1812
{
1813
	return call_int_hook(shm_associate, 0, shp, shmflg);
1814 1815
}

1816
int security_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
1817
{
1818
	return call_int_hook(shm_shmctl, 0, shp, cmd);
1819 1820
}

1821
int security_shm_shmat(struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)
1822
{
1823
	return call_int_hook(shm_shmat, 0, shp, shmaddr, shmflg);
1824 1825
}

1826
int security_sem_alloc(struct kern_ipc_perm *sma)
1827
{
1828 1829 1830 1831 1832 1833 1834 1835
	int rc = lsm_ipc_alloc(sma);

	if (unlikely(rc))
		return rc;
	rc = call_int_hook(sem_alloc_security, 0, sma);
	if (unlikely(rc))
		security_sem_free(sma);
	return rc;
1836 1837
}

1838
void security_sem_free(struct kern_ipc_perm *sma)
1839
{
1840
	call_void_hook(sem_free_security, sma);
1841 1842
	kfree(sma->security);
	sma->security = NULL;
1843 1844
}

1845
int security_sem_associate(struct kern_ipc_perm *sma, int semflg)
1846
{
1847
	return call_int_hook(sem_associate, 0, sma, semflg);
1848 1849
}

1850
int security_sem_semctl(struct kern_ipc_perm *sma, int cmd)
1851
{
1852
	return call_int_hook(sem_semctl, 0, sma, cmd);
1853 1854
}

1855
int security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops,
1856 1857
			unsigned nsops, int alter)
{
1858
	return call_int_hook(sem_semop, 0, sma, sops, nsops, alter);
1859 1860 1861 1862 1863 1864
}

void security_d_instantiate(struct dentry *dentry, struct inode *inode)
{
	if (unlikely(inode && IS_PRIVATE(inode)))
		return;
1865
	call_void_hook(d_instantiate, dentry, inode);
1866 1867 1868
}
EXPORT_SYMBOL(security_d_instantiate);

1869 1870
int security_getprocattr(struct task_struct *p, const char *lsm, char *name,
				char **value)
1871
{
1872 1873 1874 1875 1876 1877 1878 1879
	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;
1880 1881
}

1882 1883
int security_setprocattr(const char *lsm, const char *name, void *value,
			 size_t size)
1884
{
1885 1886 1887 1888 1889 1890 1891 1892
	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;
1893 1894 1895 1896
}

int security_netlink_send(struct sock *sk, struct sk_buff *skb)
{
1897
	return call_int_hook(netlink_send, 0, sk, skb);
1898 1899
}

1900 1901
int security_ismaclabel(const char *name)
{
1902
	return call_int_hook(ismaclabel, 0, name);
1903 1904 1905
}
EXPORT_SYMBOL(security_ismaclabel);

1906 1907
int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
{
C
Casey Schaufler 已提交
1908 1909
	return call_int_hook(secid_to_secctx, -EOPNOTSUPP, secid, secdata,
				seclen);
1910 1911 1912
}
EXPORT_SYMBOL(security_secid_to_secctx);

1913
int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
1914
{
C
Casey Schaufler 已提交
1915
	*secid = 0;
1916
	return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid);
1917 1918 1919
}
EXPORT_SYMBOL(security_secctx_to_secid);

1920 1921
void security_release_secctx(char *secdata, u32 seclen)
{
1922
	call_void_hook(release_secctx, secdata, seclen);
1923 1924 1925
}
EXPORT_SYMBOL(security_release_secctx);

1926 1927 1928 1929 1930 1931
void security_inode_invalidate_secctx(struct inode *inode)
{
	call_void_hook(inode_invalidate_secctx, inode);
}
EXPORT_SYMBOL(security_inode_invalidate_secctx);

1932 1933
int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
{
1934
	return call_int_hook(inode_notifysecctx, 0, inode, ctx, ctxlen);
1935 1936 1937 1938 1939
}
EXPORT_SYMBOL(security_inode_notifysecctx);

int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
{
1940
	return call_int_hook(inode_setsecctx, 0, dentry, ctx, ctxlen);
1941 1942 1943 1944 1945
}
EXPORT_SYMBOL(security_inode_setsecctx);

int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
{
C
Casey Schaufler 已提交
1946
	return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen);
1947 1948 1949
}
EXPORT_SYMBOL(security_inode_getsecctx);

1950 1951
#ifdef CONFIG_SECURITY_NETWORK

1952
int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk)
1953
{
1954
	return call_int_hook(unix_stream_connect, 0, sock, other, newsk);
1955 1956 1957 1958 1959
}
EXPORT_SYMBOL(security_unix_stream_connect);

int security_unix_may_send(struct socket *sock,  struct socket *other)
{
1960
	return call_int_hook(unix_may_send, 0, sock, other);
1961 1962 1963 1964 1965
}
EXPORT_SYMBOL(security_unix_may_send);

int security_socket_create(int family, int type, int protocol, int kern)
{
1966
	return call_int_hook(socket_create, 0, family, type, protocol, kern);
1967 1968 1969 1970 1971
}

int security_socket_post_create(struct socket *sock, int family,
				int type, int protocol, int kern)
{
1972
	return call_int_hook(socket_post_create, 0, sock, family, type,
1973 1974 1975
						protocol, kern);
}

1976 1977 1978 1979 1980 1981
int security_socket_socketpair(struct socket *socka, struct socket *sockb)
{
	return call_int_hook(socket_socketpair, 0, socka, sockb);
}
EXPORT_SYMBOL(security_socket_socketpair);

1982 1983
int security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
{
1984
	return call_int_hook(socket_bind, 0, sock, address, addrlen);
1985 1986 1987 1988
}

int security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
{
1989
	return call_int_hook(socket_connect, 0, sock, address, addrlen);
1990 1991 1992 1993
}

int security_socket_listen(struct socket *sock, int backlog)
{
1994
	return call_int_hook(socket_listen, 0, sock, backlog);
1995 1996 1997 1998
}

int security_socket_accept(struct socket *sock, struct socket *newsock)
{
1999
	return call_int_hook(socket_accept, 0, sock, newsock);
2000 2001 2002 2003
}

int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)
{
2004
	return call_int_hook(socket_sendmsg, 0, sock, msg, size);
2005 2006 2007 2008 2009
}

int security_socket_recvmsg(struct socket *sock, struct msghdr *msg,
			    int size, int flags)
{
2010
	return call_int_hook(socket_recvmsg, 0, sock, msg, size, flags);
2011 2012 2013 2014
}

int security_socket_getsockname(struct socket *sock)
{
2015
	return call_int_hook(socket_getsockname, 0, sock);
2016 2017 2018 2019
}

int security_socket_getpeername(struct socket *sock)
{
2020
	return call_int_hook(socket_getpeername, 0, sock);
2021 2022 2023 2024
}

int security_socket_getsockopt(struct socket *sock, int level, int optname)
{
2025
	return call_int_hook(socket_getsockopt, 0, sock, level, optname);
2026 2027 2028 2029
}

int security_socket_setsockopt(struct socket *sock, int level, int optname)
{
2030
	return call_int_hook(socket_setsockopt, 0, sock, level, optname);
2031 2032 2033 2034
}

int security_socket_shutdown(struct socket *sock, int how)
{
2035
	return call_int_hook(socket_shutdown, 0, sock, how);
2036 2037 2038 2039
}

int security_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
{
2040
	return call_int_hook(socket_sock_rcv_skb, 0, sk, skb);
2041 2042 2043 2044 2045 2046
}
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 已提交
2047 2048
	return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock,
				optval, optlen, len);
2049 2050 2051 2052
}

int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
{
2053 2054
	return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock,
			     skb, secid);
2055 2056 2057 2058 2059
}
EXPORT_SYMBOL(security_socket_getpeersec_dgram);

int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
{
2060
	return call_int_hook(sk_alloc_security, 0, sk, family, priority);
2061 2062 2063 2064
}

void security_sk_free(struct sock *sk)
{
2065
	call_void_hook(sk_free_security, sk);
2066 2067 2068 2069
}

void security_sk_clone(const struct sock *sk, struct sock *newsk)
{
2070
	call_void_hook(sk_clone_security, sk, newsk);
2071
}
2072
EXPORT_SYMBOL(security_sk_clone);
2073 2074 2075

void security_sk_classify_flow(struct sock *sk, struct flowi *fl)
{
2076
	call_void_hook(sk_getsecid, sk, &fl->flowi_secid);
2077 2078 2079 2080 2081
}
EXPORT_SYMBOL(security_sk_classify_flow);

void security_req_classify_flow(const struct request_sock *req, struct flowi *fl)
{
2082
	call_void_hook(req_classify_flow, req, fl);
2083 2084 2085 2086 2087
}
EXPORT_SYMBOL(security_req_classify_flow);

void security_sock_graft(struct sock *sk, struct socket *parent)
{
2088
	call_void_hook(sock_graft, sk, parent);
2089 2090 2091 2092 2093 2094
}
EXPORT_SYMBOL(security_sock_graft);

int security_inet_conn_request(struct sock *sk,
			struct sk_buff *skb, struct request_sock *req)
{
2095
	return call_int_hook(inet_conn_request, 0, sk, skb, req);
2096 2097 2098 2099 2100 2101
}
EXPORT_SYMBOL(security_inet_conn_request);

void security_inet_csk_clone(struct sock *newsk,
			const struct request_sock *req)
{
2102
	call_void_hook(inet_csk_clone, newsk, req);
2103 2104 2105 2106 2107
}

void security_inet_conn_established(struct sock *sk,
			struct sk_buff *skb)
{
2108
	call_void_hook(inet_conn_established, sk, skb);
2109
}
2110
EXPORT_SYMBOL(security_inet_conn_established);
2111

2112 2113
int security_secmark_relabel_packet(u32 secid)
{
2114
	return call_int_hook(secmark_relabel_packet, 0, secid);
2115 2116 2117 2118 2119
}
EXPORT_SYMBOL(security_secmark_relabel_packet);

void security_secmark_refcount_inc(void)
{
2120
	call_void_hook(secmark_refcount_inc);
2121 2122 2123 2124 2125
}
EXPORT_SYMBOL(security_secmark_refcount_inc);

void security_secmark_refcount_dec(void)
{
2126
	call_void_hook(secmark_refcount_dec);
2127 2128 2129
}
EXPORT_SYMBOL(security_secmark_refcount_dec);

2130 2131
int security_tun_dev_alloc_security(void **security)
{
2132
	return call_int_hook(tun_dev_alloc_security, 0, security);
2133 2134 2135 2136 2137
}
EXPORT_SYMBOL(security_tun_dev_alloc_security);

void security_tun_dev_free_security(void *security)
{
2138
	call_void_hook(tun_dev_free_security, security);
2139 2140 2141
}
EXPORT_SYMBOL(security_tun_dev_free_security);

P
Paul Moore 已提交
2142 2143
int security_tun_dev_create(void)
{
2144
	return call_int_hook(tun_dev_create, 0);
P
Paul Moore 已提交
2145 2146 2147
}
EXPORT_SYMBOL(security_tun_dev_create);

2148
int security_tun_dev_attach_queue(void *security)
P
Paul Moore 已提交
2149
{
2150
	return call_int_hook(tun_dev_attach_queue, 0, security);
P
Paul Moore 已提交
2151
}
2152
EXPORT_SYMBOL(security_tun_dev_attach_queue);
P
Paul Moore 已提交
2153

2154
int security_tun_dev_attach(struct sock *sk, void *security)
P
Paul Moore 已提交
2155
{
2156
	return call_int_hook(tun_dev_attach, 0, sk, security);
P
Paul Moore 已提交
2157 2158 2159
}
EXPORT_SYMBOL(security_tun_dev_attach);

2160 2161
int security_tun_dev_open(void *security)
{
2162
	return call_int_hook(tun_dev_open, 0, security);
2163 2164 2165
}
EXPORT_SYMBOL(security_tun_dev_open);

2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186
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);

2187 2188
#endif	/* CONFIG_SECURITY_NETWORK */

2189 2190 2191 2192 2193 2194 2195 2196
#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);

2197 2198 2199 2200 2201 2202
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);

2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215
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 */

2216 2217
#ifdef CONFIG_SECURITY_NETWORK_XFRM

2218 2219 2220
int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
			       struct xfrm_user_sec_ctx *sec_ctx,
			       gfp_t gfp)
2221
{
2222
	return call_int_hook(xfrm_policy_alloc_security, 0, ctxp, sec_ctx, gfp);
2223 2224 2225
}
EXPORT_SYMBOL(security_xfrm_policy_alloc);

2226 2227
int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,
			      struct xfrm_sec_ctx **new_ctxp)
2228
{
2229
	return call_int_hook(xfrm_policy_clone_security, 0, old_ctx, new_ctxp);
2230 2231
}

2232
void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx)
2233
{
2234
	call_void_hook(xfrm_policy_free_security, ctx);
2235 2236 2237
}
EXPORT_SYMBOL(security_xfrm_policy_free);

2238
int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
2239
{
2240
	return call_int_hook(xfrm_policy_delete_security, 0, ctx);
2241 2242
}

2243 2244
int security_xfrm_state_alloc(struct xfrm_state *x,
			      struct xfrm_user_sec_ctx *sec_ctx)
2245
{
2246
	return call_int_hook(xfrm_state_alloc, 0, x, sec_ctx);
2247 2248 2249 2250 2251 2252
}
EXPORT_SYMBOL(security_xfrm_state_alloc);

int security_xfrm_state_alloc_acquire(struct xfrm_state *x,
				      struct xfrm_sec_ctx *polsec, u32 secid)
{
2253
	return call_int_hook(xfrm_state_alloc_acquire, 0, x, polsec, secid);
2254 2255 2256 2257
}

int security_xfrm_state_delete(struct xfrm_state *x)
{
2258
	return call_int_hook(xfrm_state_delete_security, 0, x);
2259 2260 2261 2262 2263
}
EXPORT_SYMBOL(security_xfrm_state_delete);

void security_xfrm_state_free(struct xfrm_state *x)
{
2264
	call_void_hook(xfrm_state_free_security, x);
2265 2266
}

2267
int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
2268
{
2269
	return call_int_hook(xfrm_policy_lookup, 0, ctx, fl_secid, dir);
2270 2271 2272
}

int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
2273 2274
				       struct xfrm_policy *xp,
				       const struct flowi *fl)
2275
{
C
Casey Schaufler 已提交
2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
	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
	 */
2288
	hlist_for_each_entry(hp, &security_hook_heads.xfrm_state_pol_flow_match,
C
Casey Schaufler 已提交
2289 2290 2291 2292 2293
				list) {
		rc = hp->hook.xfrm_state_pol_flow_match(x, xp, fl);
		break;
	}
	return rc;
2294 2295 2296 2297
}

int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid)
{
2298
	return call_int_hook(xfrm_decode_session, 0, skb, secid, 1);
2299 2300 2301 2302
}

void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl)
{
2303 2304
	int rc = call_int_hook(xfrm_decode_session, 0, skb, &fl->flowi_secid,
				0);
2305 2306 2307 2308 2309 2310 2311 2312 2313

	BUG_ON(rc);
}
EXPORT_SYMBOL(security_skb_classify_flow);

#endif	/* CONFIG_SECURITY_NETWORK_XFRM */

#ifdef CONFIG_KEYS

D
David Howells 已提交
2314 2315
int security_key_alloc(struct key *key, const struct cred *cred,
		       unsigned long flags)
2316
{
2317
	return call_int_hook(key_alloc, 0, key, cred, flags);
2318 2319 2320 2321
}

void security_key_free(struct key *key)
{
2322
	call_void_hook(key_free, key);
2323 2324 2325
}

int security_key_permission(key_ref_t key_ref,
2326
			    const struct cred *cred, unsigned perm)
2327
{
2328
	return call_int_hook(key_permission, 0, key_ref, cred, perm);
2329 2330
}

2331 2332
int security_key_getsecurity(struct key *key, char **_buffer)
{
C
Casey Schaufler 已提交
2333
	*_buffer = NULL;
2334
	return call_int_hook(key_getsecurity, 0, key, _buffer);
2335 2336
}

2337
#endif	/* CONFIG_KEYS */
2338 2339 2340 2341 2342

#ifdef CONFIG_AUDIT

int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule)
{
2343
	return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule);
2344 2345 2346 2347
}

int security_audit_rule_known(struct audit_krule *krule)
{
2348
	return call_int_hook(audit_rule_known, 0, krule);
2349 2350 2351 2352
}

void security_audit_rule_free(void *lsmrule)
{
2353
	call_void_hook(audit_rule_free, lsmrule);
2354 2355
}

2356
int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule)
2357
{
2358
	return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule);
2359
}
C
Casey Schaufler 已提交
2360
#endif /* CONFIG_AUDIT */
2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391

#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 */