Blame view

security/security.c 62.4 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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>
d291f1a65   Daniel Jurgens   IB/core: Enforce ...
8
   * Copyright (C) 2016 Mellanox Technologies
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
   */
9b8c7c140   Kees Cook   LSM: Provide init...
10
  #define pr_fmt(fmt) "LSM: " fmt
afdb09c72   Chenbo Feng   security: bpf: Ad...
11
  #include <linux/bpf.h>
c59ede7b7   Randy.Dunlap   [PATCH] move capa...
12
  #include <linux/capability.h>
d47be3dfe   David Quigley   Security: Add hoo...
13
  #include <linux/dcache.h>
876979c93   Paul Gortmaker   security: audit a...
14
  #include <linux/export.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/init.h>
  #include <linux/kernel.h>
b89999d00   Scott Branden   fs/kernel_read_fi...
17
  #include <linux/kernel_read_file.h>
3c4ed7bdf   Casey Schaufler   LSM: Split securi...
18
  #include <linux/lsm_hooks.h>
f381c2722   Mimi Zohar   integrity: move i...
19
  #include <linux/integrity.h>
6c21a7fb4   Mimi Zohar   LSM: imbed ima ca...
20
  #include <linux/ima.h>
3e1be52d6   Mimi Zohar   security: imbed e...
21
  #include <linux/evm.h>
404015308   Al Viro   security: trim se...
22
  #include <linux/fsnotify.h>
8b3ec6814   Al Viro   take security_mma...
23
24
25
  #include <linux/mman.h>
  #include <linux/mount.h>
  #include <linux/personality.h>
75331a597   Paul Mundt   security: Fix nom...
26
  #include <linux/backing-dev.h>
3bb857e47   Mickaël Salaün   LSM: Enable multi...
27
  #include <linux/string.h>
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
28
  #include <linux/msg.h>
404015308   Al Viro   security: trim se...
29
  #include <net/flow.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30

823eb1ccd   Mimi Zohar   evm: call evm_ino...
31
  #define MAX_LSM_EVM_XATTR	2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

2d4d51198   Kees Cook   LSM: Build ordere...
33
34
  /* How many LSMs were built into the kernel? */
  #define LSM_COUNT (__end_lsm_info - __start_lsm_info)
3dfc9b028   Tetsuo Handa   LSM: Initialize s...
35
  struct security_hook_heads security_hook_heads __lsm_ro_after_init;
42df744c4   Janne Karhunen   LSM: switch to bl...
36
  static BLOCKING_NOTIFIER_HEAD(blocking_lsm_notifier_chain);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
37

33bf60cab   Casey Schaufler   LSM: Infrastructu...
38
  static struct kmem_cache *lsm_file_cache;
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
39
  static struct kmem_cache *lsm_inode_cache;
33bf60cab   Casey Schaufler   LSM: Infrastructu...
40

d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
41
  char *lsm_names;
bbd3662a8   Casey Schaufler   Infrastructure ma...
42
  static struct lsm_blob_sizes blob_sizes __lsm_ro_after_init;
076c54c5b   Ahmed S. Darwish   Security: Introdu...
43
  /* Boot-time LSM user choice */
79f7865d8   Kees Cook   LSM: Introduce "l...
44
  static __initdata const char *chosen_lsm_order;
5ef4e4191   Kees Cook   LSM: Prepare for ...
45
  static __initdata const char *chosen_major_lsm;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

13e735c0e   Kees Cook   LSM: Introduce CO...
47
  static __initconst const char * const builtin_lsm_order = CONFIG_LSM;
2d4d51198   Kees Cook   LSM: Build ordere...
48
49
  /* Ordered list of LSMs to initialize. */
  static __initdata struct lsm_info **ordered_lsms;
14bd99c82   Kees Cook   LSM: Separate ide...
50
  static __initdata struct lsm_info *exclusive;
2d4d51198   Kees Cook   LSM: Build ordere...
51

9b8c7c140   Kees Cook   LSM: Provide init...
52
53
54
55
56
57
  static __initdata bool debug;
  #define init_debug(...)						\
  	do {							\
  		if (debug)					\
  			pr_info(__VA_ARGS__);			\
  	} while (0)
f4941d75b   Kees Cook   LSM: Lift LSM sel...
58
59
  static bool __init is_enabled(struct lsm_info *lsm)
  {
a8027fb0d   Kees Cook   LSM: Tie enabling...
60
61
  	if (!lsm->enabled)
  		return false;
f4941d75b   Kees Cook   LSM: Lift LSM sel...
62

a8027fb0d   Kees Cook   LSM: Tie enabling...
63
  	return *lsm->enabled;
f4941d75b   Kees Cook   LSM: Lift LSM sel...
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  }
  
  /* 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;
  	}
  }
2d4d51198   Kees Cook   LSM: Build ordere...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  /* 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!?
  ", from))
  		return;
a8027fb0d   Kees Cook   LSM: Tie enabling...
113
114
115
  	/* Enable this LSM, if it is not already set. */
  	if (!lsm->enabled)
  		lsm->enabled = &lsm_enabled_true;
2d4d51198   Kees Cook   LSM: Build ordere...
116
  	ordered_lsms[last_lsm++] = lsm;
a8027fb0d   Kees Cook   LSM: Tie enabling...
117

2d4d51198   Kees Cook   LSM: Build ordere...
118
119
120
121
  	init_debug("%s ordering: %s (%sabled)
  ", from, lsm->name,
  		   is_enabled(lsm) ? "en" : "dis");
  }
f4941d75b   Kees Cook   LSM: Lift LSM sel...
122
123
124
125
126
127
  /* 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;
14bd99c82   Kees Cook   LSM: Separate ide...
128
129
130
131
132
133
  	/* Not allowed if another exclusive LSM already initialized. */
  	if ((lsm->flags & LSM_FLAG_EXCLUSIVE) && exclusive) {
  		init_debug("exclusive disabled: %s
  ", lsm->name);
  		return false;
  	}
f4941d75b   Kees Cook   LSM: Lift LSM sel...
134
135
  	return true;
  }
bbd3662a8   Casey Schaufler   Infrastructure ma...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  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);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
153
  	lsm_set_blob_size(&needed->lbs_file, &blob_sizes.lbs_file);
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
154
155
156
157
158
159
160
  	/*
  	 * 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);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
161
162
  	lsm_set_blob_size(&needed->lbs_ipc, &blob_sizes.lbs_ipc);
  	lsm_set_blob_size(&needed->lbs_msg_msg, &blob_sizes.lbs_msg_msg);
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
163
  	lsm_set_blob_size(&needed->lbs_task, &blob_sizes.lbs_task);
bbd3662a8   Casey Schaufler   Infrastructure ma...
164
  }
d8e9bbd4f   Kees Cook   LSM: Split LSM pr...
165
166
  /* Prepare LSM for initialization. */
  static void __init prepare_lsm(struct lsm_info *lsm)
f4941d75b   Kees Cook   LSM: Lift LSM sel...
167
168
169
170
171
  {
  	int enabled = lsm_allowed(lsm);
  
  	/* Record enablement (to handle any following exclusive LSMs). */
  	set_enabled(lsm, enabled);
d8e9bbd4f   Kees Cook   LSM: Split LSM pr...
172
  	/* If enabled, do pre-initialization work. */
f4941d75b   Kees Cook   LSM: Lift LSM sel...
173
  	if (enabled) {
14bd99c82   Kees Cook   LSM: Separate ide...
174
175
176
177
178
  		if ((lsm->flags & LSM_FLAG_EXCLUSIVE) && !exclusive) {
  			exclusive = lsm;
  			init_debug("exclusive chosen: %s
  ", lsm->name);
  		}
bbd3662a8   Casey Schaufler   Infrastructure ma...
179
180
  
  		lsm_set_blob_sizes(lsm->blobs);
d8e9bbd4f   Kees Cook   LSM: Split LSM pr...
181
182
183
184
185
186
187
188
  	}
  }
  
  /* Initialize a given LSM, if it is enabled. */
  static void __init initialize_lsm(struct lsm_info *lsm)
  {
  	if (is_enabled(lsm)) {
  		int ret;
14bd99c82   Kees Cook   LSM: Separate ide...
189

f4941d75b   Kees Cook   LSM: Lift LSM sel...
190
191
192
193
194
195
196
  		init_debug("initializing %s
  ", lsm->name);
  		ret = lsm->init();
  		WARN(ret, "%s failed to initialize: %d
  ", lsm->name, ret);
  	}
  }
13e735c0e   Kees Cook   LSM: Introduce CO...
197
  /* Populate ordered LSMs list from comma-separated LSM name list. */
2d4d51198   Kees Cook   LSM: Build ordere...
198
  static void __init ordered_lsm_parse(const char *order, const char *origin)
657d910b5   Kees Cook   LSM: Provide sepa...
199
200
  {
  	struct lsm_info *lsm;
13e735c0e   Kees Cook   LSM: Introduce CO...
201
  	char *sep, *name, *next;
e2bc445b6   Kees Cook   LSM: Introduce en...
202
203
204
205
206
  	/* 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");
  	}
7e611486d   Kees Cook   LSM: Refactor "se...
207
  	/* Process "security=", if given. */
7e611486d   Kees Cook   LSM: Refactor "se...
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
  	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
  ",
  					   chosen_major_lsm, major->name);
  			}
  		}
  	}
5ef4e4191   Kees Cook   LSM: Prepare for ...
228

13e735c0e   Kees Cook   LSM: Introduce CO...
229
230
231
232
233
234
235
  	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++) {
e2bc445b6   Kees Cook   LSM: Introduce en...
236
237
  			if (lsm->order == LSM_ORDER_MUTABLE &&
  			    strcmp(lsm->name, name) == 0) {
13e735c0e   Kees Cook   LSM: Introduce CO...
238
239
240
241
242
243
244
245
  				append_ordered_lsm(lsm, origin);
  				found = true;
  			}
  		}
  
  		if (!found)
  			init_debug("%s ignored: %s
  ", origin, name);
657d910b5   Kees Cook   LSM: Provide sepa...
246
  	}
c91d8106b   Casey Schaufler   LSM: Add all excl...
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
  ", origin, lsm->name);
  	}
13e735c0e   Kees Cook   LSM: Introduce CO...
266
  	kfree(sep);
657d910b5   Kees Cook   LSM: Provide sepa...
267
  }
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
268
269
  static void __init lsm_early_cred(struct cred *cred);
  static void __init lsm_early_task(struct task_struct *task);
e6b1db98c   Matthew Garrett   security: Support...
270
  static int lsm_append(const char *new, char **result);
2d4d51198   Kees Cook   LSM: Build ordere...
271
272
273
274
275
276
  static void __init ordered_lsm_init(void)
  {
  	struct lsm_info **lsm;
  
  	ordered_lsms = kcalloc(LSM_COUNT + 1, sizeof(*ordered_lsms),
  				GFP_KERNEL);
89a9684ea   Kees Cook   LSM: Ignore "secu...
277
278
279
280
281
282
  	if (chosen_lsm_order) {
  		if (chosen_major_lsm) {
  			pr_info("security= is ignored because it is superseded by lsm=
  ");
  			chosen_major_lsm = NULL;
  		}
79f7865d8   Kees Cook   LSM: Introduce "l...
283
  		ordered_lsm_parse(chosen_lsm_order, "cmdline");
89a9684ea   Kees Cook   LSM: Ignore "secu...
284
  	} else
79f7865d8   Kees Cook   LSM: Introduce "l...
285
  		ordered_lsm_parse(builtin_lsm_order, "builtin");
2d4d51198   Kees Cook   LSM: Build ordere...
286
287
  
  	for (lsm = ordered_lsms; *lsm; lsm++)
d8e9bbd4f   Kees Cook   LSM: Split LSM pr...
288
  		prepare_lsm(*lsm);
bbd3662a8   Casey Schaufler   Infrastructure ma...
289
290
  	init_debug("cred blob size     = %d
  ", blob_sizes.lbs_cred);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
291
292
  	init_debug("file blob size     = %d
  ", blob_sizes.lbs_file);
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
293
294
  	init_debug("inode blob size    = %d
  ", blob_sizes.lbs_inode);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
295
296
297
298
  	init_debug("ipc blob size      = %d
  ", blob_sizes.lbs_ipc);
  	init_debug("msg_msg blob size  = %d
  ", blob_sizes.lbs_msg_msg);
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
299
300
  	init_debug("task blob size     = %d
  ", blob_sizes.lbs_task);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
301
302
303
304
305
306
307
308
  
  	/*
  	 * 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);
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
309
310
311
312
  	if (blob_sizes.lbs_inode)
  		lsm_inode_cache = kmem_cache_create("lsm_inode_cache",
  						    blob_sizes.lbs_inode, 0,
  						    SLAB_PANIC, NULL);
bbd3662a8   Casey Schaufler   Infrastructure ma...
313

1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
314
315
  	lsm_early_cred((struct cred *) current->cred);
  	lsm_early_task(current);
d8e9bbd4f   Kees Cook   LSM: Split LSM pr...
316
317
  	for (lsm = ordered_lsms; *lsm; lsm++)
  		initialize_lsm(*lsm);
2d4d51198   Kees Cook   LSM: Build ordere...
318
319
320
  
  	kfree(ordered_lsms);
  }
e6b1db98c   Matthew Garrett   security: Support...
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  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;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
341
342
343
344
345
346
  /**
   * security_init - initializes the security framework
   *
   * This should be called early in the kernel initialization sequence.
   */
  int __init security_init(void)
  {
e6b1db98c   Matthew Garrett   security: Support...
347
  	struct lsm_info *lsm;
3dfc9b028   Tetsuo Handa   LSM: Initialize s...
348

98d291708   Kees Cook   LSM: Correctly an...
349
350
  	pr_info("Security Framework initializing
  ");
e6b1db98c   Matthew Garrett   security: Support...
351
352
353
354
355
356
357
358
  	/*
  	 * 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);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359

657d910b5   Kees Cook   LSM: Provide sepa...
360
361
  	/* Load LSMs in specified order. */
  	ordered_lsm_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
  	return 0;
  }
076c54c5b   Ahmed S. Darwish   Security: Introdu...
364
  /* Save user chosen LSM */
5ef4e4191   Kees Cook   LSM: Prepare for ...
365
  static int __init choose_major_lsm(char *str)
076c54c5b   Ahmed S. Darwish   Security: Introdu...
366
  {
5ef4e4191   Kees Cook   LSM: Prepare for ...
367
  	chosen_major_lsm = str;
076c54c5b   Ahmed S. Darwish   Security: Introdu...
368
369
  	return 1;
  }
5ef4e4191   Kees Cook   LSM: Prepare for ...
370
  __setup("security=", choose_major_lsm);
076c54c5b   Ahmed S. Darwish   Security: Introdu...
371

79f7865d8   Kees Cook   LSM: Introduce "l...
372
373
374
375
376
377
378
  /* Explicitly choose LSM initialization order. */
  static int __init choose_lsm_order(char *str)
  {
  	chosen_lsm_order = str;
  	return 1;
  }
  __setup("lsm=", choose_lsm_order);
9b8c7c140   Kees Cook   LSM: Provide init...
379
380
381
382
383
384
385
  /* Enable LSM order debugging. */
  static int __init enable_debug(char *str)
  {
  	debug = true;
  	return 1;
  }
  __setup("lsm.debug", enable_debug);
3bb857e47   Mickaël Salaün   LSM: Enable multi...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
  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);
  }
e6b1db98c   Matthew Garrett   security: Support...
400
  static int lsm_append(const char *new, char **result)
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
401
402
403
404
405
  {
  	char *cp;
  
  	if (*result == NULL) {
  		*result = kstrdup(new, GFP_KERNEL);
87ea58433   Eric Biggers   security: check f...
406
407
  		if (*result == NULL)
  			return -ENOMEM;
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
408
  	} else {
3bb857e47   Mickaël Salaün   LSM: Enable multi...
409
410
411
  		/* Check if it is the last registered name */
  		if (match_last_lsm(*result, new))
  			return 0;
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
412
413
414
415
416
417
418
419
  		cp = kasprintf(GFP_KERNEL, "%s,%s", *result, new);
  		if (cp == NULL)
  			return -ENOMEM;
  		kfree(*result);
  		*result = cp;
  	}
  	return 0;
  }
076c54c5b   Ahmed S. Darwish   Security: Introdu...
420
  /**
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
421
422
423
424
425
426
427
428
429
430
431
432
433
434
   * 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;
df0ce1733   Sargun Dhillon   security: convert...
435
  		hlist_add_tail_rcu(&hooks[i].list, hooks[i].head);
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
436
  	}
e6b1db98c   Matthew Garrett   security: Support...
437
438
439
440
441
442
443
444
445
446
  
  	/*
  	 * 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.
  ", __func__);
  	}
d69dece5f   Casey Schaufler   LSM: Add /sys/ker...
447
  }
42df744c4   Janne Karhunen   LSM: switch to bl...
448
  int call_blocking_lsm_notifier(enum lsm_event event, void *data)
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
449
  {
42df744c4   Janne Karhunen   LSM: switch to bl...
450
451
  	return blocking_notifier_call_chain(&blocking_lsm_notifier_chain,
  					    event, data);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
452
  }
42df744c4   Janne Karhunen   LSM: switch to bl...
453
  EXPORT_SYMBOL(call_blocking_lsm_notifier);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
454

42df744c4   Janne Karhunen   LSM: switch to bl...
455
  int register_blocking_lsm_notifier(struct notifier_block *nb)
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
456
  {
42df744c4   Janne Karhunen   LSM: switch to bl...
457
458
  	return blocking_notifier_chain_register(&blocking_lsm_notifier_chain,
  						nb);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
459
  }
42df744c4   Janne Karhunen   LSM: switch to bl...
460
  EXPORT_SYMBOL(register_blocking_lsm_notifier);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
461

42df744c4   Janne Karhunen   LSM: switch to bl...
462
  int unregister_blocking_lsm_notifier(struct notifier_block *nb)
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
463
  {
42df744c4   Janne Karhunen   LSM: switch to bl...
464
465
  	return blocking_notifier_chain_unregister(&blocking_lsm_notifier_chain,
  						  nb);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
466
  }
42df744c4   Janne Karhunen   LSM: switch to bl...
467
  EXPORT_SYMBOL(unregister_blocking_lsm_notifier);
8f408ab64   Daniel Jurgens   selinux lsm IB/co...
468

bbd3662a8   Casey Schaufler   Infrastructure ma...
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
  /**
   * 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
   *
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
495
   * Allocate the cred blob for all the modules
bbd3662a8   Casey Schaufler   Infrastructure ma...
496
   */
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
497
  static void __init lsm_early_cred(struct cred *cred)
bbd3662a8   Casey Schaufler   Infrastructure ma...
498
  {
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
499
  	int rc = lsm_cred_alloc(cred, GFP_KERNEL);
bbd3662a8   Casey Schaufler   Infrastructure ma...
500

bbd3662a8   Casey Schaufler   Infrastructure ma...
501
502
503
504
  	if (rc)
  		panic("%s: Early cred alloc failed.
  ", __func__);
  }
33bf60cab   Casey Schaufler   LSM: Infrastructu...
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
  /**
   * 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;
  }
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  /**
   * 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;
  }
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
545
546
547
548
549
550
551
552
  /**
   * 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.
   */
3e8c73671   Wei Yongjun   LSM: Make some fu...
553
  static int lsm_task_alloc(struct task_struct *task)
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
554
555
556
557
558
559
560
561
562
563
564
565
566
  {
  	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;
  }
  
  /**
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
567
568
569
570
571
572
573
   * 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.
   */
3e8c73671   Wei Yongjun   LSM: Make some fu...
574
  static int lsm_ipc_alloc(struct kern_ipc_perm *kip)
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  {
  	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.
   */
3e8c73671   Wei Yongjun   LSM: Make some fu...
595
  static int lsm_msg_msg_alloc(struct msg_msg *mp)
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
596
597
598
599
600
601
602
603
604
605
606
607
608
  {
  	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;
  }
  
  /**
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
609
610
611
   * lsm_early_task - during initialization allocate a composite task blob
   * @task: the task that needs a blob
   *
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
612
   * Allocate the task blob for all the modules
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
613
   */
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
614
  static void __init lsm_early_task(struct task_struct *task)
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
615
  {
1cfb2a512   Tetsuo Handa   LSM: Make lsm_ear...
616
  	int rc = lsm_task_alloc(task);
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
617

f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
618
619
620
621
  	if (rc)
  		panic("%s: Early task alloc failed.
  ", __func__);
  }
f25fce3e8   Casey Schaufler   LSM: Introduce se...
622
  /*
98e828a06   KP Singh   security: Refacto...
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
   * The default value of the LSM hook is defined in linux/lsm_hook_defs.h and
   * can be accessed with:
   *
   *	LSM_RET_DEFAULT(<hook_name>)
   *
   * The macros below define static constants for the default value of each
   * LSM hook.
   */
  #define LSM_RET_DEFAULT(NAME) (NAME##_default)
  #define DECLARE_LSM_RET_DEFAULT_void(DEFAULT, NAME)
  #define DECLARE_LSM_RET_DEFAULT_int(DEFAULT, NAME) \
  	static const int LSM_RET_DEFAULT(NAME) = (DEFAULT);
  #define LSM_HOOK(RET, DEFAULT, NAME, ...) \
  	DECLARE_LSM_RET_DEFAULT_##RET(DEFAULT, NAME)
  
  #include <linux/lsm_hook_defs.h>
  #undef LSM_HOOK
  
  /*
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
642
   * Hook list operation macros.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
   *
f25fce3e8   Casey Schaufler   LSM: Introduce se...
644
645
   * call_void_hook:
   *	This is a hook that does not return a value.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
646
   *
f25fce3e8   Casey Schaufler   LSM: Introduce se...
647
648
   * call_int_hook:
   *	This is a hook that returns a value.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
650

b1d9e6b06   Casey Schaufler   LSM: Switch to li...
651
652
653
654
  #define call_void_hook(FUNC, ...)				\
  	do {							\
  		struct security_hook_list *P;			\
  								\
df0ce1733   Sargun Dhillon   security: convert...
655
  		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) \
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
656
657
658
659
660
661
662
663
  			P->hook.FUNC(__VA_ARGS__);		\
  	} while (0)
  
  #define call_int_hook(FUNC, IRC, ...) ({			\
  	int RC = IRC;						\
  	do {							\
  		struct security_hook_list *P;			\
  								\
df0ce1733   Sargun Dhillon   security: convert...
664
  		hlist_for_each_entry(P, &security_hook_heads.FUNC, list) { \
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
665
666
667
668
669
670
671
  			RC = P->hook.FUNC(__VA_ARGS__);		\
  			if (RC != 0)				\
  				break;				\
  		}						\
  	} while (0);						\
  	RC;							\
  })
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672

20510f2f4   James Morris   security: Convert...
673
  /* Security operations */
79af73079   Stephen Smalley   Add security hook...
674
675
  int security_binder_set_context_mgr(struct task_struct *mgr)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
676
  	return call_int_hook(binder_set_context_mgr, 0, mgr);
79af73079   Stephen Smalley   Add security hook...
677
678
679
680
681
  }
  
  int security_binder_transaction(struct task_struct *from,
  				struct task_struct *to)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
682
  	return call_int_hook(binder_transaction, 0, from, to);
79af73079   Stephen Smalley   Add security hook...
683
684
685
686
687
  }
  
  int security_binder_transfer_binder(struct task_struct *from,
  				    struct task_struct *to)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
688
  	return call_int_hook(binder_transfer_binder, 0, from, to);
79af73079   Stephen Smalley   Add security hook...
689
690
691
692
693
  }
  
  int security_binder_transfer_file(struct task_struct *from,
  				  struct task_struct *to, struct file *file)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
694
  	return call_int_hook(binder_transfer_file, 0, from, to, file);
79af73079   Stephen Smalley   Add security hook...
695
  }
9e48858f7   Ingo Molnar   security: rename ...
696
  int security_ptrace_access_check(struct task_struct *child, unsigned int mode)
20510f2f4   James Morris   security: Convert...
697
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
698
  	return call_int_hook(ptrace_access_check, 0, child, mode);
5cd9c58fb   David Howells   security: Fix set...
699
700
701
702
  }
  
  int security_ptrace_traceme(struct task_struct *parent)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
703
  	return call_int_hook(ptrace_traceme, 0, parent);
20510f2f4   James Morris   security: Convert...
704
705
706
707
708
709
710
  }
  
  int security_capget(struct task_struct *target,
  		     kernel_cap_t *effective,
  		     kernel_cap_t *inheritable,
  		     kernel_cap_t *permitted)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
711
712
  	return call_int_hook(capget, 0, target,
  				effective, inheritable, permitted);
20510f2f4   James Morris   security: Convert...
713
  }
d84f4f992   David Howells   CRED: Inaugurate ...
714
715
716
717
  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)
20510f2f4   James Morris   security: Convert...
718
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
719
720
  	return call_int_hook(capset, 0, new, old,
  				effective, inheritable, permitted);
20510f2f4   James Morris   security: Convert...
721
  }
c1a85a00e   Micah Morton   LSM: generalize f...
722
723
724
725
  int security_capable(const struct cred *cred,
  		     struct user_namespace *ns,
  		     int cap,
  		     unsigned int opts)
20510f2f4   James Morris   security: Convert...
726
  {
c1a85a00e   Micah Morton   LSM: generalize f...
727
  	return call_int_hook(capable, 0, cred, ns, cap, opts);
20510f2f4   James Morris   security: Convert...
728
  }
20510f2f4   James Morris   security: Convert...
729
730
  int security_quotactl(int cmds, int type, int id, struct super_block *sb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
731
  	return call_int_hook(quotactl, 0, cmds, type, id, sb);
20510f2f4   James Morris   security: Convert...
732
733
734
735
  }
  
  int security_quota_on(struct dentry *dentry)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
736
  	return call_int_hook(quota_on, 0, dentry);
20510f2f4   James Morris   security: Convert...
737
  }
12b3052c3   Eric Paris   capabilities/sysl...
738
  int security_syslog(int type)
20510f2f4   James Morris   security: Convert...
739
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
740
  	return call_int_hook(syslog, 0, type);
20510f2f4   James Morris   security: Convert...
741
  }
457db29bf   Baolin Wang   security: Introdu...
742
  int security_settime64(const struct timespec64 *ts, const struct timezone *tz)
20510f2f4   James Morris   security: Convert...
743
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
744
  	return call_int_hook(settime, 0, ts, tz);
20510f2f4   James Morris   security: Convert...
745
  }
20510f2f4   James Morris   security: Convert...
746
747
  int security_vm_enough_memory_mm(struct mm_struct *mm, long pages)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
748
749
750
751
752
753
754
755
756
757
758
  	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.
  	 */
df0ce1733   Sargun Dhillon   security: convert...
759
  	hlist_for_each_entry(hp, &security_hook_heads.vm_enough_memory, list) {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
760
761
762
763
764
765
766
  		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);
20510f2f4   James Morris   security: Convert...
767
  }
b8bff5992   Eric W. Biederman   exec: Factor secu...
768
  int security_bprm_creds_for_exec(struct linux_binprm *bprm)
20510f2f4   James Morris   security: Convert...
769
  {
b8bff5992   Eric W. Biederman   exec: Factor secu...
770
771
  	return call_int_hook(bprm_creds_for_exec, 0, bprm);
  }
56305aa9b   Eric W. Biederman   exec: Compute fil...
772
  int security_bprm_creds_from_file(struct linux_binprm *bprm, struct file *file)
20510f2f4   James Morris   security: Convert...
773
  {
56305aa9b   Eric W. Biederman   exec: Compute fil...
774
  	return call_int_hook(bprm_creds_from_file, 0, bprm, file);
20510f2f4   James Morris   security: Convert...
775
  }
a6f76f23d   David Howells   CRED: Make execve...
776
  int security_bprm_check(struct linux_binprm *bprm)
20510f2f4   James Morris   security: Convert...
777
  {
6c21a7fb4   Mimi Zohar   LSM: imbed ima ca...
778
  	int ret;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
779
  	ret = call_int_hook(bprm_check_security, 0, bprm);
6c21a7fb4   Mimi Zohar   LSM: imbed ima ca...
780
781
782
  	if (ret)
  		return ret;
  	return ima_bprm_check(bprm);
20510f2f4   James Morris   security: Convert...
783
  }
a6f76f23d   David Howells   CRED: Make execve...
784
  void security_bprm_committing_creds(struct linux_binprm *bprm)
20510f2f4   James Morris   security: Convert...
785
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
786
  	call_void_hook(bprm_committing_creds, bprm);
20510f2f4   James Morris   security: Convert...
787
  }
a6f76f23d   David Howells   CRED: Make execve...
788
  void security_bprm_committed_creds(struct linux_binprm *bprm)
20510f2f4   James Morris   security: Convert...
789
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
790
  	call_void_hook(bprm_committed_creds, bprm);
20510f2f4   James Morris   security: Convert...
791
  }
0b52075ee   Al Viro   introduce cloning...
792
793
794
795
  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);
  }
da2441fdf   David Howells   vfs: Add LSM hook...
796
797
798
799
  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);
  }
20510f2f4   James Morris   security: Convert...
800
801
  int security_sb_alloc(struct super_block *sb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
802
  	return call_int_hook(sb_alloc_security, 0, sb);
20510f2f4   James Morris   security: Convert...
803
804
805
806
  }
  
  void security_sb_free(struct super_block *sb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
807
  	call_void_hook(sb_free_security, sb);
20510f2f4   James Morris   security: Convert...
808
  }
204cc0ccf   Al Viro   LSM: hide struct ...
809
  void security_free_mnt_opts(void **mnt_opts)
20510f2f4   James Morris   security: Convert...
810
  {
204cc0ccf   Al Viro   LSM: hide struct ...
811
812
813
814
  	if (!*mnt_opts)
  		return;
  	call_void_hook(sb_free_mnt_opts, *mnt_opts);
  	*mnt_opts = NULL;
20510f2f4   James Morris   security: Convert...
815
  }
204cc0ccf   Al Viro   LSM: hide struct ...
816
  EXPORT_SYMBOL(security_free_mnt_opts);
20510f2f4   James Morris   security: Convert...
817

204cc0ccf   Al Viro   LSM: hide struct ...
818
  int security_sb_eat_lsm_opts(char *options, void **mnt_opts)
ff36fe2c8   Eric Paris   LSM: Pass -o remo...
819
  {
204cc0ccf   Al Viro   LSM: hide struct ...
820
  	return call_int_hook(sb_eat_lsm_opts, 0, options, mnt_opts);
ff36fe2c8   Eric Paris   LSM: Pass -o remo...
821
  }
f5c0c26d9   Al Viro   new helper: secur...
822
  EXPORT_SYMBOL(security_sb_eat_lsm_opts);
ff36fe2c8   Eric Paris   LSM: Pass -o remo...
823

c039bc3c2   Al Viro   LSM: lift extract...
824
  int security_sb_remount(struct super_block *sb,
204cc0ccf   Al Viro   LSM: hide struct ...
825
  			void *mnt_opts)
20510f2f4   James Morris   security: Convert...
826
  {
204cc0ccf   Al Viro   LSM: hide struct ...
827
  	return call_int_hook(sb_remount, 0, sb, mnt_opts);
ff36fe2c8   Eric Paris   LSM: Pass -o remo...
828
  }
a65001e8a   Al Viro   btrfs: sanitize s...
829
  EXPORT_SYMBOL(security_sb_remount);
ff36fe2c8   Eric Paris   LSM: Pass -o remo...
830

a10d7c22b   Al Viro   LSM: split ->sb_s...
831
  int security_sb_kern_mount(struct super_block *sb)
20510f2f4   James Morris   security: Convert...
832
  {
a10d7c22b   Al Viro   LSM: split ->sb_s...
833
  	return call_int_hook(sb_kern_mount, 0, sb);
20510f2f4   James Morris   security: Convert...
834
  }
2069f4578   Eric Paris   LSM/SELinux: show...
835
836
  int security_sb_show_options(struct seq_file *m, struct super_block *sb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
837
  	return call_int_hook(sb_show_options, 0, m, sb);
2069f4578   Eric Paris   LSM/SELinux: show...
838
  }
20510f2f4   James Morris   security: Convert...
839
840
  int security_sb_statfs(struct dentry *dentry)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
841
  	return call_int_hook(sb_statfs, 0, dentry);
20510f2f4   James Morris   security: Convert...
842
  }
8a04c43b8   Al Viro   constify security...
843
  int security_sb_mount(const char *dev_name, const struct path *path,
808d4e3cf   Al Viro   consitify do_moun...
844
                         const char *type, unsigned long flags, void *data)
20510f2f4   James Morris   security: Convert...
845
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
846
  	return call_int_hook(sb_mount, 0, dev_name, path, type, flags, data);
20510f2f4   James Morris   security: Convert...
847
  }
20510f2f4   James Morris   security: Convert...
848
849
  int security_sb_umount(struct vfsmount *mnt, int flags)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
850
  	return call_int_hook(sb_umount, 0, mnt, flags);
20510f2f4   James Morris   security: Convert...
851
  }
3b73b68c0   Al Viro   constify security...
852
  int security_sb_pivotroot(const struct path *old_path, const struct path *new_path)
20510f2f4   James Morris   security: Convert...
853
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
854
  	return call_int_hook(sb_pivotroot, 0, old_path, new_path);
20510f2f4   James Morris   security: Convert...
855
  }
c9180a57a   Eric Paris   Security: add get...
856
  int security_sb_set_mnt_opts(struct super_block *sb,
204cc0ccf   Al Viro   LSM: hide struct ...
857
  				void *mnt_opts,
649f6e771   David Quigley   LSM: Add flags fi...
858
859
  				unsigned long kern_flags,
  				unsigned long *set_kern_flags)
c9180a57a   Eric Paris   Security: add get...
860
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
861
  	return call_int_hook(sb_set_mnt_opts,
204cc0ccf   Al Viro   LSM: hide struct ...
862
863
  				mnt_opts ? -EOPNOTSUPP : 0, sb,
  				mnt_opts, kern_flags, set_kern_flags);
c9180a57a   Eric Paris   Security: add get...
864
  }
e00075298   Eric Paris   LSM/SELinux: Inte...
865
  EXPORT_SYMBOL(security_sb_set_mnt_opts);
c9180a57a   Eric Paris   Security: add get...
866

094f7b69e   Jeff Layton   selinux: make sec...
867
  int security_sb_clone_mnt_opts(const struct super_block *oldsb,
0b4d3452b   Scott Mayhew   security/selinux:...
868
869
870
  				struct super_block *newsb,
  				unsigned long kern_flags,
  				unsigned long *set_kern_flags)
c9180a57a   Eric Paris   Security: add get...
871
  {
0b4d3452b   Scott Mayhew   security/selinux:...
872
873
  	return call_int_hook(sb_clone_mnt_opts, 0, oldsb, newsb,
  				kern_flags, set_kern_flags);
c9180a57a   Eric Paris   Security: add get...
874
  }
e00075298   Eric Paris   LSM/SELinux: Inte...
875
  EXPORT_SYMBOL(security_sb_clone_mnt_opts);
757cbe597   Al Viro   LSM: new method: ...
876
877
  int security_add_mnt_opt(const char *option, const char *val, int len,
  			 void **mnt_opts)
e00075298   Eric Paris   LSM/SELinux: Inte...
878
  {
757cbe597   Al Viro   LSM: new method: ...
879
880
  	return call_int_hook(sb_add_mnt_opt, -EINVAL,
  					option, val, len, mnt_opts);
e00075298   Eric Paris   LSM/SELinux: Inte...
881
  }
757cbe597   Al Viro   LSM: new method: ...
882
  EXPORT_SYMBOL(security_add_mnt_opt);
c9180a57a   Eric Paris   Security: add get...
883

2db154b3e   David Howells   vfs: syscall: Add...
884
885
886
887
  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);
  }
ac5656d8a   Aaron Goidel   fanotify, inotify...
888
889
890
891
892
  int security_path_notify(const struct path *path, u64 mask,
  				unsigned int obj_type)
  {
  	return call_int_hook(path_notify, 0, path, mask, obj_type);
  }
20510f2f4   James Morris   security: Convert...
893
894
  int security_inode_alloc(struct inode *inode)
  {
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
  	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);
20510f2f4   James Morris   security: Convert...
911
912
913
914
  }
  
  void security_inode_free(struct inode *inode)
  {
f381c2722   Mimi Zohar   integrity: move i...
915
  	integrity_inode_free(inode);
f25fce3e8   Casey Schaufler   LSM: Introduce se...
916
  	call_void_hook(inode_free_security, inode);
afb1cbe37   Casey Schaufler   LSM: Infrastructu...
917
918
919
920
921
922
923
924
925
926
927
928
  	/*
  	 * 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);
20510f2f4   James Morris   security: Convert...
929
  }
d47be3dfe   David Quigley   Security: Add hoo...
930
  int security_dentry_init_security(struct dentry *dentry, int mode,
4f3ccd765   Al Viro   qstr: constify de...
931
  					const struct qstr *name, void **ctx,
d47be3dfe   David Quigley   Security: Add hoo...
932
933
  					u32 *ctxlen)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
934
935
  	return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
  				name, ctx, ctxlen);
d47be3dfe   David Quigley   Security: Add hoo...
936
937
  }
  EXPORT_SYMBOL(security_dentry_init_security);
2602625b7   Vivek Goyal   security, overlay...
938
939
940
941
942
943
944
945
  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);
20510f2f4   James Morris   security: Convert...
946
  int security_inode_init_security(struct inode *inode, struct inode *dir,
9d8f13ba3   Mimi Zohar   security: new sec...
947
948
  				 const struct qstr *qstr,
  				 const initxattrs initxattrs, void *fs_data)
20510f2f4   James Morris   security: Convert...
949
  {
823eb1ccd   Mimi Zohar   evm: call evm_ino...
950
951
  	struct xattr new_xattrs[MAX_LSM_EVM_XATTR + 1];
  	struct xattr *lsm_xattr, *evm_xattr, *xattr;
9d8f13ba3   Mimi Zohar   security: new sec...
952
  	int ret;
20510f2f4   James Morris   security: Convert...
953
  	if (unlikely(IS_PRIVATE(inode)))
fb88c2b6c   Mimi Zohar   evm: fix security...
954
  		return 0;
9d8f13ba3   Mimi Zohar   security: new sec...
955

9d8f13ba3   Mimi Zohar   security: new sec...
956
  	if (!initxattrs)
e308fd3bb   Jan Beulich   LSM: restore cert...
957
958
  		return call_int_hook(inode_init_security, -EOPNOTSUPP, inode,
  				     dir, qstr, NULL, NULL, NULL);
9548906b2   Tetsuo Handa   xattr: Constify -...
959
  	memset(new_xattrs, 0, sizeof(new_xattrs));
9d8f13ba3   Mimi Zohar   security: new sec...
960
  	lsm_xattr = new_xattrs;
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
961
  	ret = call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir, qstr,
9d8f13ba3   Mimi Zohar   security: new sec...
962
963
964
965
966
  						&lsm_xattr->name,
  						&lsm_xattr->value,
  						&lsm_xattr->value_len);
  	if (ret)
  		goto out;
823eb1ccd   Mimi Zohar   evm: call evm_ino...
967
968
969
970
971
  
  	evm_xattr = lsm_xattr + 1;
  	ret = evm_inode_init_security(inode, lsm_xattr, evm_xattr);
  	if (ret)
  		goto out;
9d8f13ba3   Mimi Zohar   security: new sec...
972
973
  	ret = initxattrs(inode, new_xattrs, fs_data);
  out:
9548906b2   Tetsuo Handa   xattr: Constify -...
974
  	for (xattr = new_xattrs; xattr->value != NULL; xattr++)
823eb1ccd   Mimi Zohar   evm: call evm_ino...
975
  		kfree(xattr->value);
9d8f13ba3   Mimi Zohar   security: new sec...
976
977
978
979
980
  	return (ret == -EOPNOTSUPP) ? 0 : ret;
  }
  EXPORT_SYMBOL(security_inode_init_security);
  
  int security_old_inode_init_security(struct inode *inode, struct inode *dir,
9548906b2   Tetsuo Handa   xattr: Constify -...
981
  				     const struct qstr *qstr, const char **name,
9d8f13ba3   Mimi Zohar   security: new sec...
982
  				     void **value, size_t *len)
20510f2f4   James Morris   security: Convert...
983
984
  {
  	if (unlikely(IS_PRIVATE(inode)))
30e053248   Jan Kara   security: Fix sec...
985
  		return -EOPNOTSUPP;
e308fd3bb   Jan Beulich   LSM: restore cert...
986
987
  	return call_int_hook(inode_init_security, -EOPNOTSUPP, inode, dir,
  			     qstr, name, value, len);
20510f2f4   James Morris   security: Convert...
988
  }
9d8f13ba3   Mimi Zohar   security: new sec...
989
  EXPORT_SYMBOL(security_old_inode_init_security);
20510f2f4   James Morris   security: Convert...
990

be6d3e56a   Kentaro Takeda   introduce new LSM...
991
  #ifdef CONFIG_SECURITY_PATH
d36077521   Al Viro   constify security...
992
  int security_path_mknod(const struct path *dir, struct dentry *dentry, umode_t mode,
be6d3e56a   Kentaro Takeda   introduce new LSM...
993
994
  			unsigned int dev)
  {
c6f493d63   David Howells   VFS: security/: d...
995
  	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
996
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
997
  	return call_int_hook(path_mknod, 0, dir, dentry, mode, dev);
be6d3e56a   Kentaro Takeda   introduce new LSM...
998
999
  }
  EXPORT_SYMBOL(security_path_mknod);
d36077521   Al Viro   constify security...
1000
  int security_path_mkdir(const struct path *dir, struct dentry *dentry, umode_t mode)
be6d3e56a   Kentaro Takeda   introduce new LSM...
1001
  {
c6f493d63   David Howells   VFS: security/: d...
1002
  	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1003
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1004
  	return call_int_hook(path_mkdir, 0, dir, dentry, mode);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1005
  }
821404434   David Howells   CacheFiles: Add c...
1006
  EXPORT_SYMBOL(security_path_mkdir);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1007

989f74e05   Al Viro   constify security...
1008
  int security_path_rmdir(const struct path *dir, struct dentry *dentry)
be6d3e56a   Kentaro Takeda   introduce new LSM...
1009
  {
c6f493d63   David Howells   VFS: security/: d...
1010
  	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1011
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1012
  	return call_int_hook(path_rmdir, 0, dir, dentry);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1013
  }
989f74e05   Al Viro   constify security...
1014
  int security_path_unlink(const struct path *dir, struct dentry *dentry)
be6d3e56a   Kentaro Takeda   introduce new LSM...
1015
  {
c6f493d63   David Howells   VFS: security/: d...
1016
  	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1017
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1018
  	return call_int_hook(path_unlink, 0, dir, dentry);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1019
  }
821404434   David Howells   CacheFiles: Add c...
1020
  EXPORT_SYMBOL(security_path_unlink);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1021

d36077521   Al Viro   constify security...
1022
  int security_path_symlink(const struct path *dir, struct dentry *dentry,
be6d3e56a   Kentaro Takeda   introduce new LSM...
1023
1024
  			  const char *old_name)
  {
c6f493d63   David Howells   VFS: security/: d...
1025
  	if (unlikely(IS_PRIVATE(d_backing_inode(dir->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1026
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1027
  	return call_int_hook(path_symlink, 0, dir, dentry, old_name);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1028
  }
3ccee46ab   Al Viro   constify security...
1029
  int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
be6d3e56a   Kentaro Takeda   introduce new LSM...
1030
1031
  		       struct dentry *new_dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1032
  	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1033
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1034
  	return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1035
  }
3ccee46ab   Al Viro   constify security...
1036
1037
  int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
  			 const struct path *new_dir, struct dentry *new_dentry,
0b3974eb0   Miklos Szeredi   security: add fla...
1038
  			 unsigned int flags)
be6d3e56a   Kentaro Takeda   introduce new LSM...
1039
  {
c6f493d63   David Howells   VFS: security/: d...
1040
1041
  	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
  		     (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1042
  		return 0;
da1ce0670   Miklos Szeredi   vfs: add cross-re...
1043
1044
  
  	if (flags & RENAME_EXCHANGE) {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1045
1046
  		int err = call_int_hook(path_rename, 0, new_dir, new_dentry,
  					old_dir, old_dentry);
da1ce0670   Miklos Szeredi   vfs: add cross-re...
1047
1048
1049
  		if (err)
  			return err;
  	}
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1050
1051
  	return call_int_hook(path_rename, 0, old_dir, old_dentry, new_dir,
  				new_dentry);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1052
  }
821404434   David Howells   CacheFiles: Add c...
1053
  EXPORT_SYMBOL(security_path_rename);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1054

81f4c5060   Al Viro   constify security...
1055
  int security_path_truncate(const struct path *path)
be6d3e56a   Kentaro Takeda   introduce new LSM...
1056
  {
c6f493d63   David Howells   VFS: security/: d...
1057
  	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
be6d3e56a   Kentaro Takeda   introduce new LSM...
1058
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1059
  	return call_int_hook(path_truncate, 0, path);
be6d3e56a   Kentaro Takeda   introduce new LSM...
1060
  }
89eda0683   Tetsuo Handa   LSM: Add security...
1061

be01f9f28   Al Viro   constify chmod_co...
1062
  int security_path_chmod(const struct path *path, umode_t mode)
89eda0683   Tetsuo Handa   LSM: Add security...
1063
  {
c6f493d63   David Howells   VFS: security/: d...
1064
  	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
89eda0683   Tetsuo Handa   LSM: Add security...
1065
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1066
  	return call_int_hook(path_chmod, 0, path, mode);
89eda0683   Tetsuo Handa   LSM: Add security...
1067
  }
7fd25dac9   Al Viro   constify chown_co...
1068
  int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
89eda0683   Tetsuo Handa   LSM: Add security...
1069
  {
c6f493d63   David Howells   VFS: security/: d...
1070
  	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
89eda0683   Tetsuo Handa   LSM: Add security...
1071
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1072
  	return call_int_hook(path_chown, 0, path, uid, gid);
89eda0683   Tetsuo Handa   LSM: Add security...
1073
  }
8b8efb440   Tetsuo Handa   LSM: Add security...
1074

77b286c0d   Al Viro   constify security...
1075
  int security_path_chroot(const struct path *path)
8b8efb440   Tetsuo Handa   LSM: Add security...
1076
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1077
  	return call_int_hook(path_chroot, 0, path);
8b8efb440   Tetsuo Handa   LSM: Add security...
1078
  }
be6d3e56a   Kentaro Takeda   introduce new LSM...
1079
  #endif
4acdaf27e   Al Viro   switch ->create()...
1080
  int security_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
20510f2f4   James Morris   security: Convert...
1081
1082
1083
  {
  	if (unlikely(IS_PRIVATE(dir)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1084
  	return call_int_hook(inode_create, 0, dir, dentry, mode);
20510f2f4   James Morris   security: Convert...
1085
  }
800a96478   David Howells   CacheFiles: Expor...
1086
  EXPORT_SYMBOL_GPL(security_inode_create);
20510f2f4   James Morris   security: Convert...
1087
1088
1089
1090
  
  int security_inode_link(struct dentry *old_dentry, struct inode *dir,
  			 struct dentry *new_dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1091
  	if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry))))
20510f2f4   James Morris   security: Convert...
1092
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1093
  	return call_int_hook(inode_link, 0, old_dentry, dir, new_dentry);
20510f2f4   James Morris   security: Convert...
1094
1095
1096
1097
  }
  
  int security_inode_unlink(struct inode *dir, struct dentry *dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1098
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1099
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1100
  	return call_int_hook(inode_unlink, 0, dir, dentry);
20510f2f4   James Morris   security: Convert...
1101
1102
1103
1104
1105
1106
1107
  }
  
  int security_inode_symlink(struct inode *dir, struct dentry *dentry,
  			    const char *old_name)
  {
  	if (unlikely(IS_PRIVATE(dir)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1108
  	return call_int_hook(inode_symlink, 0, dir, dentry, old_name);
20510f2f4   James Morris   security: Convert...
1109
  }
18bb1db3e   Al Viro   switch vfs_mkdir(...
1110
  int security_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
20510f2f4   James Morris   security: Convert...
1111
1112
1113
  {
  	if (unlikely(IS_PRIVATE(dir)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1114
  	return call_int_hook(inode_mkdir, 0, dir, dentry, mode);
20510f2f4   James Morris   security: Convert...
1115
  }
800a96478   David Howells   CacheFiles: Expor...
1116
  EXPORT_SYMBOL_GPL(security_inode_mkdir);
20510f2f4   James Morris   security: Convert...
1117
1118
1119
  
  int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1120
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1121
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1122
  	return call_int_hook(inode_rmdir, 0, dir, dentry);
20510f2f4   James Morris   security: Convert...
1123
  }
1a67aafb5   Al Viro   switch ->mknod() ...
1124
  int security_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
20510f2f4   James Morris   security: Convert...
1125
1126
1127
  {
  	if (unlikely(IS_PRIVATE(dir)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1128
  	return call_int_hook(inode_mknod, 0, dir, dentry, mode, dev);
20510f2f4   James Morris   security: Convert...
1129
1130
1131
  }
  
  int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
0b3974eb0   Miklos Szeredi   security: add fla...
1132
1133
  			   struct inode *new_dir, struct dentry *new_dentry,
  			   unsigned int flags)
20510f2f4   James Morris   security: Convert...
1134
  {
c6f493d63   David Howells   VFS: security/: d...
1135
1136
          if (unlikely(IS_PRIVATE(d_backing_inode(old_dentry)) ||
              (d_is_positive(new_dentry) && IS_PRIVATE(d_backing_inode(new_dentry)))))
20510f2f4   James Morris   security: Convert...
1137
  		return 0;
da1ce0670   Miklos Szeredi   vfs: add cross-re...
1138
1139
  
  	if (flags & RENAME_EXCHANGE) {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1140
  		int err = call_int_hook(inode_rename, 0, new_dir, new_dentry,
da1ce0670   Miklos Szeredi   vfs: add cross-re...
1141
1142
1143
1144
  						     old_dir, old_dentry);
  		if (err)
  			return err;
  	}
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1145
  	return call_int_hook(inode_rename, 0, old_dir, old_dentry,
20510f2f4   James Morris   security: Convert...
1146
1147
1148
1149
1150
  					   new_dir, new_dentry);
  }
  
  int security_inode_readlink(struct dentry *dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1151
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1152
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1153
  	return call_int_hook(inode_readlink, 0, dentry);
20510f2f4   James Morris   security: Convert...
1154
  }
bda0be7ad   NeilBrown   security: make in...
1155
1156
  int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
  			       bool rcu)
20510f2f4   James Morris   security: Convert...
1157
  {
bda0be7ad   NeilBrown   security: make in...
1158
  	if (unlikely(IS_PRIVATE(inode)))
20510f2f4   James Morris   security: Convert...
1159
  		return 0;
e22619a29   Linus Torvalds   Merge branch 'nex...
1160
  	return call_int_hook(inode_follow_link, 0, dentry, inode, rcu);
20510f2f4   James Morris   security: Convert...
1161
  }
b77b0646e   Al Viro   [PATCH] pass MAY_...
1162
  int security_inode_permission(struct inode *inode, int mask)
20510f2f4   James Morris   security: Convert...
1163
1164
1165
  {
  	if (unlikely(IS_PRIVATE(inode)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1166
  	return call_int_hook(inode_permission, 0, inode, mask);
20510f2f4   James Morris   security: Convert...
1167
1168
1169
1170
  }
  
  int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
  {
817b54aa4   Mimi Zohar   evm: add evm_inod...
1171
  	int ret;
c6f493d63   David Howells   VFS: security/: d...
1172
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1173
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1174
  	ret = call_int_hook(inode_setattr, 0, dentry, attr);
817b54aa4   Mimi Zohar   evm: add evm_inod...
1175
1176
1177
  	if (ret)
  		return ret;
  	return evm_inode_setattr(dentry, attr);
20510f2f4   James Morris   security: Convert...
1178
  }
b1da47e29   Miklos Szeredi   [patch 3/4] fat: ...
1179
  EXPORT_SYMBOL_GPL(security_inode_setattr);
20510f2f4   James Morris   security: Convert...
1180

3f7036a07   Al Viro   switch security_i...
1181
  int security_inode_getattr(const struct path *path)
20510f2f4   James Morris   security: Convert...
1182
  {
c6f493d63   David Howells   VFS: security/: d...
1183
  	if (unlikely(IS_PRIVATE(d_backing_inode(path->dentry))))
20510f2f4   James Morris   security: Convert...
1184
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1185
  	return call_int_hook(inode_getattr, 0, path);
20510f2f4   James Morris   security: Convert...
1186
  }
8f0cfa52a   David Howells   xattr: add missin...
1187
1188
  int security_inode_setxattr(struct dentry *dentry, const char *name,
  			    const void *value, size_t size, int flags)
20510f2f4   James Morris   security: Convert...
1189
  {
3e1be52d6   Mimi Zohar   security: imbed e...
1190
  	int ret;
c6f493d63   David Howells   VFS: security/: d...
1191
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1192
  		return 0;
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1193
1194
1195
1196
1197
  	/*
  	 * 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,
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1198
  				flags);
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1199
1200
1201
  
  	if (ret == 1)
  		ret = cap_inode_setxattr(dentry, name, value, size, flags);
3e1be52d6   Mimi Zohar   security: imbed e...
1202
1203
  	if (ret)
  		return ret;
42c63330f   Mimi Zohar   ima: add ima_inod...
1204
1205
1206
  	ret = ima_inode_setxattr(dentry, name, value, size);
  	if (ret)
  		return ret;
3e1be52d6   Mimi Zohar   security: imbed e...
1207
  	return evm_inode_setxattr(dentry, name, value, size);
20510f2f4   James Morris   security: Convert...
1208
  }
8f0cfa52a   David Howells   xattr: add missin...
1209
1210
  void security_inode_post_setxattr(struct dentry *dentry, const char *name,
  				  const void *value, size_t size, int flags)
20510f2f4   James Morris   security: Convert...
1211
  {
c6f493d63   David Howells   VFS: security/: d...
1212
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1213
  		return;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1214
  	call_void_hook(inode_post_setxattr, dentry, name, value, size, flags);
3e1be52d6   Mimi Zohar   security: imbed e...
1215
  	evm_inode_post_setxattr(dentry, name, value, size);
20510f2f4   James Morris   security: Convert...
1216
  }
8f0cfa52a   David Howells   xattr: add missin...
1217
  int security_inode_getxattr(struct dentry *dentry, const char *name)
20510f2f4   James Morris   security: Convert...
1218
  {
c6f493d63   David Howells   VFS: security/: d...
1219
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1220
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1221
  	return call_int_hook(inode_getxattr, 0, dentry, name);
20510f2f4   James Morris   security: Convert...
1222
1223
1224
1225
  }
  
  int security_inode_listxattr(struct dentry *dentry)
  {
c6f493d63   David Howells   VFS: security/: d...
1226
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1227
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1228
  	return call_int_hook(inode_listxattr, 0, dentry);
20510f2f4   James Morris   security: Convert...
1229
  }
8f0cfa52a   David Howells   xattr: add missin...
1230
  int security_inode_removexattr(struct dentry *dentry, const char *name)
20510f2f4   James Morris   security: Convert...
1231
  {
3e1be52d6   Mimi Zohar   security: imbed e...
1232
  	int ret;
c6f493d63   David Howells   VFS: security/: d...
1233
  	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
20510f2f4   James Morris   security: Convert...
1234
  		return 0;
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1235
1236
1237
1238
1239
1240
1241
  	/*
  	 * 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);
3e1be52d6   Mimi Zohar   security: imbed e...
1242
1243
  	if (ret)
  		return ret;
42c63330f   Mimi Zohar   ima: add ima_inod...
1244
1245
1246
  	ret = ima_inode_removexattr(dentry, name);
  	if (ret)
  		return ret;
3e1be52d6   Mimi Zohar   security: imbed e...
1247
  	return evm_inode_removexattr(dentry, name);
20510f2f4   James Morris   security: Convert...
1248
  }
b53767719   Serge E. Hallyn   Implement file po...
1249
1250
  int security_inode_need_killpriv(struct dentry *dentry)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1251
  	return call_int_hook(inode_need_killpriv, 0, dentry);
b53767719   Serge E. Hallyn   Implement file po...
1252
1253
1254
1255
  }
  
  int security_inode_killpriv(struct dentry *dentry)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1256
  	return call_int_hook(inode_killpriv, 0, dentry);
b53767719   Serge E. Hallyn   Implement file po...
1257
  }
ea861dfd9   Andreas Gruenbacher   security: Make in...
1258
  int security_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
20510f2f4   James Morris   security: Convert...
1259
  {
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1260
1261
  	struct security_hook_list *hp;
  	int rc;
20510f2f4   James Morris   security: Convert...
1262
  	if (unlikely(IS_PRIVATE(inode)))
98e828a06   KP Singh   security: Refacto...
1263
  		return LSM_RET_DEFAULT(inode_getsecurity);
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1264
1265
1266
  	/*
  	 * Only one module will provide an attribute with a given name.
  	 */
df0ce1733   Sargun Dhillon   security: convert...
1267
  	hlist_for_each_entry(hp, &security_hook_heads.inode_getsecurity, list) {
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1268
  		rc = hp->hook.inode_getsecurity(inode, name, buffer, alloc);
98e828a06   KP Singh   security: Refacto...
1269
  		if (rc != LSM_RET_DEFAULT(inode_getsecurity))
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1270
1271
  			return rc;
  	}
98e828a06   KP Singh   security: Refacto...
1272
  	return LSM_RET_DEFAULT(inode_getsecurity);
20510f2f4   James Morris   security: Convert...
1273
1274
1275
1276
  }
  
  int security_inode_setsecurity(struct inode *inode, const char *name, const void *value, size_t size, int flags)
  {
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1277
1278
  	struct security_hook_list *hp;
  	int rc;
20510f2f4   James Morris   security: Convert...
1279
  	if (unlikely(IS_PRIVATE(inode)))
98e828a06   KP Singh   security: Refacto...
1280
  		return LSM_RET_DEFAULT(inode_setsecurity);
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1281
1282
1283
  	/*
  	 * Only one module will provide an attribute with a given name.
  	 */
df0ce1733   Sargun Dhillon   security: convert...
1284
  	hlist_for_each_entry(hp, &security_hook_heads.inode_setsecurity, list) {
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1285
1286
  		rc = hp->hook.inode_setsecurity(inode, name, value, size,
  								flags);
98e828a06   KP Singh   security: Refacto...
1287
  		if (rc != LSM_RET_DEFAULT(inode_setsecurity))
2885c1e3e   Casey Schaufler   LSM: Fix for secu...
1288
1289
  			return rc;
  	}
98e828a06   KP Singh   security: Refacto...
1290
  	return LSM_RET_DEFAULT(inode_setsecurity);
20510f2f4   James Morris   security: Convert...
1291
1292
1293
1294
1295
1296
  }
  
  int security_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
  {
  	if (unlikely(IS_PRIVATE(inode)))
  		return 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1297
  	return call_int_hook(inode_listsecurity, 0, inode, buffer, buffer_size);
20510f2f4   James Morris   security: Convert...
1298
  }
c9bccef6b   David Quigley   NFS: Extend NFS x...
1299
  EXPORT_SYMBOL(security_inode_listsecurity);
20510f2f4   James Morris   security: Convert...
1300

d6335d77a   Andreas Gruenbacher   security: Make in...
1301
  void security_inode_getsecid(struct inode *inode, u32 *secid)
8a076191f   Ahmed S. Darwish   LSM: Introduce in...
1302
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1303
  	call_void_hook(inode_getsecid, inode, secid);
8a076191f   Ahmed S. Darwish   LSM: Introduce in...
1304
  }
d8ad8b496   Vivek Goyal   security, overlay...
1305
1306
1307
1308
1309
  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);
121ab822e   Vivek Goyal   security,overlayf...
1310
1311
  int security_inode_copy_up_xattr(const char *name)
  {
23e390cdb   KP Singh   security: Fix hoo...
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
  	struct security_hook_list *hp;
  	int rc;
  
  	/*
  	 * The implementation can return 0 (accept the xattr), 1 (discard the
  	 * xattr), -EOPNOTSUPP if it does not know anything about the xattr or
  	 * any other error code incase of an error.
  	 */
  	hlist_for_each_entry(hp,
  		&security_hook_heads.inode_copy_up_xattr, list) {
  		rc = hp->hook.inode_copy_up_xattr(name);
  		if (rc != LSM_RET_DEFAULT(inode_copy_up_xattr))
  			return rc;
  	}
  
  	return LSM_RET_DEFAULT(inode_copy_up_xattr);
121ab822e   Vivek Goyal   security,overlayf...
1328
1329
  }
  EXPORT_SYMBOL(security_inode_copy_up_xattr);
b230d5aba   Ondrej Mosnacek   LSM: add new hook...
1330
1331
1332
1333
1334
  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);
  }
20510f2f4   James Morris   security: Convert...
1335
1336
  int security_file_permission(struct file *file, int mask)
  {
c4ec54b40   Eric Paris   fsnotify: new fsn...
1337
  	int ret;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1338
  	ret = call_int_hook(file_permission, 0, file, mask);
c4ec54b40   Eric Paris   fsnotify: new fsn...
1339
1340
1341
1342
  	if (ret)
  		return ret;
  
  	return fsnotify_perm(file, mask);
20510f2f4   James Morris   security: Convert...
1343
1344
1345
1346
  }
  
  int security_file_alloc(struct file *file)
  {
33bf60cab   Casey Schaufler   LSM: Infrastructu...
1347
1348
1349
1350
1351
1352
1353
1354
  	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;
20510f2f4   James Morris   security: Convert...
1355
1356
1357
1358
  }
  
  void security_file_free(struct file *file)
  {
33bf60cab   Casey Schaufler   LSM: Infrastructu...
1359
  	void *blob;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1360
  	call_void_hook(file_free_security, file);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
1361
1362
1363
1364
1365
1366
  
  	blob = file->f_security;
  	if (blob) {
  		file->f_security = NULL;
  		kmem_cache_free(lsm_file_cache, blob);
  	}
20510f2f4   James Morris   security: Convert...
1367
1368
1369
1370
  }
  
  int security_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1371
  	return call_int_hook(file_ioctl, 0, file, cmd, arg);
20510f2f4   James Morris   security: Convert...
1372
  }
292f902a4   Miklos Szeredi   ovl: call secutir...
1373
  EXPORT_SYMBOL_GPL(security_file_ioctl);
20510f2f4   James Morris   security: Convert...
1374

98de59bfe   Al Viro   take calculation ...
1375
  static inline unsigned long mmap_prot(struct file *file, unsigned long prot)
20510f2f4   James Morris   security: Convert...
1376
  {
8b3ec6814   Al Viro   take security_mma...
1377
  	/*
98de59bfe   Al Viro   take calculation ...
1378
1379
  	 * Does we have PROT_READ and does the application expect
  	 * it to imply PROT_EXEC?  If not, nothing to talk about...
8b3ec6814   Al Viro   take security_mma...
1380
  	 */
98de59bfe   Al Viro   take calculation ...
1381
1382
  	if ((prot & (PROT_READ | PROT_EXEC)) != PROT_READ)
  		return prot;
8b3ec6814   Al Viro   take security_mma...
1383
  	if (!(current->personality & READ_IMPLIES_EXEC))
98de59bfe   Al Viro   take calculation ...
1384
1385
1386
1387
1388
1389
1390
1391
  		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
b4caecd48   Christoph Hellwig   fs: introduce f_o...
1392
  	 * NOMMU_MAP_EXEC (== VM_MAYEXEC) in this case
98de59bfe   Al Viro   take calculation ...
1393
  	 */
90f8572b0   Eric W. Biederman   vfs: Commit to ne...
1394
  	if (!path_noexec(&file->f_path)) {
8b3ec6814   Al Viro   take security_mma...
1395
  #ifndef CONFIG_MMU
b4caecd48   Christoph Hellwig   fs: introduce f_o...
1396
1397
1398
1399
1400
  		if (file->f_op->mmap_capabilities) {
  			unsigned caps = file->f_op->mmap_capabilities(file);
  			if (!(caps & NOMMU_MAP_EXEC))
  				return prot;
  		}
8b3ec6814   Al Viro   take security_mma...
1401
  #endif
98de59bfe   Al Viro   take calculation ...
1402
  		return prot | PROT_EXEC;
8b3ec6814   Al Viro   take security_mma...
1403
  	}
98de59bfe   Al Viro   take calculation ...
1404
1405
1406
1407
1408
1409
1410
1411
  	/* 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;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1412
  	ret = call_int_hook(mmap_file, 0, file, prot,
98de59bfe   Al Viro   take calculation ...
1413
  					mmap_prot(file, prot), flags);
6c21a7fb4   Mimi Zohar   LSM: imbed ima ca...
1414
1415
1416
  	if (ret)
  		return ret;
  	return ima_file_mmap(file, prot);
20510f2f4   James Morris   security: Convert...
1417
  }
e5467859f   Al Viro   split ->file_mmap...
1418
1419
  int security_mmap_addr(unsigned long addr)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1420
  	return call_int_hook(mmap_addr, 0, addr);
e5467859f   Al Viro   split ->file_mmap...
1421
  }
20510f2f4   James Morris   security: Convert...
1422
1423
1424
  int security_file_mprotect(struct vm_area_struct *vma, unsigned long reqprot,
  			    unsigned long prot)
  {
8eb613c0b   Mimi Zohar   ima: verify mprot...
1425
1426
1427
1428
1429
1430
  	int ret;
  
  	ret = call_int_hook(file_mprotect, 0, vma, reqprot, prot);
  	if (ret)
  		return ret;
  	return ima_file_mprotect(vma, prot);
20510f2f4   James Morris   security: Convert...
1431
1432
1433
1434
  }
  
  int security_file_lock(struct file *file, unsigned int cmd)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1435
  	return call_int_hook(file_lock, 0, file, cmd);
20510f2f4   James Morris   security: Convert...
1436
1437
1438
1439
  }
  
  int security_file_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1440
  	return call_int_hook(file_fcntl, 0, file, cmd, arg);
20510f2f4   James Morris   security: Convert...
1441
  }
e0b93eddf   Jeff Layton   security: make se...
1442
  void security_file_set_fowner(struct file *file)
20510f2f4   James Morris   security: Convert...
1443
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1444
  	call_void_hook(file_set_fowner, file);
20510f2f4   James Morris   security: Convert...
1445
1446
1447
1448
1449
  }
  
  int security_file_send_sigiotask(struct task_struct *tsk,
  				  struct fown_struct *fown, int sig)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1450
  	return call_int_hook(file_send_sigiotask, 0, tsk, fown, sig);
20510f2f4   James Morris   security: Convert...
1451
1452
1453
1454
  }
  
  int security_file_receive(struct file *file)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1455
  	return call_int_hook(file_receive, 0, file);
20510f2f4   James Morris   security: Convert...
1456
  }
e3f20ae21   Al Viro   security_file_ope...
1457
  int security_file_open(struct file *file)
20510f2f4   James Morris   security: Convert...
1458
  {
c4ec54b40   Eric Paris   fsnotify: new fsn...
1459
  	int ret;
948176920   Al Viro   ->file_open(): lo...
1460
  	ret = call_int_hook(file_open, 0, file);
c4ec54b40   Eric Paris   fsnotify: new fsn...
1461
1462
1463
1464
  	if (ret)
  		return ret;
  
  	return fsnotify_perm(file, MAY_OPEN);
20510f2f4   James Morris   security: Convert...
1465
  }
e4e55b47e   Tetsuo Handa   LSM: Revive secur...
1466
1467
  int security_task_alloc(struct task_struct *task, unsigned long clone_flags)
  {
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
1468
1469
1470
1471
1472
1473
1474
1475
  	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;
e4e55b47e   Tetsuo Handa   LSM: Revive secur...
1476
  }
1a2a4d06e   Kees Cook   security: create ...
1477
1478
  void security_task_free(struct task_struct *task)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1479
  	call_void_hook(task_free, task);
f4ad8f2c4   Casey Schaufler   LSM: Infrastructu...
1480
1481
1482
  
  	kfree(task->security);
  	task->security = NULL;
1a2a4d06e   Kees Cook   security: create ...
1483
  }
ee18d64c1   David Howells   KEYS: Add a keyct...
1484
1485
  int security_cred_alloc_blank(struct cred *cred, gfp_t gfp)
  {
bbd3662a8   Casey Schaufler   Infrastructure ma...
1486
1487
1488
1489
1490
1491
  	int rc = lsm_cred_alloc(cred, gfp);
  
  	if (rc)
  		return rc;
  
  	rc = call_int_hook(cred_alloc_blank, 0, cred, gfp);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
1492
  	if (unlikely(rc))
bbd3662a8   Casey Schaufler   Infrastructure ma...
1493
1494
  		security_cred_free(cred);
  	return rc;
ee18d64c1   David Howells   KEYS: Add a keyct...
1495
  }
d84f4f992   David Howells   CRED: Inaugurate ...
1496
  void security_cred_free(struct cred *cred)
20510f2f4   James Morris   security: Convert...
1497
  {
a5795fd38   James Morris   LSM: Check for NU...
1498
1499
1500
1501
1502
1503
  	/*
  	 * 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;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1504
  	call_void_hook(cred_free, cred);
bbd3662a8   Casey Schaufler   Infrastructure ma...
1505
1506
1507
  
  	kfree(cred->security);
  	cred->security = NULL;
20510f2f4   James Morris   security: Convert...
1508
  }
d84f4f992   David Howells   CRED: Inaugurate ...
1509
  int security_prepare_creds(struct cred *new, const struct cred *old, gfp_t gfp)
20510f2f4   James Morris   security: Convert...
1510
  {
bbd3662a8   Casey Schaufler   Infrastructure ma...
1511
1512
1513
1514
1515
1516
  	int rc = lsm_cred_alloc(new, gfp);
  
  	if (rc)
  		return rc;
  
  	rc = call_int_hook(cred_prepare, 0, new, old, gfp);
33bf60cab   Casey Schaufler   LSM: Infrastructu...
1517
  	if (unlikely(rc))
bbd3662a8   Casey Schaufler   Infrastructure ma...
1518
1519
  		security_cred_free(new);
  	return rc;
d84f4f992   David Howells   CRED: Inaugurate ...
1520
  }
ee18d64c1   David Howells   KEYS: Add a keyct...
1521
1522
  void security_transfer_creds(struct cred *new, const struct cred *old)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1523
  	call_void_hook(cred_transfer, new, old);
ee18d64c1   David Howells   KEYS: Add a keyct...
1524
  }
3ec301132   Matthew Garrett   security: Add a c...
1525
1526
1527
1528
1529
1530
  void security_cred_getsecid(const struct cred *c, u32 *secid)
  {
  	*secid = 0;
  	call_void_hook(cred_getsecid, c, secid);
  }
  EXPORT_SYMBOL(security_cred_getsecid);
3a3b7ce93   David Howells   CRED: Allow kerne...
1531
1532
  int security_kernel_act_as(struct cred *new, u32 secid)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1533
  	return call_int_hook(kernel_act_as, 0, new, secid);
3a3b7ce93   David Howells   CRED: Allow kerne...
1534
1535
1536
1537
  }
  
  int security_kernel_create_files_as(struct cred *new, struct inode *inode)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1538
  	return call_int_hook(kernel_create_files_as, 0, new, inode);
3a3b7ce93   David Howells   CRED: Allow kerne...
1539
  }
dd8dbf2e6   Eric Paris   security: report ...
1540
  int security_kernel_module_request(char *kmod_name)
9188499cd   Eric Paris   security: introdu...
1541
  {
6eb864c1d   Mikhail Kurinnoi   integrity: preven...
1542
1543
1544
1545
1546
1547
  	int ret;
  
  	ret = call_int_hook(kernel_module_request, 0, kmod_name);
  	if (ret)
  		return ret;
  	return integrity_kernel_module_request(kmod_name);
9188499cd   Eric Paris   security: introdu...
1548
  }
2039bda1f   Kees Cook   LSM: Add "content...
1549
1550
  int security_kernel_read_file(struct file *file, enum kernel_read_file_id id,
  			      bool contents)
39eeb4fb9   Mimi Zohar   security: define ...
1551
1552
  {
  	int ret;
2039bda1f   Kees Cook   LSM: Add "content...
1553
  	ret = call_int_hook(kernel_read_file, 0, file, id, contents);
39eeb4fb9   Mimi Zohar   security: define ...
1554
1555
  	if (ret)
  		return ret;
2039bda1f   Kees Cook   LSM: Add "content...
1556
  	return ima_read_file(file, id, contents);
39eeb4fb9   Mimi Zohar   security: define ...
1557
1558
  }
  EXPORT_SYMBOL_GPL(security_kernel_read_file);
bc8ca5b92   Mimi Zohar   vfs: define kerne...
1559
1560
  int security_kernel_post_read_file(struct file *file, char *buf, loff_t size,
  				   enum kernel_read_file_id id)
b44a7dfc6   Mimi Zohar   vfs: define a gen...
1561
  {
cf2222178   Mimi Zohar   ima: define a new...
1562
1563
1564
1565
1566
1567
  	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);
b44a7dfc6   Mimi Zohar   vfs: define a gen...
1568
1569
  }
  EXPORT_SYMBOL_GPL(security_kernel_post_read_file);
b64fcae74   Kees Cook   LSM: Introduce ke...
1570
  int security_kernel_load_data(enum kernel_load_data_id id, bool contents)
377179cd2   Mimi Zohar   security: define ...
1571
  {
16c267aac   Mimi Zohar   ima: based on pol...
1572
  	int ret;
b64fcae74   Kees Cook   LSM: Introduce ke...
1573
  	ret = call_int_hook(kernel_load_data, 0, id, contents);
16c267aac   Mimi Zohar   ima: based on pol...
1574
1575
  	if (ret)
  		return ret;
b64fcae74   Kees Cook   LSM: Introduce ke...
1576
  	return ima_load_data(id, contents);
377179cd2   Mimi Zohar   security: define ...
1577
  }
83a68a067   Arnd Bergmann   security: export ...
1578
  EXPORT_SYMBOL_GPL(security_kernel_load_data);
377179cd2   Mimi Zohar   security: define ...
1579

b64fcae74   Kees Cook   LSM: Introduce ke...
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
  int security_kernel_post_load_data(char *buf, loff_t size,
  				   enum kernel_load_data_id id,
  				   char *description)
  {
  	int ret;
  
  	ret = call_int_hook(kernel_post_load_data, 0, buf, size, id,
  			    description);
  	if (ret)
  		return ret;
  	return ima_post_load_data(buf, size, id, description);
  }
  EXPORT_SYMBOL_GPL(security_kernel_post_load_data);
d84f4f992   David Howells   CRED: Inaugurate ...
1593
1594
  int security_task_fix_setuid(struct cred *new, const struct cred *old,
  			     int flags)
20510f2f4   James Morris   security: Convert...
1595
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1596
  	return call_int_hook(task_fix_setuid, 0, new, old, flags);
20510f2f4   James Morris   security: Convert...
1597
  }
39030e135   Thomas Cedeno   security: Add LSM...
1598
1599
1600
1601
1602
  int security_task_fix_setgid(struct cred *new, const struct cred *old,
  				 int flags)
  {
  	return call_int_hook(task_fix_setgid, 0, new, old, flags);
  }
20510f2f4   James Morris   security: Convert...
1603
1604
  int security_task_setpgid(struct task_struct *p, pid_t pgid)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1605
  	return call_int_hook(task_setpgid, 0, p, pgid);
20510f2f4   James Morris   security: Convert...
1606
1607
1608
1609
  }
  
  int security_task_getpgid(struct task_struct *p)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1610
  	return call_int_hook(task_getpgid, 0, p);
20510f2f4   James Morris   security: Convert...
1611
1612
1613
1614
  }
  
  int security_task_getsid(struct task_struct *p)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1615
  	return call_int_hook(task_getsid, 0, p);
20510f2f4   James Morris   security: Convert...
1616
1617
1618
1619
  }
  
  void security_task_getsecid(struct task_struct *p, u32 *secid)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1620
  	*secid = 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1621
  	call_void_hook(task_getsecid, p, secid);
20510f2f4   James Morris   security: Convert...
1622
1623
  }
  EXPORT_SYMBOL(security_task_getsecid);
20510f2f4   James Morris   security: Convert...
1624
1625
  int security_task_setnice(struct task_struct *p, int nice)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1626
  	return call_int_hook(task_setnice, 0, p, nice);
20510f2f4   James Morris   security: Convert...
1627
1628
1629
1630
  }
  
  int security_task_setioprio(struct task_struct *p, int ioprio)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1631
  	return call_int_hook(task_setioprio, 0, p, ioprio);
20510f2f4   James Morris   security: Convert...
1632
1633
1634
1635
  }
  
  int security_task_getioprio(struct task_struct *p)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1636
  	return call_int_hook(task_getioprio, 0, p);
20510f2f4   James Morris   security: Convert...
1637
  }
791ec491c   Stephen Smalley   prlimit,security,...
1638
1639
1640
1641
1642
  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);
  }
8fd00b4d7   Jiri Slaby   rlimits: security...
1643
1644
  int security_task_setrlimit(struct task_struct *p, unsigned int resource,
  		struct rlimit *new_rlim)
20510f2f4   James Morris   security: Convert...
1645
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1646
  	return call_int_hook(task_setrlimit, 0, p, resource, new_rlim);
20510f2f4   James Morris   security: Convert...
1647
  }
b0ae19811   KOSAKI Motohiro   security: remove ...
1648
  int security_task_setscheduler(struct task_struct *p)
20510f2f4   James Morris   security: Convert...
1649
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1650
  	return call_int_hook(task_setscheduler, 0, p);
20510f2f4   James Morris   security: Convert...
1651
1652
1653
1654
  }
  
  int security_task_getscheduler(struct task_struct *p)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1655
  	return call_int_hook(task_getscheduler, 0, p);
20510f2f4   James Morris   security: Convert...
1656
1657
1658
1659
  }
  
  int security_task_movememory(struct task_struct *p)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1660
  	return call_int_hook(task_movememory, 0, p);
20510f2f4   James Morris   security: Convert...
1661
  }
ae7795bc6   Eric W. Biederman   signal: Distingui...
1662
  int security_task_kill(struct task_struct *p, struct kernel_siginfo *info,
6b4f3d010   Stephen Smalley   usb, signal, secu...
1663
  			int sig, const struct cred *cred)
20510f2f4   James Morris   security: Convert...
1664
  {
6b4f3d010   Stephen Smalley   usb, signal, secu...
1665
  	return call_int_hook(task_kill, 0, p, info, sig, cred);
20510f2f4   James Morris   security: Convert...
1666
  }
20510f2f4   James Morris   security: Convert...
1667
  int security_task_prctl(int option, unsigned long arg2, unsigned long arg3,
d84f4f992   David Howells   CRED: Inaugurate ...
1668
  			 unsigned long arg4, unsigned long arg5)
20510f2f4   James Morris   security: Convert...
1669
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1670
  	int thisrc;
98e828a06   KP Singh   security: Refacto...
1671
  	int rc = LSM_RET_DEFAULT(task_prctl);
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1672
  	struct security_hook_list *hp;
df0ce1733   Sargun Dhillon   security: convert...
1673
  	hlist_for_each_entry(hp, &security_hook_heads.task_prctl, list) {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1674
  		thisrc = hp->hook.task_prctl(option, arg2, arg3, arg4, arg5);
98e828a06   KP Singh   security: Refacto...
1675
  		if (thisrc != LSM_RET_DEFAULT(task_prctl)) {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1676
1677
1678
1679
1680
1681
  			rc = thisrc;
  			if (thisrc != 0)
  				break;
  		}
  	}
  	return rc;
20510f2f4   James Morris   security: Convert...
1682
1683
1684
1685
  }
  
  void security_task_to_inode(struct task_struct *p, struct inode *inode)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1686
  	call_void_hook(task_to_inode, p, inode);
20510f2f4   James Morris   security: Convert...
1687
1688
1689
1690
  }
  
  int security_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1691
  	return call_int_hook(ipc_permission, 0, ipcp, flag);
20510f2f4   James Morris   security: Convert...
1692
  }
8a076191f   Ahmed S. Darwish   LSM: Introduce in...
1693
1694
  void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1695
  	*secid = 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1696
  	call_void_hook(ipc_getsecid, ipcp, secid);
8a076191f   Ahmed S. Darwish   LSM: Introduce in...
1697
  }
20510f2f4   James Morris   security: Convert...
1698
1699
  int security_msg_msg_alloc(struct msg_msg *msg)
  {
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1700
1701
1702
1703
1704
1705
1706
1707
  	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;
20510f2f4   James Morris   security: Convert...
1708
1709
1710
1711
  }
  
  void security_msg_msg_free(struct msg_msg *msg)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1712
  	call_void_hook(msg_msg_free_security, msg);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1713
1714
  	kfree(msg->security);
  	msg->security = NULL;
20510f2f4   James Morris   security: Convert...
1715
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1716
  int security_msg_queue_alloc(struct kern_ipc_perm *msq)
20510f2f4   James Morris   security: Convert...
1717
  {
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1718
1719
1720
1721
1722
1723
1724
1725
  	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;
20510f2f4   James Morris   security: Convert...
1726
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1727
  void security_msg_queue_free(struct kern_ipc_perm *msq)
20510f2f4   James Morris   security: Convert...
1728
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1729
  	call_void_hook(msg_queue_free_security, msq);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1730
1731
  	kfree(msq->security);
  	msq->security = NULL;
20510f2f4   James Morris   security: Convert...
1732
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1733
  int security_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
20510f2f4   James Morris   security: Convert...
1734
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1735
  	return call_int_hook(msg_queue_associate, 0, msq, msqflg);
20510f2f4   James Morris   security: Convert...
1736
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1737
  int security_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
20510f2f4   James Morris   security: Convert...
1738
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1739
  	return call_int_hook(msg_queue_msgctl, 0, msq, cmd);
20510f2f4   James Morris   security: Convert...
1740
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1741
  int security_msg_queue_msgsnd(struct kern_ipc_perm *msq,
20510f2f4   James Morris   security: Convert...
1742
1743
  			       struct msg_msg *msg, int msqflg)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1744
  	return call_int_hook(msg_queue_msgsnd, 0, msq, msg, msqflg);
20510f2f4   James Morris   security: Convert...
1745
  }
d8c6e8543   Eric W. Biederman   msg/security: Pas...
1746
  int security_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
20510f2f4   James Morris   security: Convert...
1747
1748
  			       struct task_struct *target, long type, int mode)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1749
  	return call_int_hook(msg_queue_msgrcv, 0, msq, msg, target, type, mode);
20510f2f4   James Morris   security: Convert...
1750
  }
7191adff2   Eric W. Biederman   shm/security: Pas...
1751
  int security_shm_alloc(struct kern_ipc_perm *shp)
20510f2f4   James Morris   security: Convert...
1752
  {
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1753
1754
1755
1756
1757
1758
1759
1760
  	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;
20510f2f4   James Morris   security: Convert...
1761
  }
7191adff2   Eric W. Biederman   shm/security: Pas...
1762
  void security_shm_free(struct kern_ipc_perm *shp)
20510f2f4   James Morris   security: Convert...
1763
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1764
  	call_void_hook(shm_free_security, shp);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1765
1766
  	kfree(shp->security);
  	shp->security = NULL;
20510f2f4   James Morris   security: Convert...
1767
  }
7191adff2   Eric W. Biederman   shm/security: Pas...
1768
  int security_shm_associate(struct kern_ipc_perm *shp, int shmflg)
20510f2f4   James Morris   security: Convert...
1769
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1770
  	return call_int_hook(shm_associate, 0, shp, shmflg);
20510f2f4   James Morris   security: Convert...
1771
  }
7191adff2   Eric W. Biederman   shm/security: Pas...
1772
  int security_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
20510f2f4   James Morris   security: Convert...
1773
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1774
  	return call_int_hook(shm_shmctl, 0, shp, cmd);
20510f2f4   James Morris   security: Convert...
1775
  }
7191adff2   Eric W. Biederman   shm/security: Pas...
1776
  int security_shm_shmat(struct kern_ipc_perm *shp, char __user *shmaddr, int shmflg)
20510f2f4   James Morris   security: Convert...
1777
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1778
  	return call_int_hook(shm_shmat, 0, shp, shmaddr, shmflg);
20510f2f4   James Morris   security: Convert...
1779
  }
aefad9593   Eric W. Biederman   sem/security: Pas...
1780
  int security_sem_alloc(struct kern_ipc_perm *sma)
20510f2f4   James Morris   security: Convert...
1781
  {
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1782
1783
1784
1785
1786
1787
1788
1789
  	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;
20510f2f4   James Morris   security: Convert...
1790
  }
aefad9593   Eric W. Biederman   sem/security: Pas...
1791
  void security_sem_free(struct kern_ipc_perm *sma)
20510f2f4   James Morris   security: Convert...
1792
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1793
  	call_void_hook(sem_free_security, sma);
ecd5f82e0   Casey Schaufler   LSM: Infrastructu...
1794
1795
  	kfree(sma->security);
  	sma->security = NULL;
20510f2f4   James Morris   security: Convert...
1796
  }
aefad9593   Eric W. Biederman   sem/security: Pas...
1797
  int security_sem_associate(struct kern_ipc_perm *sma, int semflg)
20510f2f4   James Morris   security: Convert...
1798
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1799
  	return call_int_hook(sem_associate, 0, sma, semflg);
20510f2f4   James Morris   security: Convert...
1800
  }
aefad9593   Eric W. Biederman   sem/security: Pas...
1801
  int security_sem_semctl(struct kern_ipc_perm *sma, int cmd)
20510f2f4   James Morris   security: Convert...
1802
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1803
  	return call_int_hook(sem_semctl, 0, sma, cmd);
20510f2f4   James Morris   security: Convert...
1804
  }
aefad9593   Eric W. Biederman   sem/security: Pas...
1805
  int security_sem_semop(struct kern_ipc_perm *sma, struct sembuf *sops,
20510f2f4   James Morris   security: Convert...
1806
1807
  			unsigned nsops, int alter)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1808
  	return call_int_hook(sem_semop, 0, sma, sops, nsops, alter);
20510f2f4   James Morris   security: Convert...
1809
1810
1811
1812
1813
1814
  }
  
  void security_d_instantiate(struct dentry *dentry, struct inode *inode)
  {
  	if (unlikely(inode && IS_PRIVATE(inode)))
  		return;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1815
  	call_void_hook(d_instantiate, dentry, inode);
20510f2f4   James Morris   security: Convert...
1816
1817
  }
  EXPORT_SYMBOL(security_d_instantiate);
6d9c939db   Casey Schaufler   procfs: add smack...
1818
1819
  int security_getprocattr(struct task_struct *p, const char *lsm, char *name,
  				char **value)
20510f2f4   James Morris   security: Convert...
1820
  {
6d9c939db   Casey Schaufler   procfs: add smack...
1821
1822
1823
1824
1825
1826
1827
  	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);
  	}
98e828a06   KP Singh   security: Refacto...
1828
  	return LSM_RET_DEFAULT(getprocattr);
20510f2f4   James Morris   security: Convert...
1829
  }
6d9c939db   Casey Schaufler   procfs: add smack...
1830
1831
  int security_setprocattr(const char *lsm, const char *name, void *value,
  			 size_t size)
20510f2f4   James Morris   security: Convert...
1832
  {
6d9c939db   Casey Schaufler   procfs: add smack...
1833
1834
1835
1836
1837
1838
1839
  	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);
  	}
98e828a06   KP Singh   security: Refacto...
1840
  	return LSM_RET_DEFAULT(setprocattr);
20510f2f4   James Morris   security: Convert...
1841
1842
1843
1844
  }
  
  int security_netlink_send(struct sock *sk, struct sk_buff *skb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1845
  	return call_int_hook(netlink_send, 0, sk, skb);
20510f2f4   James Morris   security: Convert...
1846
  }
20510f2f4   James Morris   security: Convert...
1847

746df9b59   David Quigley   Security: Add Hoo...
1848
1849
  int security_ismaclabel(const char *name)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1850
  	return call_int_hook(ismaclabel, 0, name);
746df9b59   David Quigley   Security: Add Hoo...
1851
1852
  }
  EXPORT_SYMBOL(security_ismaclabel);
20510f2f4   James Morris   security: Convert...
1853
1854
  int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
  {
0550cfe8c   KP Singh   security: Fix hoo...
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
  	struct security_hook_list *hp;
  	int rc;
  
  	/*
  	 * Currently, only one LSM can implement secid_to_secctx (i.e this
  	 * LSM hook is not "stackable").
  	 */
  	hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) {
  		rc = hp->hook.secid_to_secctx(secid, secdata, seclen);
  		if (rc != LSM_RET_DEFAULT(secid_to_secctx))
  			return rc;
  	}
  
  	return LSM_RET_DEFAULT(secid_to_secctx);
20510f2f4   James Morris   security: Convert...
1869
1870
  }
  EXPORT_SYMBOL(security_secid_to_secctx);
7bf570dc8   David Howells   Security: Make se...
1871
  int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
63cb34492   David Howells   security: add a s...
1872
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1873
  	*secid = 0;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1874
  	return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid);
63cb34492   David Howells   security: add a s...
1875
1876
  }
  EXPORT_SYMBOL(security_secctx_to_secid);
20510f2f4   James Morris   security: Convert...
1877
1878
  void security_release_secctx(char *secdata, u32 seclen)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1879
  	call_void_hook(release_secctx, secdata, seclen);
20510f2f4   James Morris   security: Convert...
1880
1881
  }
  EXPORT_SYMBOL(security_release_secctx);
6f3be9f56   Andreas Gruenbacher   security: Add hoo...
1882
1883
1884
1885
1886
  void security_inode_invalidate_secctx(struct inode *inode)
  {
  	call_void_hook(inode_invalidate_secctx, inode);
  }
  EXPORT_SYMBOL(security_inode_invalidate_secctx);
1ee65e37e   David P. Quigley   LSM/SELinux: inod...
1887
1888
  int security_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1889
  	return call_int_hook(inode_notifysecctx, 0, inode, ctx, ctxlen);
1ee65e37e   David P. Quigley   LSM/SELinux: inod...
1890
1891
1892
1893
1894
  }
  EXPORT_SYMBOL(security_inode_notifysecctx);
  
  int security_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1895
  	return call_int_hook(inode_setsecctx, 0, dentry, ctx, ctxlen);
1ee65e37e   David P. Quigley   LSM/SELinux: inod...
1896
1897
1898
1899
1900
  }
  EXPORT_SYMBOL(security_inode_setsecctx);
  
  int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
1901
  	return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen);
1ee65e37e   David P. Quigley   LSM/SELinux: inod...
1902
1903
  }
  EXPORT_SYMBOL(security_inode_getsecctx);
344fa64ef   David Howells   security: Add a h...
1904
1905
1906
1907
1908
1909
1910
1911
  #ifdef CONFIG_WATCH_QUEUE
  int security_post_notification(const struct cred *w_cred,
  			       const struct cred *cred,
  			       struct watch_notification *n)
  {
  	return call_int_hook(post_notification, 0, w_cred, cred, n);
  }
  #endif /* CONFIG_WATCH_QUEUE */
998f50407   David Howells   security: Add hoo...
1912
1913
1914
1915
1916
1917
  #ifdef CONFIG_KEY_NOTIFICATIONS
  int security_watch_key(struct key *key)
  {
  	return call_int_hook(watch_key, 0, key);
  }
  #endif
20510f2f4   James Morris   security: Convert...
1918
  #ifdef CONFIG_SECURITY_NETWORK
3610cda53   David S. Miller   af_unix: Avoid so...
1919
  int security_unix_stream_connect(struct sock *sock, struct sock *other, struct sock *newsk)
20510f2f4   James Morris   security: Convert...
1920
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1921
  	return call_int_hook(unix_stream_connect, 0, sock, other, newsk);
20510f2f4   James Morris   security: Convert...
1922
1923
1924
1925
1926
  }
  EXPORT_SYMBOL(security_unix_stream_connect);
  
  int security_unix_may_send(struct socket *sock,  struct socket *other)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1927
  	return call_int_hook(unix_may_send, 0, sock, other);
20510f2f4   James Morris   security: Convert...
1928
1929
1930
1931
1932
  }
  EXPORT_SYMBOL(security_unix_may_send);
  
  int security_socket_create(int family, int type, int protocol, int kern)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1933
  	return call_int_hook(socket_create, 0, family, type, protocol, kern);
20510f2f4   James Morris   security: Convert...
1934
1935
1936
1937
1938
  }
  
  int security_socket_post_create(struct socket *sock, int family,
  				int type, int protocol, int kern)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1939
  	return call_int_hook(socket_post_create, 0, sock, family, type,
20510f2f4   James Morris   security: Convert...
1940
1941
  						protocol, kern);
  }
aae7cfcbb   David Herrmann   security: add hoo...
1942
1943
1944
1945
1946
  int security_socket_socketpair(struct socket *socka, struct socket *sockb)
  {
  	return call_int_hook(socket_socketpair, 0, socka, sockb);
  }
  EXPORT_SYMBOL(security_socket_socketpair);
20510f2f4   James Morris   security: Convert...
1947
1948
  int security_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1949
  	return call_int_hook(socket_bind, 0, sock, address, addrlen);
20510f2f4   James Morris   security: Convert...
1950
1951
1952
1953
  }
  
  int security_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1954
  	return call_int_hook(socket_connect, 0, sock, address, addrlen);
20510f2f4   James Morris   security: Convert...
1955
1956
1957
1958
  }
  
  int security_socket_listen(struct socket *sock, int backlog)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1959
  	return call_int_hook(socket_listen, 0, sock, backlog);
20510f2f4   James Morris   security: Convert...
1960
1961
1962
1963
  }
  
  int security_socket_accept(struct socket *sock, struct socket *newsock)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1964
  	return call_int_hook(socket_accept, 0, sock, newsock);
20510f2f4   James Morris   security: Convert...
1965
  }
20510f2f4   James Morris   security: Convert...
1966
1967
  int security_socket_sendmsg(struct socket *sock, struct msghdr *msg, int size)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1968
  	return call_int_hook(socket_sendmsg, 0, sock, msg, size);
20510f2f4   James Morris   security: Convert...
1969
1970
1971
1972
1973
  }
  
  int security_socket_recvmsg(struct socket *sock, struct msghdr *msg,
  			    int size, int flags)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1974
  	return call_int_hook(socket_recvmsg, 0, sock, msg, size, flags);
20510f2f4   James Morris   security: Convert...
1975
1976
1977
1978
  }
  
  int security_socket_getsockname(struct socket *sock)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1979
  	return call_int_hook(socket_getsockname, 0, sock);
20510f2f4   James Morris   security: Convert...
1980
1981
1982
1983
  }
  
  int security_socket_getpeername(struct socket *sock)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1984
  	return call_int_hook(socket_getpeername, 0, sock);
20510f2f4   James Morris   security: Convert...
1985
1986
1987
1988
  }
  
  int security_socket_getsockopt(struct socket *sock, int level, int optname)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1989
  	return call_int_hook(socket_getsockopt, 0, sock, level, optname);
20510f2f4   James Morris   security: Convert...
1990
1991
1992
1993
  }
  
  int security_socket_setsockopt(struct socket *sock, int level, int optname)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1994
  	return call_int_hook(socket_setsockopt, 0, sock, level, optname);
20510f2f4   James Morris   security: Convert...
1995
1996
1997
1998
  }
  
  int security_socket_shutdown(struct socket *sock, int how)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
1999
  	return call_int_hook(socket_shutdown, 0, sock, how);
20510f2f4   James Morris   security: Convert...
2000
2001
2002
2003
  }
  
  int security_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2004
  	return call_int_hook(socket_sock_rcv_skb, 0, sk, skb);
20510f2f4   James Morris   security: Convert...
2005
2006
2007
2008
2009
2010
  }
  EXPORT_SYMBOL(security_sock_rcv_skb);
  
  int security_socket_getpeersec_stream(struct socket *sock, char __user *optval,
  				      int __user *optlen, unsigned len)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2011
2012
  	return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock,
  				optval, optlen, len);
20510f2f4   James Morris   security: Convert...
2013
2014
2015
2016
  }
  
  int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
  {
e308fd3bb   Jan Beulich   LSM: restore cert...
2017
2018
  	return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock,
  			     skb, secid);
20510f2f4   James Morris   security: Convert...
2019
2020
2021
2022
2023
  }
  EXPORT_SYMBOL(security_socket_getpeersec_dgram);
  
  int security_sk_alloc(struct sock *sk, int family, gfp_t priority)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2024
  	return call_int_hook(sk_alloc_security, 0, sk, family, priority);
20510f2f4   James Morris   security: Convert...
2025
2026
2027
2028
  }
  
  void security_sk_free(struct sock *sk)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2029
  	call_void_hook(sk_free_security, sk);
20510f2f4   James Morris   security: Convert...
2030
2031
2032
2033
  }
  
  void security_sk_clone(const struct sock *sk, struct sock *newsk)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2034
  	call_void_hook(sk_clone_security, sk, newsk);
20510f2f4   James Morris   security: Convert...
2035
  }
6230c9b4f   Paul Moore   bluetooth: Proper...
2036
  EXPORT_SYMBOL(security_sk_clone);
20510f2f4   James Morris   security: Convert...
2037
2038
2039
  
  void security_sk_classify_flow(struct sock *sk, struct flowi *fl)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2040
  	call_void_hook(sk_getsecid, sk, &fl->flowi_secid);
20510f2f4   James Morris   security: Convert...
2041
2042
2043
2044
2045
  }
  EXPORT_SYMBOL(security_sk_classify_flow);
  
  void security_req_classify_flow(const struct request_sock *req, struct flowi *fl)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2046
  	call_void_hook(req_classify_flow, req, fl);
20510f2f4   James Morris   security: Convert...
2047
2048
2049
2050
2051
  }
  EXPORT_SYMBOL(security_req_classify_flow);
  
  void security_sock_graft(struct sock *sk, struct socket *parent)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2052
  	call_void_hook(sock_graft, sk, parent);
20510f2f4   James Morris   security: Convert...
2053
2054
2055
2056
2057
2058
  }
  EXPORT_SYMBOL(security_sock_graft);
  
  int security_inet_conn_request(struct sock *sk,
  			struct sk_buff *skb, struct request_sock *req)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2059
  	return call_int_hook(inet_conn_request, 0, sk, skb, req);
20510f2f4   James Morris   security: Convert...
2060
2061
2062
2063
2064
2065
  }
  EXPORT_SYMBOL(security_inet_conn_request);
  
  void security_inet_csk_clone(struct sock *newsk,
  			const struct request_sock *req)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2066
  	call_void_hook(inet_csk_clone, newsk, req);
20510f2f4   James Morris   security: Convert...
2067
2068
2069
2070
2071
  }
  
  void security_inet_conn_established(struct sock *sk,
  			struct sk_buff *skb)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2072
  	call_void_hook(inet_conn_established, sk, skb);
20510f2f4   James Morris   security: Convert...
2073
  }
72e89f500   Richard Haines   security: Add sup...
2074
  EXPORT_SYMBOL(security_inet_conn_established);
20510f2f4   James Morris   security: Convert...
2075

2606fd1fa   Eric Paris   secmark: make sec...
2076
2077
  int security_secmark_relabel_packet(u32 secid)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2078
  	return call_int_hook(secmark_relabel_packet, 0, secid);
2606fd1fa   Eric Paris   secmark: make sec...
2079
2080
2081
2082
2083
  }
  EXPORT_SYMBOL(security_secmark_relabel_packet);
  
  void security_secmark_refcount_inc(void)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2084
  	call_void_hook(secmark_refcount_inc);
2606fd1fa   Eric Paris   secmark: make sec...
2085
2086
2087
2088
2089
  }
  EXPORT_SYMBOL(security_secmark_refcount_inc);
  
  void security_secmark_refcount_dec(void)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2090
  	call_void_hook(secmark_refcount_dec);
2606fd1fa   Eric Paris   secmark: make sec...
2091
2092
  }
  EXPORT_SYMBOL(security_secmark_refcount_dec);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2093
2094
  int security_tun_dev_alloc_security(void **security)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2095
  	return call_int_hook(tun_dev_alloc_security, 0, security);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2096
2097
2098
2099
2100
  }
  EXPORT_SYMBOL(security_tun_dev_alloc_security);
  
  void security_tun_dev_free_security(void *security)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2101
  	call_void_hook(tun_dev_free_security, security);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2102
2103
  }
  EXPORT_SYMBOL(security_tun_dev_free_security);
2b980dbd7   Paul Moore   lsm: Add hooks to...
2104
2105
  int security_tun_dev_create(void)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2106
  	return call_int_hook(tun_dev_create, 0);
2b980dbd7   Paul Moore   lsm: Add hooks to...
2107
2108
  }
  EXPORT_SYMBOL(security_tun_dev_create);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2109
  int security_tun_dev_attach_queue(void *security)
2b980dbd7   Paul Moore   lsm: Add hooks to...
2110
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2111
  	return call_int_hook(tun_dev_attach_queue, 0, security);
2b980dbd7   Paul Moore   lsm: Add hooks to...
2112
  }
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2113
  EXPORT_SYMBOL(security_tun_dev_attach_queue);
2b980dbd7   Paul Moore   lsm: Add hooks to...
2114

5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2115
  int security_tun_dev_attach(struct sock *sk, void *security)
2b980dbd7   Paul Moore   lsm: Add hooks to...
2116
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2117
  	return call_int_hook(tun_dev_attach, 0, sk, security);
2b980dbd7   Paul Moore   lsm: Add hooks to...
2118
2119
  }
  EXPORT_SYMBOL(security_tun_dev_attach);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2120
2121
  int security_tun_dev_open(void *security)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2122
  	return call_int_hook(tun_dev_open, 0, security);
5dbbaf2de   Paul Moore   tun: fix LSM/SELi...
2123
2124
  }
  EXPORT_SYMBOL(security_tun_dev_open);
72e89f500   Richard Haines   security: Add sup...
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
  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);
20510f2f4   James Morris   security: Convert...
2145
  #endif	/* CONFIG_SECURITY_NETWORK */
d291f1a65   Daniel Jurgens   IB/core: Enforce ...
2146
2147
2148
2149
2150
2151
2152
  #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);
47a2b338f   Daniel Jurgens   IB/core: Enforce ...
2153
2154
2155
2156
2157
  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);
d291f1a65   Daniel Jurgens   IB/core: Enforce ...
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
  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 */
20510f2f4   James Morris   security: Convert...
2170
  #ifdef CONFIG_SECURITY_NETWORK_XFRM
52a4c6404   Nikolay Aleksandrov   selinux: add gfp ...
2171
2172
2173
  int security_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
  			       struct xfrm_user_sec_ctx *sec_ctx,
  			       gfp_t gfp)
20510f2f4   James Morris   security: Convert...
2174
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2175
  	return call_int_hook(xfrm_policy_alloc_security, 0, ctxp, sec_ctx, gfp);
20510f2f4   James Morris   security: Convert...
2176
2177
  }
  EXPORT_SYMBOL(security_xfrm_policy_alloc);
03e1ad7b5   Paul Moore   LSM: Make the Lab...
2178
2179
  int security_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,
  			      struct xfrm_sec_ctx **new_ctxp)
20510f2f4   James Morris   security: Convert...
2180
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2181
  	return call_int_hook(xfrm_policy_clone_security, 0, old_ctx, new_ctxp);
20510f2f4   James Morris   security: Convert...
2182
  }
03e1ad7b5   Paul Moore   LSM: Make the Lab...
2183
  void security_xfrm_policy_free(struct xfrm_sec_ctx *ctx)
20510f2f4   James Morris   security: Convert...
2184
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2185
  	call_void_hook(xfrm_policy_free_security, ctx);
20510f2f4   James Morris   security: Convert...
2186
2187
  }
  EXPORT_SYMBOL(security_xfrm_policy_free);
03e1ad7b5   Paul Moore   LSM: Make the Lab...
2188
  int security_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
20510f2f4   James Morris   security: Convert...
2189
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2190
  	return call_int_hook(xfrm_policy_delete_security, 0, ctx);
20510f2f4   James Morris   security: Convert...
2191
  }
2e5aa8660   Paul Moore   lsm: split the xf...
2192
2193
  int security_xfrm_state_alloc(struct xfrm_state *x,
  			      struct xfrm_user_sec_ctx *sec_ctx)
20510f2f4   James Morris   security: Convert...
2194
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2195
  	return call_int_hook(xfrm_state_alloc, 0, x, sec_ctx);
20510f2f4   James Morris   security: Convert...
2196
2197
2198
2199
2200
2201
  }
  EXPORT_SYMBOL(security_xfrm_state_alloc);
  
  int security_xfrm_state_alloc_acquire(struct xfrm_state *x,
  				      struct xfrm_sec_ctx *polsec, u32 secid)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2202
  	return call_int_hook(xfrm_state_alloc_acquire, 0, x, polsec, secid);
20510f2f4   James Morris   security: Convert...
2203
2204
2205
2206
  }
  
  int security_xfrm_state_delete(struct xfrm_state *x)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2207
  	return call_int_hook(xfrm_state_delete_security, 0, x);
20510f2f4   James Morris   security: Convert...
2208
2209
2210
2211
2212
  }
  EXPORT_SYMBOL(security_xfrm_state_delete);
  
  void security_xfrm_state_free(struct xfrm_state *x)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2213
  	call_void_hook(xfrm_state_free_security, x);
20510f2f4   James Morris   security: Convert...
2214
  }
03e1ad7b5   Paul Moore   LSM: Make the Lab...
2215
  int security_xfrm_policy_lookup(struct xfrm_sec_ctx *ctx, u32 fl_secid, u8 dir)
20510f2f4   James Morris   security: Convert...
2216
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2217
  	return call_int_hook(xfrm_policy_lookup, 0, ctx, fl_secid, dir);
20510f2f4   James Morris   security: Convert...
2218
2219
2220
  }
  
  int security_xfrm_state_pol_flow_match(struct xfrm_state *x,
e33f77042   David S. Miller   xfrm: Mark flowi ...
2221
2222
  				       struct xfrm_policy *xp,
  				       const struct flowi *fl)
20510f2f4   James Morris   security: Convert...
2223
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2224
  	struct security_hook_list *hp;
98e828a06   KP Singh   security: Refacto...
2225
  	int rc = LSM_RET_DEFAULT(xfrm_state_pol_flow_match);
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
  
  	/*
  	 * 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
  	 */
df0ce1733   Sargun Dhillon   security: convert...
2236
  	hlist_for_each_entry(hp, &security_hook_heads.xfrm_state_pol_flow_match,
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2237
2238
2239
2240
2241
  				list) {
  		rc = hp->hook.xfrm_state_pol_flow_match(x, xp, fl);
  		break;
  	}
  	return rc;
20510f2f4   James Morris   security: Convert...
2242
2243
2244
2245
  }
  
  int security_xfrm_decode_session(struct sk_buff *skb, u32 *secid)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2246
  	return call_int_hook(xfrm_decode_session, 0, skb, secid, 1);
20510f2f4   James Morris   security: Convert...
2247
2248
2249
2250
  }
  
  void security_skb_classify_flow(struct sk_buff *skb, struct flowi *fl)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2251
2252
  	int rc = call_int_hook(xfrm_decode_session, 0, skb, &fl->flowi_secid,
  				0);
20510f2f4   James Morris   security: Convert...
2253
2254
2255
2256
2257
2258
2259
2260
  
  	BUG_ON(rc);
  }
  EXPORT_SYMBOL(security_skb_classify_flow);
  
  #endif	/* CONFIG_SECURITY_NETWORK_XFRM */
  
  #ifdef CONFIG_KEYS
d84f4f992   David Howells   CRED: Inaugurate ...
2261
2262
  int security_key_alloc(struct key *key, const struct cred *cred,
  		       unsigned long flags)
20510f2f4   James Morris   security: Convert...
2263
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2264
  	return call_int_hook(key_alloc, 0, key, cred, flags);
20510f2f4   James Morris   security: Convert...
2265
2266
2267
2268
  }
  
  void security_key_free(struct key *key)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2269
  	call_void_hook(key_free, key);
20510f2f4   James Morris   security: Convert...
2270
  }
8c0637e95   David Howells   keys: Make the KE...
2271
2272
  int security_key_permission(key_ref_t key_ref, const struct cred *cred,
  			    enum key_need_perm need_perm)
20510f2f4   James Morris   security: Convert...
2273
  {
8c0637e95   David Howells   keys: Make the KE...
2274
  	return call_int_hook(key_permission, 0, key_ref, cred, need_perm);
20510f2f4   James Morris   security: Convert...
2275
  }
70a5bb72b   David Howells   keys: add keyctl ...
2276
2277
  int security_key_getsecurity(struct key *key, char **_buffer)
  {
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2278
  	*_buffer = NULL;
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2279
  	return call_int_hook(key_getsecurity, 0, key, _buffer);
70a5bb72b   David Howells   keys: add keyctl ...
2280
  }
20510f2f4   James Morris   security: Convert...
2281
  #endif	/* CONFIG_KEYS */
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2282
2283
2284
2285
2286
  
  #ifdef CONFIG_AUDIT
  
  int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2287
  	return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule);
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2288
2289
2290
2291
  }
  
  int security_audit_rule_known(struct audit_krule *krule)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2292
  	return call_int_hook(audit_rule_known, 0, krule);
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2293
2294
2295
2296
  }
  
  void security_audit_rule_free(void *lsmrule)
  {
f25fce3e8   Casey Schaufler   LSM: Introduce se...
2297
  	call_void_hook(audit_rule_free, lsmrule);
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2298
  }
90462a5bd   Richard Guy Briggs   audit: remove unu...
2299
  int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule)
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2300
  {
90462a5bd   Richard Guy Briggs   audit: remove unu...
2301
  	return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule);
03d37d25e   Ahmed S. Darwish   LSM/Audit: Introd...
2302
  }
b1d9e6b06   Casey Schaufler   LSM: Switch to li...
2303
  #endif /* CONFIG_AUDIT */
afdb09c72   Chenbo Feng   security: bpf: Ad...
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
  
  #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 */
9e47d31d6   Matthew Garrett   security: Add a "...
2335
2336
2337
2338
2339
2340
  
  int security_locked_down(enum lockdown_reason what)
  {
  	return call_int_hook(locked_down, 0, what);
  }
  EXPORT_SYMBOL(security_locked_down);
da97e1845   Joel Fernandes (Google)   perf_event: Add s...
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
  
  #ifdef CONFIG_PERF_EVENTS
  int security_perf_event_open(struct perf_event_attr *attr, int type)
  {
  	return call_int_hook(perf_event_open, 0, attr, type);
  }
  
  int security_perf_event_alloc(struct perf_event *event)
  {
  	return call_int_hook(perf_event_alloc, 0, event);
  }
  
  void security_perf_event_free(struct perf_event *event)
  {
  	call_void_hook(perf_event_free, event);
  }
  
  int security_perf_event_read(struct perf_event *event)
  {
  	return call_int_hook(perf_event_read, 0, event);
  }
  
  int security_perf_event_write(struct perf_event *event)
  {
  	return call_int_hook(perf_event_write, 0, event);
  }
  #endif /* CONFIG_PERF_EVENTS */