Blame view

kernel/auditsc.c 71.9 KB
85c8721ff   David Woodhouse   audit: update poi...
1
  /* auditsc.c -- System-call auditing support
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
   * Handles all system-call specific auditing features.
   *
   * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
73241ccca   Amy Griffis   [PATCH] Collect m...
5
   * Copyright 2005 Hewlett-Packard Development Company, L.P.
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
6
   * Copyright (C) 2005, 2006 IBM Corporation
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   * All Rights Reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   *
   * Written by Rickard E. (Rik) Faith <faith@redhat.com>
   *
   * Many of the ideas implemented here are from Stephen C. Tweedie,
   * especially the idea of avoiding a copy by using getname.
   *
   * The method for actual interception of syscall entry and exit (not in
   * this file -- see entry.S) is based on a GPL'd patch written by
   * okir@suse.de and Copyright 2003 SuSE Linux AG.
   *
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
32
33
34
   * POSIX message queue support added by George Wilson <ltcgcw@us.ibm.com>,
   * 2006.
   *
b63862f46   Dustin Kirkland   [PATCH] Filter ru...
35
36
37
   * The support of additional filter rules compares (>, <, >=, <=) was
   * added by Dustin Kirkland <dustin.kirkland@us.ibm.com>, 2005.
   *
73241ccca   Amy Griffis   [PATCH] Collect m...
38
39
   * Modified by Amy Griffis <amy.griffis@hp.com> to collect additional
   * filesystem information.
8c8570fb8   Dustin Kirkland   [PATCH] Capture s...
40
41
42
   *
   * Subject and object context labeling support added by <danjones@us.ibm.com>
   * and <dustin.kirkland@us.ibm.com> for LSPP certification compliance.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
   */
f952d10ff   Richard Guy Briggs   audit: Use more c...
44
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  #include <asm/types.h>
60063497a   Arun Sharma   atomic: use <linu...
47
  #include <linux/atomic.h>
73241ccca   Amy Griffis   [PATCH] Collect m...
48
49
  #include <linux/fs.h>
  #include <linux/namei.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #include <linux/mm.h>
9984de1a5   Paul Gortmaker   kernel: Map most ...
51
  #include <linux/export.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
52
  #include <linux/slab.h>
011161051   Stephen Smalley   AUDIT: Avoid slee...
53
  #include <linux/mount.h>
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
54
  #include <linux/socket.h>
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
55
  #include <linux/mqueue.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
  #include <linux/audit.h>
  #include <linux/personality.h>
  #include <linux/time.h>
5bb289b5a   David Woodhouse   AUDIT: Clean up u...
59
  #include <linux/netlink.h>
f55619642   David Woodhouse   AUDIT: Avoid sche...
60
  #include <linux/compiler.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
  #include <asm/unistd.h>
8c8570fb8   Dustin Kirkland   [PATCH] Capture s...
62
  #include <linux/security.h>
fe7752bab   David Woodhouse   [PATCH] Fix audit...
63
  #include <linux/list.h>
473ae30bc   Al Viro   [PATCH] execve ar...
64
  #include <linux/binfmts.h>
a1f8e7f7f   Al Viro   [PATCH] severing ...
65
  #include <linux/highmem.h>
f46038ff7   Al Viro   [PATCH] log ppid
66
  #include <linux/syscalls.h>
84db564aa   Richard Guy Briggs   audit: add arch f...
67
  #include <asm/syscall.h>
851f7ff56   Eric Paris   This patch will p...
68
  #include <linux/capability.h>
5ad4e53bd   Al Viro   Get rid of indire...
69
  #include <linux/fs_struct.h>
3dc1c1b2d   Kees Cook   seccomp: remove d...
70
  #include <linux/compat.h>
3f1c82502   William Roberts   audit: Audit proc...
71
  #include <linux/ctype.h>
fcf22d826   Paul Moore   audit: create pri...
72
  #include <linux/string.h>
43761473c   Paul Moore   audit: fix a doub...
73
  #include <linux/uaccess.h>
9dd813c15   Jan Kara   fsnotify: Move ma...
74
  #include <linux/fsnotify_backend.h>
fcf22d826   Paul Moore   audit: create pri...
75
  #include <uapi/linux/limits.h>
8e6cf365e   Richard Guy Briggs   audit: log nftabl...
76
  #include <uapi/linux/netfilter/nf_tables.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77

fe7752bab   David Woodhouse   [PATCH] Fix audit...
78
  #include "audit.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

d7e7528bc   Eric Paris   Audit: push audit...
80
81
82
83
  /* flags stating the success for a syscall */
  #define AUDITSC_INVALID 0
  #define AUDITSC_SUCCESS 1
  #define AUDITSC_FAILURE 2
43761473c   Paul Moore   audit: fix a doub...
84
85
  /* no execve audit message should be longer than this (userspace limits),
   * see the note near the top of audit_log_execve_info() about this value */
de6bbd1d3   Eric Paris   [AUDIT] break lar...
86
  #define MAX_EXECVE_AUDIT_LEN 7500
3f1c82502   William Roberts   audit: Audit proc...
87
88
  /* max length to print of cmdline/proctitle value during audit */
  #define MAX_PROCTITLE_AUDIT_LEN 128
471a5c7c8   Al Viro   [PATCH] introduce...
89
90
  /* number of audit rules */
  int audit_n_rules;
e54dc2431   Amy Griffis   [PATCH] audit sig...
91
92
  /* determines whether we collect data for signals sent */
  int audit_signals;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
96
97
98
  struct audit_aux_data {
  	struct audit_aux_data	*next;
  	int			type;
  };
  
  #define AUDIT_AUX_IPCPERM	0
e54dc2431   Amy Griffis   [PATCH] audit sig...
99
100
  /* Number of target pids per aux struct. */
  #define AUDIT_AUX_PIDS	16
e54dc2431   Amy Griffis   [PATCH] audit sig...
101
102
103
  struct audit_aux_data_pids {
  	struct audit_aux_data	d;
  	pid_t			target_pid[AUDIT_AUX_PIDS];
e1760bd5f   Eric W. Biederman   userns: Convert t...
104
  	kuid_t			target_auid[AUDIT_AUX_PIDS];
cca080d9b   Eric W. Biederman   userns: Convert a...
105
  	kuid_t			target_uid[AUDIT_AUX_PIDS];
4746ec5b0   Eric Paris   [AUDIT] add sessi...
106
  	unsigned int		target_sessionid[AUDIT_AUX_PIDS];
e54dc2431   Amy Griffis   [PATCH] audit sig...
107
  	u32			target_sid[AUDIT_AUX_PIDS];
c2a7780ef   Eric Paris   [AUDIT] collect u...
108
  	char 			target_comm[AUDIT_AUX_PIDS][TASK_COMM_LEN];
e54dc2431   Amy Griffis   [PATCH] audit sig...
109
110
  	int			pid_count;
  };
3fc689e96   Eric Paris   Any time fcaps or...
111
112
113
114
115
116
117
  struct audit_aux_data_bprm_fcaps {
  	struct audit_aux_data	d;
  	struct audit_cap_data	fcap;
  	unsigned int		fcap_ver;
  	struct audit_cap_data	old_pcap;
  	struct audit_cap_data	new_pcap;
  };
74c3cbe33   Al Viro   [PATCH] audit: wa...
118
119
120
121
  struct audit_tree_refs {
  	struct audit_tree_refs *next;
  	struct audit_chunk *c[31];
  };
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
122
123
124
125
  struct audit_nfcfgop_tab {
  	enum audit_nfcfgop	op;
  	const char		*s;
  };
db9ff6ecf   Zheng Bin   audit: make symbo...
126
  static const struct audit_nfcfgop_tab audit_nfcfgs[] = {
8e6cf365e   Richard Guy Briggs   audit: log nftabl...
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
  	{ AUDIT_XT_OP_REGISTER,			"xt_register"		   },
  	{ AUDIT_XT_OP_REPLACE,			"xt_replace"		   },
  	{ AUDIT_XT_OP_UNREGISTER,		"xt_unregister"		   },
  	{ AUDIT_NFT_OP_TABLE_REGISTER,		"nft_register_table"	   },
  	{ AUDIT_NFT_OP_TABLE_UNREGISTER,	"nft_unregister_table"	   },
  	{ AUDIT_NFT_OP_CHAIN_REGISTER,		"nft_register_chain"	   },
  	{ AUDIT_NFT_OP_CHAIN_UNREGISTER,	"nft_unregister_chain"	   },
  	{ AUDIT_NFT_OP_RULE_REGISTER,		"nft_register_rule"	   },
  	{ AUDIT_NFT_OP_RULE_UNREGISTER,		"nft_unregister_rule"	   },
  	{ AUDIT_NFT_OP_SET_REGISTER,		"nft_register_set"	   },
  	{ AUDIT_NFT_OP_SET_UNREGISTER,		"nft_unregister_set"	   },
  	{ AUDIT_NFT_OP_SETELEM_REGISTER,	"nft_register_setelem"	   },
  	{ AUDIT_NFT_OP_SETELEM_UNREGISTER,	"nft_unregister_setelem"   },
  	{ AUDIT_NFT_OP_GEN_REGISTER,		"nft_register_gen"	   },
  	{ AUDIT_NFT_OP_OBJ_REGISTER,		"nft_register_obj"	   },
  	{ AUDIT_NFT_OP_OBJ_UNREGISTER,		"nft_unregister_obj"	   },
  	{ AUDIT_NFT_OP_OBJ_RESET,		"nft_reset_obj"		   },
  	{ AUDIT_NFT_OP_FLOWTABLE_REGISTER,	"nft_register_flowtable"   },
  	{ AUDIT_NFT_OP_FLOWTABLE_UNREGISTER,	"nft_unregister_flowtable" },
  	{ AUDIT_NFT_OP_INVALID,			"nft_invalid"		   },
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
147
  };
55669bfa1   Al Viro   [PATCH] audit: AU...
148
149
  static int audit_match_perm(struct audit_context *ctx, int mask)
  {
c4bacefb7   Cordelia   [PATCH] audit: Mo...
150
  	unsigned n;
1a61c88de   zhangxiliang   Re: [PATCH] Fix t...
151
152
  	if (unlikely(!ctx))
  		return 0;
c4bacefb7   Cordelia   [PATCH] audit: Mo...
153
  	n = ctx->major;
dbda4c0b9   Alan Cox   tty: Fix abusers ...
154

55669bfa1   Al Viro   [PATCH] audit: AU...
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  	switch (audit_classify_syscall(ctx->arch, n)) {
  	case 0:	/* native */
  		if ((mask & AUDIT_PERM_WRITE) &&
  		     audit_match_class(AUDIT_CLASS_WRITE, n))
  			return 1;
  		if ((mask & AUDIT_PERM_READ) &&
  		     audit_match_class(AUDIT_CLASS_READ, n))
  			return 1;
  		if ((mask & AUDIT_PERM_ATTR) &&
  		     audit_match_class(AUDIT_CLASS_CHATTR, n))
  			return 1;
  		return 0;
  	case 1: /* 32bit on biarch */
  		if ((mask & AUDIT_PERM_WRITE) &&
  		     audit_match_class(AUDIT_CLASS_WRITE_32, n))
  			return 1;
  		if ((mask & AUDIT_PERM_READ) &&
  		     audit_match_class(AUDIT_CLASS_READ_32, n))
  			return 1;
  		if ((mask & AUDIT_PERM_ATTR) &&
  		     audit_match_class(AUDIT_CLASS_CHATTR_32, n))
  			return 1;
  		return 0;
  	case 2: /* open */
  		return mask & ACC_MODE(ctx->argv[1]);
  	case 3: /* openat */
  		return mask & ACC_MODE(ctx->argv[2]);
  	case 4: /* socketcall */
  		return ((mask & AUDIT_PERM_WRITE) && ctx->argv[0] == SYS_BIND);
  	case 5: /* execve */
  		return mask & AUDIT_PERM_EXEC;
  	default:
  		return 0;
  	}
  }
5ef30ee53   Eric Paris   audit: make filet...
190
  static int audit_match_filetype(struct audit_context *ctx, int val)
8b67dca94   Al Viro   [PATCH] new predi...
191
  {
5195d8e21   Eric Paris   audit: dynamicall...
192
  	struct audit_names *n;
5ef30ee53   Eric Paris   audit: make filet...
193
  	umode_t mode = (umode_t)val;
1a61c88de   zhangxiliang   Re: [PATCH] Fix t...
194
195
196
  
  	if (unlikely(!ctx))
  		return 0;
5195d8e21   Eric Paris   audit: dynamicall...
197
  	list_for_each_entry(n, &ctx->names_list, list) {
84cb777e6   Richard Guy Briggs   audit: use macros...
198
  		if ((n->ino != AUDIT_INO_UNSET) &&
5195d8e21   Eric Paris   audit: dynamicall...
199
  		    ((n->mode & S_IFMT) == mode))
5ef30ee53   Eric Paris   audit: make filet...
200
201
  			return 1;
  	}
5195d8e21   Eric Paris   audit: dynamicall...
202

5ef30ee53   Eric Paris   audit: make filet...
203
  	return 0;
8b67dca94   Al Viro   [PATCH] new predi...
204
  }
74c3cbe33   Al Viro   [PATCH] audit: wa...
205
206
207
208
209
210
211
212
213
  /*
   * We keep a linked list of fixed-sized (31 pointer) arrays of audit_chunk *;
   * ->first_trees points to its beginning, ->trees - to the current end of data.
   * ->tree_count is the number of free entries in array pointed to by ->trees.
   * Original condition is (NULL, NULL, 0); as soon as it grows we never revert to NULL,
   * "empty" becomes (p, p, 31) afterwards.  We don't shrink the list (and seriously,
   * it's going to remain 1-element for almost any setup) until we free context itself.
   * References in it _are_ dropped - at the same time we free/drop aux stuff.
   */
679173b72   Eric Paris   audit: audit_set_...
214
215
216
217
218
219
220
  static void audit_set_auditable(struct audit_context *ctx)
  {
  	if (!ctx->prio) {
  		ctx->prio = 1;
  		ctx->current_state = AUDIT_RECORD_CONTEXT;
  	}
  }
74c3cbe33   Al Viro   [PATCH] audit: wa...
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
  static int put_tree_ref(struct audit_context *ctx, struct audit_chunk *chunk)
  {
  	struct audit_tree_refs *p = ctx->trees;
  	int left = ctx->tree_count;
  	if (likely(left)) {
  		p->c[--left] = chunk;
  		ctx->tree_count = left;
  		return 1;
  	}
  	if (!p)
  		return 0;
  	p = p->next;
  	if (p) {
  		p->c[30] = chunk;
  		ctx->trees = p;
  		ctx->tree_count = 30;
  		return 1;
  	}
  	return 0;
  }
  
  static int grow_tree_refs(struct audit_context *ctx)
  {
  	struct audit_tree_refs *p = ctx->trees;
  	ctx->trees = kzalloc(sizeof(struct audit_tree_refs), GFP_KERNEL);
  	if (!ctx->trees) {
  		ctx->trees = p;
  		return 0;
  	}
  	if (p)
  		p->next = ctx->trees;
  	else
  		ctx->first_trees = ctx->trees;
  	ctx->tree_count = 31;
  	return 1;
  }
74c3cbe33   Al Viro   [PATCH] audit: wa...
257
258
259
260
  
  static void unroll_tree_refs(struct audit_context *ctx,
  		      struct audit_tree_refs *p, int count)
  {
74c3cbe33   Al Viro   [PATCH] audit: wa...
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
  	struct audit_tree_refs *q;
  	int n;
  	if (!p) {
  		/* we started with empty chain */
  		p = ctx->first_trees;
  		count = 31;
  		/* if the very first allocation has failed, nothing to do */
  		if (!p)
  			return;
  	}
  	n = count;
  	for (q = p; q != ctx->trees; q = q->next, n = 31) {
  		while (n--) {
  			audit_put_chunk(q->c[n]);
  			q->c[n] = NULL;
  		}
  	}
  	while (n-- > ctx->tree_count) {
  		audit_put_chunk(q->c[n]);
  		q->c[n] = NULL;
  	}
  	ctx->trees = p;
  	ctx->tree_count = count;
74c3cbe33   Al Viro   [PATCH] audit: wa...
284
285
286
287
288
289
290
291
292
293
294
295
296
  }
  
  static void free_tree_refs(struct audit_context *ctx)
  {
  	struct audit_tree_refs *p, *q;
  	for (p = ctx->first_trees; p; p = q) {
  		q = p->next;
  		kfree(p);
  	}
  }
  
  static int match_tree_refs(struct audit_context *ctx, struct audit_tree *tree)
  {
74c3cbe33   Al Viro   [PATCH] audit: wa...
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
  	struct audit_tree_refs *p;
  	int n;
  	if (!tree)
  		return 0;
  	/* full ones */
  	for (p = ctx->first_trees; p != ctx->trees; p = p->next) {
  		for (n = 0; n < 31; n++)
  			if (audit_tree_match(p->c[n], tree))
  				return 1;
  	}
  	/* partial */
  	if (p) {
  		for (n = ctx->tree_count; n < 31; n++)
  			if (audit_tree_match(p->c[n], tree))
  				return 1;
  	}
74c3cbe33   Al Viro   [PATCH] audit: wa...
313
314
  	return 0;
  }
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
315
316
317
318
  static int audit_compare_uid(kuid_t uid,
  			     struct audit_names *name,
  			     struct audit_field *f,
  			     struct audit_context *ctx)
b34b03932   Eric Paris   audit: complex in...
319
320
  {
  	struct audit_names *n;
b34b03932   Eric Paris   audit: complex in...
321
  	int rc;
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
322
   
b34b03932   Eric Paris   audit: complex in...
323
  	if (name) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
324
  		rc = audit_uid_comparator(uid, f->op, name->uid);
b34b03932   Eric Paris   audit: complex in...
325
326
327
  		if (rc)
  			return rc;
  	}
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
328
   
b34b03932   Eric Paris   audit: complex in...
329
330
  	if (ctx) {
  		list_for_each_entry(n, &ctx->names_list, list) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
331
332
333
334
335
336
337
  			rc = audit_uid_comparator(uid, f->op, n->uid);
  			if (rc)
  				return rc;
  		}
  	}
  	return 0;
  }
b34b03932   Eric Paris   audit: complex in...
338

ca57ec0f0   Eric W. Biederman   audit: Add typesp...
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
  static int audit_compare_gid(kgid_t gid,
  			     struct audit_names *name,
  			     struct audit_field *f,
  			     struct audit_context *ctx)
  {
  	struct audit_names *n;
  	int rc;
   
  	if (name) {
  		rc = audit_gid_comparator(gid, f->op, name->gid);
  		if (rc)
  			return rc;
  	}
   
  	if (ctx) {
  		list_for_each_entry(n, &ctx->names_list, list) {
  			rc = audit_gid_comparator(gid, f->op, n->gid);
b34b03932   Eric Paris   audit: complex in...
356
357
358
359
360
361
  			if (rc)
  				return rc;
  		}
  	}
  	return 0;
  }
02d86a568   Eric Paris   audit: allow inte...
362
363
364
365
366
367
  static int audit_field_compare(struct task_struct *tsk,
  			       const struct cred *cred,
  			       struct audit_field *f,
  			       struct audit_context *ctx,
  			       struct audit_names *name)
  {
02d86a568   Eric Paris   audit: allow inte...
368
  	switch (f->val) {
4a6633ed0   Peter Moody   audit: implement ...
369
  	/* process to file object comparisons */
02d86a568   Eric Paris   audit: allow inte...
370
  	case AUDIT_COMPARE_UID_TO_OBJ_UID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
371
  		return audit_compare_uid(cred->uid, name, f, ctx);
c9fe685f7   Eric Paris   audit: allow inte...
372
  	case AUDIT_COMPARE_GID_TO_OBJ_GID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
373
  		return audit_compare_gid(cred->gid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
374
  	case AUDIT_COMPARE_EUID_TO_OBJ_UID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
375
  		return audit_compare_uid(cred->euid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
376
  	case AUDIT_COMPARE_EGID_TO_OBJ_GID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
377
  		return audit_compare_gid(cred->egid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
378
  	case AUDIT_COMPARE_AUID_TO_OBJ_UID:
38f805904   Richard Guy Briggs   audit: normalize ...
379
  		return audit_compare_uid(audit_get_loginuid(tsk), name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
380
  	case AUDIT_COMPARE_SUID_TO_OBJ_UID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
381
  		return audit_compare_uid(cred->suid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
382
  	case AUDIT_COMPARE_SGID_TO_OBJ_GID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
383
  		return audit_compare_gid(cred->sgid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
384
  	case AUDIT_COMPARE_FSUID_TO_OBJ_UID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
385
  		return audit_compare_uid(cred->fsuid, name, f, ctx);
4a6633ed0   Peter Moody   audit: implement ...
386
  	case AUDIT_COMPARE_FSGID_TO_OBJ_GID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
387
  		return audit_compare_gid(cred->fsgid, name, f, ctx);
10d683608   Peter Moody   audit: comparison...
388
389
  	/* uid comparisons */
  	case AUDIT_COMPARE_UID_TO_AUID:
38f805904   Richard Guy Briggs   audit: normalize ...
390
391
  		return audit_uid_comparator(cred->uid, f->op,
  					    audit_get_loginuid(tsk));
10d683608   Peter Moody   audit: comparison...
392
  	case AUDIT_COMPARE_UID_TO_EUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
393
  		return audit_uid_comparator(cred->uid, f->op, cred->euid);
10d683608   Peter Moody   audit: comparison...
394
  	case AUDIT_COMPARE_UID_TO_SUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
395
  		return audit_uid_comparator(cred->uid, f->op, cred->suid);
10d683608   Peter Moody   audit: comparison...
396
  	case AUDIT_COMPARE_UID_TO_FSUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
397
  		return audit_uid_comparator(cred->uid, f->op, cred->fsuid);
10d683608   Peter Moody   audit: comparison...
398
399
  	/* auid comparisons */
  	case AUDIT_COMPARE_AUID_TO_EUID:
38f805904   Richard Guy Briggs   audit: normalize ...
400
401
  		return audit_uid_comparator(audit_get_loginuid(tsk), f->op,
  					    cred->euid);
10d683608   Peter Moody   audit: comparison...
402
  	case AUDIT_COMPARE_AUID_TO_SUID:
38f805904   Richard Guy Briggs   audit: normalize ...
403
404
  		return audit_uid_comparator(audit_get_loginuid(tsk), f->op,
  					    cred->suid);
10d683608   Peter Moody   audit: comparison...
405
  	case AUDIT_COMPARE_AUID_TO_FSUID:
38f805904   Richard Guy Briggs   audit: normalize ...
406
407
  		return audit_uid_comparator(audit_get_loginuid(tsk), f->op,
  					    cred->fsuid);
10d683608   Peter Moody   audit: comparison...
408
409
  	/* euid comparisons */
  	case AUDIT_COMPARE_EUID_TO_SUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
410
  		return audit_uid_comparator(cred->euid, f->op, cred->suid);
10d683608   Peter Moody   audit: comparison...
411
  	case AUDIT_COMPARE_EUID_TO_FSUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
412
  		return audit_uid_comparator(cred->euid, f->op, cred->fsuid);
10d683608   Peter Moody   audit: comparison...
413
414
  	/* suid comparisons */
  	case AUDIT_COMPARE_SUID_TO_FSUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
415
  		return audit_uid_comparator(cred->suid, f->op, cred->fsuid);
10d683608   Peter Moody   audit: comparison...
416
417
  	/* gid comparisons */
  	case AUDIT_COMPARE_GID_TO_EGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
418
  		return audit_gid_comparator(cred->gid, f->op, cred->egid);
10d683608   Peter Moody   audit: comparison...
419
  	case AUDIT_COMPARE_GID_TO_SGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
420
  		return audit_gid_comparator(cred->gid, f->op, cred->sgid);
10d683608   Peter Moody   audit: comparison...
421
  	case AUDIT_COMPARE_GID_TO_FSGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
422
  		return audit_gid_comparator(cred->gid, f->op, cred->fsgid);
10d683608   Peter Moody   audit: comparison...
423
424
  	/* egid comparisons */
  	case AUDIT_COMPARE_EGID_TO_SGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
425
  		return audit_gid_comparator(cred->egid, f->op, cred->sgid);
10d683608   Peter Moody   audit: comparison...
426
  	case AUDIT_COMPARE_EGID_TO_FSGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
427
  		return audit_gid_comparator(cred->egid, f->op, cred->fsgid);
10d683608   Peter Moody   audit: comparison...
428
429
  	/* sgid comparison */
  	case AUDIT_COMPARE_SGID_TO_FSGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
430
  		return audit_gid_comparator(cred->sgid, f->op, cred->fsgid);
02d86a568   Eric Paris   audit: allow inte...
431
432
433
434
435
436
437
  	default:
  		WARN(1, "Missing AUDIT_COMPARE define.  Report as a bug
  ");
  		return 0;
  	}
  	return 0;
  }
f368c07d7   Amy Griffis   [PATCH] audit: pa...
438
  /* Determine if any context name data matches a rule's watch data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
  /* Compare a task_struct with an audit_rule.  Return 1 on match, 0
f56298835   Tony Jones   audit: acquire cr...
440
441
442
443
444
445
   * otherwise.
   *
   * If task_creation is true, this is an explicit indication that we are
   * filtering a task rule at task creation time.  This and tsk == current are
   * the only situations where tsk->cred may be accessed without an rcu read lock.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
  static int audit_filter_rules(struct task_struct *tsk,
93315ed6d   Amy Griffis   [PATCH] audit str...
447
  			      struct audit_krule *rule,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448
  			      struct audit_context *ctx,
f368c07d7   Amy Griffis   [PATCH] audit: pa...
449
  			      struct audit_names *name,
f56298835   Tony Jones   audit: acquire cr...
450
451
  			      enum audit_state *state,
  			      bool task_creation)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
  {
f56298835   Tony Jones   audit: acquire cr...
453
  	const struct cred *cred;
5195d8e21   Eric Paris   audit: dynamicall...
454
  	int i, need_sid = 1;
3dc7e3153   Darrel Goeddel   [PATCH] support f...
455
  	u32 sid;
8fae47705   Richard Guy Briggs   audit: add suppor...
456
  	unsigned int sessionid;
3dc7e3153   Darrel Goeddel   [PATCH] support f...
457

f56298835   Tony Jones   audit: acquire cr...
458
  	cred = rcu_dereference_check(tsk->cred, tsk == current || task_creation);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
459
  	for (i = 0; i < rule->field_count; i++) {
93315ed6d   Amy Griffis   [PATCH] audit str...
460
  		struct audit_field *f = &rule->fields[i];
5195d8e21   Eric Paris   audit: dynamicall...
461
  		struct audit_names *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462
  		int result = 0;
f1dc4867f   Richard Guy Briggs   audit: anchor all...
463
  		pid_t pid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464

93315ed6d   Amy Griffis   [PATCH] audit str...
465
  		switch (f->type) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
466
  		case AUDIT_PID:
fa2bea2f5   Paul Moore   audit: consistent...
467
  			pid = task_tgid_nr(tsk);
f1dc4867f   Richard Guy Briggs   audit: anchor all...
468
  			result = audit_comparator(pid, f->op, f->val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469
  			break;
3c66251e5   Al Viro   [PATCH] add filte...
470
  		case AUDIT_PPID:
419c58f11   Alexander Viro   [PATCH] PPID filt...
471
472
  			if (ctx) {
  				if (!ctx->ppid)
c92cdeb45   Richard Guy Briggs   audit: convert PP...
473
  					ctx->ppid = task_ppid_nr(tsk);
3c66251e5   Al Viro   [PATCH] add filte...
474
  				result = audit_comparator(ctx->ppid, f->op, f->val);
419c58f11   Alexander Viro   [PATCH] PPID filt...
475
  			}
3c66251e5   Al Viro   [PATCH] add filte...
476
  			break;
34d99af52   Richard Guy Briggs   audit: implement ...
477
478
  		case AUDIT_EXE:
  			result = audit_exe_compare(tsk, rule->exe);
23bcc480d   Ondrej Mosnáček   audit: allow not ...
479
480
  			if (f->op == Audit_not_equal)
  				result = !result;
34d99af52   Richard Guy Briggs   audit: implement ...
481
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
  		case AUDIT_UID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
483
  			result = audit_uid_comparator(cred->uid, f->op, f->uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
485
  			break;
  		case AUDIT_EUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
486
  			result = audit_uid_comparator(cred->euid, f->op, f->uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
487
488
  			break;
  		case AUDIT_SUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
489
  			result = audit_uid_comparator(cred->suid, f->op, f->uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
490
491
  			break;
  		case AUDIT_FSUID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
492
  			result = audit_uid_comparator(cred->fsuid, f->op, f->uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
494
  			break;
  		case AUDIT_GID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
495
  			result = audit_gid_comparator(cred->gid, f->op, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
496
497
  			if (f->op == Audit_equal) {
  				if (!result)
af85d1772   Ondrej Mosnáček   audit: Fix extend...
498
  					result = groups_search(cred->group_info, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
499
500
  			} else if (f->op == Audit_not_equal) {
  				if (result)
af85d1772   Ondrej Mosnáček   audit: Fix extend...
501
  					result = !groups_search(cred->group_info, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
502
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
503
504
  			break;
  		case AUDIT_EGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
505
  			result = audit_gid_comparator(cred->egid, f->op, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
506
507
  			if (f->op == Audit_equal) {
  				if (!result)
af85d1772   Ondrej Mosnáček   audit: Fix extend...
508
  					result = groups_search(cred->group_info, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
509
510
  			} else if (f->op == Audit_not_equal) {
  				if (result)
af85d1772   Ondrej Mosnáček   audit: Fix extend...
511
  					result = !groups_search(cred->group_info, f->gid);
37eebe39c   Matvejchikov Ilya   audit: improve GI...
512
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
  			break;
  		case AUDIT_SGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
515
  			result = audit_gid_comparator(cred->sgid, f->op, f->gid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
516
517
  			break;
  		case AUDIT_FSGID:
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
518
  			result = audit_gid_comparator(cred->fsgid, f->op, f->gid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
519
  			break;
8fae47705   Richard Guy Briggs   audit: add suppor...
520
  		case AUDIT_SESSIONID:
5b7138866   Ondrej Mosnáček   audit: Fix wrong ...
521
  			sessionid = audit_get_sessionid(tsk);
8fae47705   Richard Guy Briggs   audit: add suppor...
522
523
  			result = audit_comparator(sessionid, f->op, f->val);
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524
  		case AUDIT_PERS:
93315ed6d   Amy Griffis   [PATCH] audit str...
525
  			result = audit_comparator(tsk->personality, f->op, f->val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
  			break;
2fd6f58ba   David Woodhouse   [AUDIT] Don't all...
527
  		case AUDIT_ARCH:
9f8dbe9c9   Daniel Walker   whitespace fixes:...
528
  			if (ctx)
93315ed6d   Amy Griffis   [PATCH] audit str...
529
  				result = audit_comparator(ctx->arch, f->op, f->val);
2fd6f58ba   David Woodhouse   [AUDIT] Don't all...
530
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
532
533
  
  		case AUDIT_EXIT:
  			if (ctx && ctx->return_valid)
93315ed6d   Amy Griffis   [PATCH] audit str...
534
  				result = audit_comparator(ctx->return_code, f->op, f->val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535
536
  			break;
  		case AUDIT_SUCCESS:
b01f2cc1c   David Woodhouse   [AUDIT] Allow fil...
537
  			if (ctx && ctx->return_valid) {
93315ed6d   Amy Griffis   [PATCH] audit str...
538
539
  				if (f->val)
  					result = audit_comparator(ctx->return_valid, f->op, AUDITSC_SUCCESS);
b01f2cc1c   David Woodhouse   [AUDIT] Allow fil...
540
  				else
93315ed6d   Amy Griffis   [PATCH] audit str...
541
  					result = audit_comparator(ctx->return_valid, f->op, AUDITSC_FAILURE);
b01f2cc1c   David Woodhouse   [AUDIT] Allow fil...
542
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
544
  			break;
  		case AUDIT_DEVMAJOR:
16c174bd9   Eric Paris   audit: check curr...
545
546
547
548
549
  			if (name) {
  				if (audit_comparator(MAJOR(name->dev), f->op, f->val) ||
  				    audit_comparator(MAJOR(name->rdev), f->op, f->val))
  					++result;
  			} else if (ctx) {
5195d8e21   Eric Paris   audit: dynamicall...
550
  				list_for_each_entry(n, &ctx->names_list, list) {
16c174bd9   Eric Paris   audit: check curr...
551
552
  					if (audit_comparator(MAJOR(n->dev), f->op, f->val) ||
  					    audit_comparator(MAJOR(n->rdev), f->op, f->val)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553
554
555
556
557
558
559
  						++result;
  						break;
  					}
  				}
  			}
  			break;
  		case AUDIT_DEVMINOR:
16c174bd9   Eric Paris   audit: check curr...
560
561
562
563
564
  			if (name) {
  				if (audit_comparator(MINOR(name->dev), f->op, f->val) ||
  				    audit_comparator(MINOR(name->rdev), f->op, f->val))
  					++result;
  			} else if (ctx) {
5195d8e21   Eric Paris   audit: dynamicall...
565
  				list_for_each_entry(n, &ctx->names_list, list) {
16c174bd9   Eric Paris   audit: check curr...
566
567
  					if (audit_comparator(MINOR(n->dev), f->op, f->val) ||
  					    audit_comparator(MINOR(n->rdev), f->op, f->val)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568
569
570
571
572
573
574
  						++result;
  						break;
  					}
  				}
  			}
  			break;
  		case AUDIT_INODE:
f368c07d7   Amy Griffis   [PATCH] audit: pa...
575
  			if (name)
db510fc5c   Richard Guy Briggs   audit: update AUD...
576
  				result = audit_comparator(name->ino, f->op, f->val);
f368c07d7   Amy Griffis   [PATCH] audit: pa...
577
  			else if (ctx) {
5195d8e21   Eric Paris   audit: dynamicall...
578
579
  				list_for_each_entry(n, &ctx->names_list, list) {
  					if (audit_comparator(n->ino, f->op, f->val)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
581
582
583
584
585
  						++result;
  						break;
  					}
  				}
  			}
  			break;
efaffd6e4   Eric Paris   audit: allow matc...
586
587
  		case AUDIT_OBJ_UID:
  			if (name) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
588
  				result = audit_uid_comparator(name->uid, f->op, f->uid);
efaffd6e4   Eric Paris   audit: allow matc...
589
590
  			} else if (ctx) {
  				list_for_each_entry(n, &ctx->names_list, list) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
591
  					if (audit_uid_comparator(n->uid, f->op, f->uid)) {
efaffd6e4   Eric Paris   audit: allow matc...
592
593
594
595
596
597
  						++result;
  						break;
  					}
  				}
  			}
  			break;
54d3218b3   Eric Paris   audit: allow audi...
598
599
  		case AUDIT_OBJ_GID:
  			if (name) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
600
  				result = audit_gid_comparator(name->gid, f->op, f->gid);
54d3218b3   Eric Paris   audit: allow audi...
601
602
  			} else if (ctx) {
  				list_for_each_entry(n, &ctx->names_list, list) {
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
603
  					if (audit_gid_comparator(n->gid, f->op, f->gid)) {
54d3218b3   Eric Paris   audit: allow audi...
604
605
606
607
608
609
  						++result;
  						break;
  					}
  				}
  			}
  			break;
f368c07d7   Amy Griffis   [PATCH] audit: pa...
610
  		case AUDIT_WATCH:
0223fad3c   Richard Guy Briggs   audit: enforce op...
611
612
613
614
615
616
617
  			if (name) {
  				result = audit_watch_compare(rule->watch,
  							     name->ino,
  							     name->dev);
  				if (f->op == Audit_not_equal)
  					result = !result;
  			}
f368c07d7   Amy Griffis   [PATCH] audit: pa...
618
  			break;
74c3cbe33   Al Viro   [PATCH] audit: wa...
619
  		case AUDIT_DIR:
0223fad3c   Richard Guy Briggs   audit: enforce op...
620
  			if (ctx) {
74c3cbe33   Al Viro   [PATCH] audit: wa...
621
  				result = match_tree_refs(ctx, rule->tree);
0223fad3c   Richard Guy Briggs   audit: enforce op...
622
623
624
  				if (f->op == Audit_not_equal)
  					result = !result;
  			}
74c3cbe33   Al Viro   [PATCH] audit: wa...
625
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
626
  		case AUDIT_LOGINUID:
38f805904   Richard Guy Briggs   audit: normalize ...
627
628
  			result = audit_uid_comparator(audit_get_loginuid(tsk),
  						      f->op, f->uid);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
629
  			break;
780a7654c   Eric W. Biederman   audit: Make testi...
630
631
632
  		case AUDIT_LOGINUID_SET:
  			result = audit_comparator(audit_loginuid_set(tsk), f->op, f->val);
  			break;
bf361231c   Richard Guy Briggs   audit: add saddr_...
633
634
635
636
637
  		case AUDIT_SADDR_FAM:
  			if (ctx->sockaddr)
  				result = audit_comparator(ctx->sockaddr->ss_family,
  							  f->op, f->val);
  			break;
3a6b9f85c   Darrel Goeddel   [PATCH] audit: re...
638
639
640
641
642
  		case AUDIT_SUBJ_USER:
  		case AUDIT_SUBJ_ROLE:
  		case AUDIT_SUBJ_TYPE:
  		case AUDIT_SUBJ_SEN:
  		case AUDIT_SUBJ_CLR:
3dc7e3153   Darrel Goeddel   [PATCH] support f...
643
644
645
646
647
  			/* NOTE: this may return negative values indicating
  			   a temporary error.  We simply treat this as a
  			   match for now to avoid losing information that
  			   may be wanted.   An error message will also be
  			   logged upon error */
04305e4af   Ahmed S. Darwish   Audit: Final rena...
648
  			if (f->lsm_rule) {
2ad312d20   Steve Grubb   [PATCH] Audit Fil...
649
  				if (need_sid) {
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
650
  					security_task_getsecid(tsk, &sid);
2ad312d20   Steve Grubb   [PATCH] Audit Fil...
651
652
  					need_sid = 0;
  				}
d7a96f3a1   Ahmed S. Darwish   Audit: internally...
653
  				result = security_audit_rule_match(sid, f->type,
90462a5bd   Richard Guy Briggs   audit: remove unu...
654
655
  								   f->op,
  								   f->lsm_rule);
2ad312d20   Steve Grubb   [PATCH] Audit Fil...
656
  			}
3dc7e3153   Darrel Goeddel   [PATCH] support f...
657
  			break;
6e5a2d1d3   Darrel Goeddel   [PATCH] audit: su...
658
659
660
661
662
663
664
  		case AUDIT_OBJ_USER:
  		case AUDIT_OBJ_ROLE:
  		case AUDIT_OBJ_TYPE:
  		case AUDIT_OBJ_LEV_LOW:
  		case AUDIT_OBJ_LEV_HIGH:
  			/* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR
  			   also applies here */
04305e4af   Ahmed S. Darwish   Audit: Final rena...
665
  			if (f->lsm_rule) {
6e5a2d1d3   Darrel Goeddel   [PATCH] audit: su...
666
667
  				/* Find files that match */
  				if (name) {
d7a96f3a1   Ahmed S. Darwish   Audit: internally...
668
  					result = security_audit_rule_match(
90462a5bd   Richard Guy Briggs   audit: remove unu...
669
670
671
672
  								name->osid,
  								f->type,
  								f->op,
  								f->lsm_rule);
6e5a2d1d3   Darrel Goeddel   [PATCH] audit: su...
673
  				} else if (ctx) {
5195d8e21   Eric Paris   audit: dynamicall...
674
  					list_for_each_entry(n, &ctx->names_list, list) {
90462a5bd   Richard Guy Briggs   audit: remove unu...
675
676
677
678
679
  						if (security_audit_rule_match(
  								n->osid,
  								f->type,
  								f->op,
  								f->lsm_rule)) {
6e5a2d1d3   Darrel Goeddel   [PATCH] audit: su...
680
681
682
683
684
685
  							++result;
  							break;
  						}
  					}
  				}
  				/* Find ipc objects that match */
a33e67510   Al Viro   sanitize audit_ip...
686
687
688
689
  				if (!ctx || ctx->type != AUDIT_IPC)
  					break;
  				if (security_audit_rule_match(ctx->ipc.osid,
  							      f->type, f->op,
90462a5bd   Richard Guy Briggs   audit: remove unu...
690
  							      f->lsm_rule))
a33e67510   Al Viro   sanitize audit_ip...
691
  					++result;
6e5a2d1d3   Darrel Goeddel   [PATCH] audit: su...
692
693
  			}
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
694
695
696
697
698
  		case AUDIT_ARG0:
  		case AUDIT_ARG1:
  		case AUDIT_ARG2:
  		case AUDIT_ARG3:
  			if (ctx)
93315ed6d   Amy Griffis   [PATCH] audit str...
699
  				result = audit_comparator(ctx->argv[f->type-AUDIT_ARG0], f->op, f->val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700
  			break;
5adc8a6ad   Amy Griffis   [PATCH] add rule ...
701
702
703
704
  		case AUDIT_FILTERKEY:
  			/* ignore this field for filtering */
  			result = 1;
  			break;
55669bfa1   Al Viro   [PATCH] audit: AU...
705
706
  		case AUDIT_PERM:
  			result = audit_match_perm(ctx, f->val);
0223fad3c   Richard Guy Briggs   audit: enforce op...
707
708
  			if (f->op == Audit_not_equal)
  				result = !result;
55669bfa1   Al Viro   [PATCH] audit: AU...
709
  			break;
8b67dca94   Al Viro   [PATCH] new predi...
710
711
  		case AUDIT_FILETYPE:
  			result = audit_match_filetype(ctx, f->val);
0223fad3c   Richard Guy Briggs   audit: enforce op...
712
713
  			if (f->op == Audit_not_equal)
  				result = !result;
8b67dca94   Al Viro   [PATCH] new predi...
714
  			break;
02d86a568   Eric Paris   audit: allow inte...
715
716
717
  		case AUDIT_FIELD_COMPARE:
  			result = audit_field_compare(tsk, cred, f, ctx, name);
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
718
  		}
f56298835   Tony Jones   audit: acquire cr...
719
  		if (!result)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
721
  			return 0;
  	}
0590b9335   Al Viro   fixing audit rule...
722
723
724
725
726
727
728
729
730
731
  
  	if (ctx) {
  		if (rule->prio <= ctx->prio)
  			return 0;
  		if (rule->filterkey) {
  			kfree(ctx->filterkey);
  			ctx->filterkey = kstrdup(rule->filterkey, GFP_ATOMIC);
  		}
  		ctx->prio = rule->prio;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
732
  	switch (rule->action) {
66b12abc8   Paul Moore   audit: fix some h...
733
734
735
736
737
738
  	case AUDIT_NEVER:
  		*state = AUDIT_DISABLED;
  		break;
  	case AUDIT_ALWAYS:
  		*state = AUDIT_RECORD_CONTEXT;
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
741
742
743
744
745
746
  	}
  	return 1;
  }
  
  /* At process creation time, we can determine if system-call auditing is
   * completely disabled for this task.  Since we only have the task
   * structure at this point, we can only check uid and gid.
   */
e048e02c8   Al Viro   make sure that fi...
747
  static enum audit_state audit_filter_task(struct task_struct *tsk, char **key)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748
749
750
751
752
  {
  	struct audit_entry *e;
  	enum audit_state   state;
  
  	rcu_read_lock();
0f45aa18e   David Woodhouse   AUDIT: Allow filt...
753
  	list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TASK], list) {
f56298835   Tony Jones   audit: acquire cr...
754
755
  		if (audit_filter_rules(tsk, &e->rule, NULL, NULL,
  				       &state, true)) {
e048e02c8   Al Viro   make sure that fi...
756
757
  			if (state == AUDIT_RECORD_CONTEXT)
  				*key = kstrdup(e->rule.filterkey, GFP_ATOMIC);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
758
759
760
761
762
763
764
  			rcu_read_unlock();
  			return state;
  		}
  	}
  	rcu_read_unlock();
  	return AUDIT_BUILD_CONTEXT;
  }
a3c549311   Andy Lutomirski   auditsc: audit_kr...
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
  static int audit_in_mask(const struct audit_krule *rule, unsigned long val)
  {
  	int word, bit;
  
  	if (val > 0xffffffff)
  		return false;
  
  	word = AUDIT_WORD(val);
  	if (word >= AUDIT_BITMASK_SIZE)
  		return false;
  
  	bit = AUDIT_BIT(val);
  
  	return rule->mask[word] & bit;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
780
781
  /* At syscall entry and exit time, this filter is called if the
   * audit_state is not low enough that auditing cannot take place, but is
23f32d18a   Steve Grubb   AUDIT: Fix some s...
782
   * also not high enough that we already know we have to write an audit
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
783
   * record (i.e., the state is AUDIT_SETUP_CONTEXT or AUDIT_BUILD_CONTEXT).
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
785
786
787
788
789
   */
  static enum audit_state audit_filter_syscall(struct task_struct *tsk,
  					     struct audit_context *ctx,
  					     struct list_head *list)
  {
  	struct audit_entry *e;
c38964959   David Woodhouse   AUDIT: Speed up a...
790
  	enum audit_state state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
791

5b52330bb   Paul Moore   audit: fix auditd...
792
  	if (auditd_test_task(tsk))
f7056d64a   David Woodhouse   AUDIT: Really exe...
793
  		return AUDIT_DISABLED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
794
  	rcu_read_lock();
699c1868a   Richard Guy Briggs   audit: purge unne...
795
796
797
798
799
800
801
  	list_for_each_entry_rcu(e, list, list) {
  		if (audit_in_mask(&e->rule, ctx->major) &&
  		    audit_filter_rules(tsk, &e->rule, ctx, NULL,
  				       &state, false)) {
  			rcu_read_unlock();
  			ctx->current_state = state;
  			return state;
f368c07d7   Amy Griffis   [PATCH] audit: pa...
802
803
804
805
806
  		}
  	}
  	rcu_read_unlock();
  	return AUDIT_BUILD_CONTEXT;
  }
5195d8e21   Eric Paris   audit: dynamicall...
807
808
809
810
811
812
813
  /*
   * Given an audit_name check the inode hash table to see if they match.
   * Called holding the rcu read lock to protect the use of audit_inode_hash
   */
  static int audit_filter_inode_name(struct task_struct *tsk,
  				   struct audit_names *n,
  				   struct audit_context *ctx) {
5195d8e21   Eric Paris   audit: dynamicall...
814
815
816
817
  	int h = audit_hash_ino((u32)n->ino);
  	struct list_head *list = &audit_inode_hash[h];
  	struct audit_entry *e;
  	enum audit_state state;
5195d8e21   Eric Paris   audit: dynamicall...
818
  	list_for_each_entry_rcu(e, list, list) {
a3c549311   Andy Lutomirski   auditsc: audit_kr...
819
  		if (audit_in_mask(&e->rule, ctx->major) &&
5195d8e21   Eric Paris   audit: dynamicall...
820
821
822
823
824
  		    audit_filter_rules(tsk, &e->rule, ctx, n, &state, false)) {
  			ctx->current_state = state;
  			return 1;
  		}
  	}
5195d8e21   Eric Paris   audit: dynamicall...
825
826
827
828
  	return 0;
  }
  
  /* At syscall exit time, this filter is called if any audit_names have been
f368c07d7   Amy Griffis   [PATCH] audit: pa...
829
   * collected during syscall processing.  We only check rules in sublists at hash
5195d8e21   Eric Paris   audit: dynamicall...
830
   * buckets applicable to the inode numbers in audit_names.
f368c07d7   Amy Griffis   [PATCH] audit: pa...
831
832
   * Regarding audit_state, same rules apply as for audit_filter_syscall().
   */
0590b9335   Al Viro   fixing audit rule...
833
  void audit_filter_inodes(struct task_struct *tsk, struct audit_context *ctx)
f368c07d7   Amy Griffis   [PATCH] audit: pa...
834
  {
5195d8e21   Eric Paris   audit: dynamicall...
835
  	struct audit_names *n;
f368c07d7   Amy Griffis   [PATCH] audit: pa...
836

5b52330bb   Paul Moore   audit: fix auditd...
837
  	if (auditd_test_task(tsk))
0590b9335   Al Viro   fixing audit rule...
838
  		return;
f368c07d7   Amy Griffis   [PATCH] audit: pa...
839
840
  
  	rcu_read_lock();
f368c07d7   Amy Griffis   [PATCH] audit: pa...
841

5195d8e21   Eric Paris   audit: dynamicall...
842
843
844
  	list_for_each_entry(n, &ctx->names_list, list) {
  		if (audit_filter_inode_name(tsk, n, ctx))
  			break;
0f45aa18e   David Woodhouse   AUDIT: Allow filt...
845
846
  	}
  	rcu_read_unlock();
0f45aa18e   David Woodhouse   AUDIT: Allow filt...
847
  }
3f1c82502   William Roberts   audit: Audit proc...
848
849
850
851
852
853
  static inline void audit_proctitle_free(struct audit_context *context)
  {
  	kfree(context->proctitle.value);
  	context->proctitle.value = NULL;
  	context->proctitle.len = 0;
  }
95e0b46fc   Li RongQing   audit: fix a meml...
854
855
856
857
858
859
860
  static inline void audit_free_module(struct audit_context *context)
  {
  	if (context->type == AUDIT_KERN_MODULE) {
  		kfree(context->module.name);
  		context->module.name = NULL;
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
862
  static inline void audit_free_names(struct audit_context *context)
  {
5195d8e21   Eric Paris   audit: dynamicall...
863
  	struct audit_names *n, *next;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
864

5195d8e21   Eric Paris   audit: dynamicall...
865
866
  	list_for_each_entry_safe(n, next, &context->names_list, list) {
  		list_del(&n->list);
55422d0bd   Paul Moore   audit: replace ge...
867
868
  		if (n->name)
  			putname(n->name);
5195d8e21   Eric Paris   audit: dynamicall...
869
870
  		if (n->should_free)
  			kfree(n);
8c8570fb8   Dustin Kirkland   [PATCH] Capture s...
871
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
872
  	context->name_count = 0;
44707fdf5   Jan Blunck   d_path: Use struc...
873
874
875
  	path_put(&context->pwd);
  	context->pwd.dentry = NULL;
  	context->pwd.mnt = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
876
877
878
879
880
881
882
883
884
885
  }
  
  static inline void audit_free_aux(struct audit_context *context)
  {
  	struct audit_aux_data *aux;
  
  	while ((aux = context->aux)) {
  		context->aux = aux->next;
  		kfree(aux);
  	}
e54dc2431   Amy Griffis   [PATCH] audit sig...
886
887
888
889
  	while ((aux = context->aux_pids)) {
  		context->aux_pids = aux->next;
  		kfree(aux);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
891
892
893
  static inline struct audit_context *audit_alloc_context(enum audit_state state)
  {
  	struct audit_context *context;
17c6ee707   Rakib Mullick   auditsc: Use kzal...
894
895
  	context = kzalloc(sizeof(*context), GFP_KERNEL);
  	if (!context)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
896
  		return NULL;
e2c5adc88   Andrew Morton   auditsc: remove a...
897
898
  	context->state = state;
  	context->prio = state == AUDIT_RECORD_CONTEXT ? ~0ULL : 0;
916d75761   Al Viro   Fix rule eviction...
899
  	INIT_LIST_HEAD(&context->killed_trees);
5195d8e21   Eric Paris   audit: dynamicall...
900
  	INIT_LIST_HEAD(&context->names_list);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
901
902
  	return context;
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
903
904
905
906
907
  /**
   * audit_alloc - allocate an audit context block for a task
   * @tsk: task
   *
   * Filter on the task information and allocate a per-task audit context
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
908
909
   * if necessary.  Doing so turns on system call auditing for the
   * specified task.  This is called from copy_process, so no lock is
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
910
911
   * needed.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
912
913
914
915
  int audit_alloc(struct task_struct *tsk)
  {
  	struct audit_context *context;
  	enum audit_state     state;
e048e02c8   Al Viro   make sure that fi...
916
  	char *key = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917

b593d384e   Eric Paris   [AUDIT] create co...
918
  	if (likely(!audit_ever_enabled))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
  		return 0; /* Return if not auditing. */
e048e02c8   Al Viro   make sure that fi...
920
  	state = audit_filter_task(tsk, &key);
d48d80512   Oleg Nesterov   audit_alloc: clea...
921
922
  	if (state == AUDIT_DISABLED) {
  		clear_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923
  		return 0;
d48d80512   Oleg Nesterov   audit_alloc: clea...
924
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
  
  	if (!(context = audit_alloc_context(state))) {
e048e02c8   Al Viro   make sure that fi...
927
  		kfree(key);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
929
930
  		audit_log_lost("out of memory in audit_alloc");
  		return -ENOMEM;
  	}
e048e02c8   Al Viro   make sure that fi...
931
  	context->filterkey = key;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
932

c0b0ae8a8   Richard Guy Briggs   audit: use inline...
933
  	audit_set_context(tsk, context);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
934
935
936
937
938
939
  	set_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
  	return 0;
  }
  
  static inline void audit_free_context(struct audit_context *context)
  {
95e0b46fc   Li RongQing   audit: fix a meml...
940
  	audit_free_module(context);
c62d773a3   Al Viro   audit: no nested ...
941
942
943
944
945
946
  	audit_free_names(context);
  	unroll_tree_refs(context, NULL, 0);
  	free_tree_refs(context);
  	audit_free_aux(context);
  	kfree(context->filterkey);
  	kfree(context->sockaddr);
3f1c82502   William Roberts   audit: Audit proc...
947
  	audit_proctitle_free(context);
c62d773a3   Al Viro   audit: no nested ...
948
  	kfree(context);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
949
  }
e54dc2431   Amy Griffis   [PATCH] audit sig...
950
  static int audit_log_pid_context(struct audit_context *context, pid_t pid,
cca080d9b   Eric W. Biederman   userns: Convert a...
951
  				 kuid_t auid, kuid_t uid, unsigned int sessionid,
4746ec5b0   Eric Paris   [AUDIT] add sessi...
952
  				 u32 sid, char *comm)
e54dc2431   Amy Griffis   [PATCH] audit sig...
953
954
  {
  	struct audit_buffer *ab;
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
955
  	char *ctx = NULL;
e54dc2431   Amy Griffis   [PATCH] audit sig...
956
957
958
959
960
  	u32 len;
  	int rc = 0;
  
  	ab = audit_log_start(context, GFP_KERNEL, AUDIT_OBJ_PID);
  	if (!ab)
6246ccab9   Eric Paris   [AUDIT] do not pa...
961
  		return rc;
e54dc2431   Amy Griffis   [PATCH] audit sig...
962

e1760bd5f   Eric W. Biederman   userns: Convert t...
963
964
  	audit_log_format(ab, "opid=%d oauid=%d ouid=%d oses=%d", pid,
  			 from_kuid(&init_user_ns, auid),
cca080d9b   Eric W. Biederman   userns: Convert a...
965
  			 from_kuid(&init_user_ns, uid), sessionid);
ad395abec   Eric Paris   Audit: do not pri...
966
967
968
969
970
971
972
973
  	if (sid) {
  		if (security_secid_to_secctx(sid, &ctx, &len)) {
  			audit_log_format(ab, " obj=(none)");
  			rc = 1;
  		} else {
  			audit_log_format(ab, " obj=%s", ctx);
  			security_release_secctx(ctx, len);
  		}
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
974
  	}
c2a7780ef   Eric Paris   [AUDIT] collect u...
975
976
  	audit_log_format(ab, " ocomm=");
  	audit_log_untrustedstring(ab, comm);
e54dc2431   Amy Griffis   [PATCH] audit sig...
977
  	audit_log_end(ab);
e54dc2431   Amy Griffis   [PATCH] audit sig...
978
979
980
  
  	return rc;
  }
43761473c   Paul Moore   audit: fix a doub...
981
982
  static void audit_log_execve_info(struct audit_context *context,
  				  struct audit_buffer **ab)
bdf4c48af   Peter Zijlstra   audit: rework exe...
983
  {
43761473c   Paul Moore   audit: fix a doub...
984
985
986
987
  	long len_max;
  	long len_rem;
  	long len_full;
  	long len_buf;
8443075ea   Richard Guy Briggs   audit: tame initi...
988
  	long len_abuf = 0;
43761473c   Paul Moore   audit: fix a doub...
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  	long len_tmp;
  	bool require_data;
  	bool encode;
  	unsigned int iter;
  	unsigned int arg;
  	char *buf_head;
  	char *buf;
  	const char __user *p = (const char __user *)current->mm->arg_start;
  
  	/* NOTE: this buffer needs to be large enough to hold all the non-arg
  	 *       data we put in the audit record for this argument (see the
  	 *       code below) ... at this point in time 96 is plenty */
  	char abuf[96];
  
  	/* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the
  	 *       current value of 7500 is not as important as the fact that it
  	 *       is less than 8k, a setting of 7500 gives us plenty of wiggle
  	 *       room if we go over a little bit in the logging below */
  	WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500);
  	len_max = MAX_EXECVE_AUDIT_LEN;
  
  	/* scratch buffer to hold the userspace args */
  	buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL);
  	if (!buf_head) {
  		audit_panic("out of memory for argv string");
  		return;
de6bbd1d3   Eric Paris   [AUDIT] break lar...
1015
  	}
43761473c   Paul Moore   audit: fix a doub...
1016
  	buf = buf_head;
040b3a2df   Peter Zijlstra   audit: fix two bu...
1017

43761473c   Paul Moore   audit: fix a doub...
1018
  	audit_log_format(*ab, "argc=%d", context->execve.argc);
040b3a2df   Peter Zijlstra   audit: fix two bu...
1019

43761473c   Paul Moore   audit: fix a doub...
1020
1021
1022
1023
1024
1025
1026
  	len_rem = len_max;
  	len_buf = 0;
  	len_full = 0;
  	require_data = true;
  	encode = false;
  	iter = 0;
  	arg = 0;
de6bbd1d3   Eric Paris   [AUDIT] break lar...
1027
  	do {
43761473c   Paul Moore   audit: fix a doub...
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
  		/* NOTE: we don't ever want to trust this value for anything
  		 *       serious, but the audit record format insists we
  		 *       provide an argument length for really long arguments,
  		 *       e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but
  		 *       to use strncpy_from_user() to obtain this value for
  		 *       recording in the log, although we don't use it
  		 *       anywhere here to avoid a double-fetch problem */
  		if (len_full == 0)
  			len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1;
  
  		/* read more data from userspace */
  		if (require_data) {
  			/* can we make more room in the buffer? */
  			if (buf != buf_head) {
  				memmove(buf_head, buf, len_buf);
  				buf = buf_head;
  			}
  
  			/* fetch as much as we can of the argument */
  			len_tmp = strncpy_from_user(&buf_head[len_buf], p,
  						    len_max - len_buf);
  			if (len_tmp == -EFAULT) {
  				/* unable to copy from userspace */
  				send_sig(SIGKILL, current, 0);
  				goto out;
  			} else if (len_tmp == (len_max - len_buf)) {
  				/* buffer is not large enough */
  				require_data = true;
  				/* NOTE: if we are going to span multiple
  				 *       buffers force the encoding so we stand
  				 *       a chance at a sane len_full value and
  				 *       consistent record encoding */
  				encode = true;
  				len_full = len_full * 2;
  				p += len_tmp;
  			} else {
  				require_data = false;
  				if (!encode)
  					encode = audit_string_contains_control(
  								buf, len_tmp);
  				/* try to use a trusted value for len_full */
  				if (len_full < len_max)
  					len_full = (encode ?
  						    len_tmp * 2 : len_tmp);
  				p += len_tmp + 1;
  			}
  			len_buf += len_tmp;
  			buf_head[len_buf] = '\0';
bdf4c48af   Peter Zijlstra   audit: rework exe...
1076

43761473c   Paul Moore   audit: fix a doub...
1077
1078
  			/* length of the buffer in the audit record? */
  			len_abuf = (encode ? len_buf * 2 : len_buf + 2);
bdf4c48af   Peter Zijlstra   audit: rework exe...
1079
  		}
de6bbd1d3   Eric Paris   [AUDIT] break lar...
1080

43761473c   Paul Moore   audit: fix a doub...
1081
  		/* write as much as we can to the audit log */
ea956d8be   Richard Guy Briggs   audit: print empt...
1082
  		if (len_buf >= 0) {
43761473c   Paul Moore   audit: fix a doub...
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
  			/* NOTE: some magic numbers here - basically if we
  			 *       can't fit a reasonable amount of data into the
  			 *       existing audit buffer, flush it and start with
  			 *       a new buffer */
  			if ((sizeof(abuf) + 8) > len_rem) {
  				len_rem = len_max;
  				audit_log_end(*ab);
  				*ab = audit_log_start(context,
  						      GFP_KERNEL, AUDIT_EXECVE);
  				if (!*ab)
  					goto out;
  			}
bdf4c48af   Peter Zijlstra   audit: rework exe...
1095

43761473c   Paul Moore   audit: fix a doub...
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
  			/* create the non-arg portion of the arg record */
  			len_tmp = 0;
  			if (require_data || (iter > 0) ||
  			    ((len_abuf + sizeof(abuf)) > len_rem)) {
  				if (iter == 0) {
  					len_tmp += snprintf(&abuf[len_tmp],
  							sizeof(abuf) - len_tmp,
  							" a%d_len=%lu",
  							arg, len_full);
  				}
  				len_tmp += snprintf(&abuf[len_tmp],
  						    sizeof(abuf) - len_tmp,
  						    " a%d[%d]=", arg, iter++);
  			} else
  				len_tmp += snprintf(&abuf[len_tmp],
  						    sizeof(abuf) - len_tmp,
  						    " a%d=", arg);
  			WARN_ON(len_tmp >= sizeof(abuf));
  			abuf[sizeof(abuf) - 1] = '\0';
  
  			/* log the arg in the audit record */
  			audit_log_format(*ab, "%s", abuf);
  			len_rem -= len_tmp;
  			len_tmp = len_buf;
  			if (encode) {
  				if (len_abuf > len_rem)
  					len_tmp = len_rem / 2; /* encoding */
  				audit_log_n_hex(*ab, buf, len_tmp);
  				len_rem -= len_tmp * 2;
  				len_abuf -= len_tmp * 2;
  			} else {
  				if (len_abuf > len_rem)
  					len_tmp = len_rem - 2; /* quotes */
  				audit_log_n_string(*ab, buf, len_tmp);
  				len_rem -= len_tmp + 2;
  				/* don't subtract the "2" because we still need
  				 * to add quotes to the remaining string */
  				len_abuf -= len_tmp;
  			}
  			len_buf -= len_tmp;
  			buf += len_tmp;
  		}
bdf4c48af   Peter Zijlstra   audit: rework exe...
1138

43761473c   Paul Moore   audit: fix a doub...
1139
1140
1141
1142
1143
1144
1145
1146
1147
  		/* ready to move to the next argument? */
  		if ((len_buf == 0) && !require_data) {
  			arg++;
  			iter = 0;
  			len_full = 0;
  			require_data = true;
  			encode = false;
  		}
  	} while (arg < context->execve.argc);
de6bbd1d3   Eric Paris   [AUDIT] break lar...
1148

43761473c   Paul Moore   audit: fix a doub...
1149
  	/* NOTE: the caller handles the final audit_log_end() call */
de6bbd1d3   Eric Paris   [AUDIT] break lar...
1150

43761473c   Paul Moore   audit: fix a doub...
1151
1152
  out:
  	kfree(buf_head);
bdf4c48af   Peter Zijlstra   audit: rework exe...
1153
  }
2efa48fec   YueHaibing   audit: Make audit...
1154
1155
  static void audit_log_cap(struct audit_buffer *ab, char *prefix,
  			  kernel_cap_t *cap)
5f3d544f1   Richard Guy Briggs   audit: remove aud...
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  {
  	int i;
  
  	if (cap_isclear(*cap)) {
  		audit_log_format(ab, " %s=0", prefix);
  		return;
  	}
  	audit_log_format(ab, " %s=", prefix);
  	CAP_FOR_EACH_U32(i)
  		audit_log_format(ab, "%08x", cap->cap[CAP_LAST_U32 - i]);
  }
  
  static void audit_log_fcaps(struct audit_buffer *ab, struct audit_names *name)
  {
  	if (name->fcap_ver == -1) {
  		audit_log_format(ab, " cap_fe=? cap_fver=? cap_fp=? cap_fi=?");
  		return;
  	}
  	audit_log_cap(ab, "cap_fp", &name->fcap.permitted);
  	audit_log_cap(ab, "cap_fi", &name->fcap.inheritable);
  	audit_log_format(ab, " cap_fe=%d cap_fver=%x cap_frootid=%d",
  			 name->fcap.fE, name->fcap_ver,
  			 from_kuid(&init_user_ns, name->fcap.rootid));
  }
a33e67510   Al Viro   sanitize audit_ip...
1180
  static void show_special(struct audit_context *context, int *call_panic)
f3298dc4f   Al Viro   sanitize audit_so...
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
  {
  	struct audit_buffer *ab;
  	int i;
  
  	ab = audit_log_start(context, GFP_KERNEL, context->type);
  	if (!ab)
  		return;
  
  	switch (context->type) {
  	case AUDIT_SOCKETCALL: {
  		int nargs = context->socketcall.nargs;
  		audit_log_format(ab, "nargs=%d", nargs);
  		for (i = 0; i < nargs; i++)
  			audit_log_format(ab, " a%d=%lx", i,
  				context->socketcall.args[i]);
  		break; }
a33e67510   Al Viro   sanitize audit_ip...
1197
1198
  	case AUDIT_IPC: {
  		u32 osid = context->ipc.osid;
2570ebbd1   Al Viro   switch kern_ipc_p...
1199
  		audit_log_format(ab, "ouid=%u ogid=%u mode=%#ho",
cca080d9b   Eric W. Biederman   userns: Convert a...
1200
1201
1202
  				 from_kuid(&init_user_ns, context->ipc.uid),
  				 from_kgid(&init_user_ns, context->ipc.gid),
  				 context->ipc.mode);
a33e67510   Al Viro   sanitize audit_ip...
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  		if (osid) {
  			char *ctx = NULL;
  			u32 len;
  			if (security_secid_to_secctx(osid, &ctx, &len)) {
  				audit_log_format(ab, " osid=%u", osid);
  				*call_panic = 1;
  			} else {
  				audit_log_format(ab, " obj=%s", ctx);
  				security_release_secctx(ctx, len);
  			}
  		}
e816f370c   Al Viro   sanitize audit_ip...
1214
1215
1216
1217
  		if (context->ipc.has_perm) {
  			audit_log_end(ab);
  			ab = audit_log_start(context, GFP_KERNEL,
  					     AUDIT_IPC_SET_PERM);
0644ec0cc   Kees Cook   audit: catch poss...
1218
1219
  			if (unlikely(!ab))
  				return;
e816f370c   Al Viro   sanitize audit_ip...
1220
  			audit_log_format(ab,
2570ebbd1   Al Viro   switch kern_ipc_p...
1221
  				"qbytes=%lx ouid=%u ogid=%u mode=%#ho",
e816f370c   Al Viro   sanitize audit_ip...
1222
1223
1224
1225
  				context->ipc.qbytes,
  				context->ipc.perm_uid,
  				context->ipc.perm_gid,
  				context->ipc.perm_mode);
e816f370c   Al Viro   sanitize audit_ip...
1226
  		}
a33e67510   Al Viro   sanitize audit_ip...
1227
  		break; }
fe8e52b9b   Paul Moore   audit: remove unn...
1228
  	case AUDIT_MQ_OPEN:
564f6993f   Al Viro   sanitize audit_mq...
1229
  		audit_log_format(ab,
df0a42837   Al Viro   switch mq_open() ...
1230
  			"oflag=0x%x mode=%#ho mq_flags=0x%lx mq_maxmsg=%ld "
564f6993f   Al Viro   sanitize audit_mq...
1231
1232
1233
1234
1235
1236
  			"mq_msgsize=%ld mq_curmsgs=%ld",
  			context->mq_open.oflag, context->mq_open.mode,
  			context->mq_open.attr.mq_flags,
  			context->mq_open.attr.mq_maxmsg,
  			context->mq_open.attr.mq_msgsize,
  			context->mq_open.attr.mq_curmsgs);
fe8e52b9b   Paul Moore   audit: remove unn...
1237
1238
  		break;
  	case AUDIT_MQ_SENDRECV:
c32c8af43   Al Viro   sanitize AUDIT_MQ...
1239
1240
  		audit_log_format(ab,
  			"mqdes=%d msg_len=%zd msg_prio=%u "
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
1241
  			"abs_timeout_sec=%lld abs_timeout_nsec=%ld",
c32c8af43   Al Viro   sanitize AUDIT_MQ...
1242
1243
1244
  			context->mq_sendrecv.mqdes,
  			context->mq_sendrecv.msg_len,
  			context->mq_sendrecv.msg_prio,
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
1245
  			(long long) context->mq_sendrecv.abs_timeout.tv_sec,
c32c8af43   Al Viro   sanitize AUDIT_MQ...
1246
  			context->mq_sendrecv.abs_timeout.tv_nsec);
fe8e52b9b   Paul Moore   audit: remove unn...
1247
1248
  		break;
  	case AUDIT_MQ_NOTIFY:
20114f71b   Al Viro   sanitize audit_mq...
1249
1250
1251
  		audit_log_format(ab, "mqdes=%d sigev_signo=%d",
  				context->mq_notify.mqdes,
  				context->mq_notify.sigev_signo);
fe8e52b9b   Paul Moore   audit: remove unn...
1252
  		break;
7392906ea   Al Viro   sanitize audit_mq...
1253
1254
1255
1256
1257
1258
1259
1260
1261
  	case AUDIT_MQ_GETSETATTR: {
  		struct mq_attr *attr = &context->mq_getsetattr.mqstat;
  		audit_log_format(ab,
  			"mqdes=%d mq_flags=0x%lx mq_maxmsg=%ld mq_msgsize=%ld "
  			"mq_curmsgs=%ld ",
  			context->mq_getsetattr.mqdes,
  			attr->mq_flags, attr->mq_maxmsg,
  			attr->mq_msgsize, attr->mq_curmsgs);
  		break; }
fe8e52b9b   Paul Moore   audit: remove unn...
1262
  	case AUDIT_CAPSET:
57f71a0af   Al Viro   sanitize audit_lo...
1263
1264
1265
1266
  		audit_log_format(ab, "pid=%d", context->capset.pid);
  		audit_log_cap(ab, "cap_pi", &context->capset.cap.inheritable);
  		audit_log_cap(ab, "cap_pp", &context->capset.cap.permitted);
  		audit_log_cap(ab, "cap_pe", &context->capset.cap.effective);
7786f6b6d   Richard Guy Briggs   audit: add ambien...
1267
  		audit_log_cap(ab, "cap_pa", &context->capset.cap.ambient);
fe8e52b9b   Paul Moore   audit: remove unn...
1268
1269
  		break;
  	case AUDIT_MMAP:
120a795da   Al Viro   audit mmap
1270
1271
  		audit_log_format(ab, "fd=%d flags=0x%x", context->mmap.fd,
  				 context->mmap.flags);
fe8e52b9b   Paul Moore   audit: remove unn...
1272
1273
  		break;
  	case AUDIT_EXECVE:
d9cfea91e   Richard Guy Briggs   audit: move audit...
1274
  		audit_log_execve_info(context, &ab);
fe8e52b9b   Paul Moore   audit: remove unn...
1275
  		break;
ca86cad73   Richard Guy Briggs   audit: log module...
1276
1277
  	case AUDIT_KERN_MODULE:
  		audit_log_format(ab, "name=");
b305f7ed0   Yi Wang   audit: fix potent...
1278
1279
  		if (context->module.name) {
  			audit_log_untrustedstring(ab, context->module.name);
b305f7ed0   Yi Wang   audit: fix potent...
1280
1281
  		} else
  			audit_log_format(ab, "(null)");
ca86cad73   Richard Guy Briggs   audit: log module...
1282
  		break;
f3298dc4f   Al Viro   sanitize audit_so...
1283
1284
1285
  	}
  	audit_log_end(ab);
  }
3f1c82502   William Roberts   audit: Audit proc...
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
  static inline int audit_proctitle_rtrim(char *proctitle, int len)
  {
  	char *end = proctitle + len - 1;
  	while (end > proctitle && !isprint(*end))
  		end--;
  
  	/* catch the case where proctitle is only 1 non-print character */
  	len = end - proctitle + 1;
  	len -= isprint(proctitle[len-1]) == 0;
  	return len;
  }
5f3d544f1   Richard Guy Briggs   audit: remove aud...
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
  /*
   * audit_log_name - produce AUDIT_PATH record from struct audit_names
   * @context: audit_context for the task
   * @n: audit_names structure with reportable details
   * @path: optional path to report instead of audit_names->name
   * @record_num: record number to report when handling a list of names
   * @call_panic: optional pointer to int that will be updated if secid fails
   */
  static void audit_log_name(struct audit_context *context, struct audit_names *n,
  		    const struct path *path, int record_num, int *call_panic)
  {
  	struct audit_buffer *ab;
  
  	ab = audit_log_start(context, GFP_KERNEL, AUDIT_PATH);
  	if (!ab)
  		return;
  
  	audit_log_format(ab, "item=%d", record_num);
  
  	if (path)
  		audit_log_d_path(ab, " name=", path);
  	else if (n->name) {
  		switch (n->name_len) {
  		case AUDIT_NAME_FULL:
  			/* log the full path */
  			audit_log_format(ab, " name=");
  			audit_log_untrustedstring(ab, n->name->name);
  			break;
  		case 0:
  			/* name was specified as a relative path and the
  			 * directory component is the cwd
  			 */
  			audit_log_d_path(ab, " name=", &context->pwd);
  			break;
  		default:
  			/* log the name's directory component */
  			audit_log_format(ab, " name=");
  			audit_log_n_untrustedstring(ab, n->name->name,
  						    n->name_len);
  		}
  	} else
  		audit_log_format(ab, " name=(null)");
  
  	if (n->ino != AUDIT_INO_UNSET)
  		audit_log_format(ab, " inode=%lu dev=%02x:%02x mode=%#ho ouid=%u ogid=%u rdev=%02x:%02x",
  				 n->ino,
  				 MAJOR(n->dev),
  				 MINOR(n->dev),
  				 n->mode,
  				 from_kuid(&init_user_ns, n->uid),
  				 from_kgid(&init_user_ns, n->gid),
  				 MAJOR(n->rdev),
  				 MINOR(n->rdev));
  	if (n->osid != 0) {
  		char *ctx = NULL;
  		u32 len;
  
  		if (security_secid_to_secctx(
  			n->osid, &ctx, &len)) {
  			audit_log_format(ab, " osid=%u", n->osid);
  			if (call_panic)
  				*call_panic = 2;
  		} else {
  			audit_log_format(ab, " obj=%s", ctx);
  			security_release_secctx(ctx, len);
  		}
  	}
  
  	/* log the audit_names record type */
  	switch (n->type) {
  	case AUDIT_TYPE_NORMAL:
  		audit_log_format(ab, " nametype=NORMAL");
  		break;
  	case AUDIT_TYPE_PARENT:
  		audit_log_format(ab, " nametype=PARENT");
  		break;
  	case AUDIT_TYPE_CHILD_DELETE:
  		audit_log_format(ab, " nametype=DELETE");
  		break;
  	case AUDIT_TYPE_CHILD_CREATE:
  		audit_log_format(ab, " nametype=CREATE");
  		break;
  	default:
  		audit_log_format(ab, " nametype=UNKNOWN");
  		break;
  	}
  
  	audit_log_fcaps(ab, n);
  	audit_log_end(ab);
  }
2a1fe215e   Paul Moore   audit: use curren...
1387
  static void audit_log_proctitle(void)
3f1c82502   William Roberts   audit: Audit proc...
1388
1389
1390
1391
1392
  {
  	int res;
  	char *buf;
  	char *msg = "(null)";
  	int len = strlen(msg);
2a1fe215e   Paul Moore   audit: use curren...
1393
  	struct audit_context *context = audit_context();
3f1c82502   William Roberts   audit: Audit proc...
1394
  	struct audit_buffer *ab;
8ac68dc45   Paul Moore   revert: 1320a4052...
1395
1396
  	if (!context || context->dummy)
  		return;
3f1c82502   William Roberts   audit: Audit proc...
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
  	ab = audit_log_start(context, GFP_KERNEL, AUDIT_PROCTITLE);
  	if (!ab)
  		return;	/* audit_panic or being filtered */
  
  	audit_log_format(ab, "proctitle=");
  
  	/* Not  cached */
  	if (!context->proctitle.value) {
  		buf = kmalloc(MAX_PROCTITLE_AUDIT_LEN, GFP_KERNEL);
  		if (!buf)
  			goto out;
  		/* Historically called this from procfs naming */
2a1fe215e   Paul Moore   audit: use curren...
1409
  		res = get_cmdline(current, buf, MAX_PROCTITLE_AUDIT_LEN);
3f1c82502   William Roberts   audit: Audit proc...
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
  		if (res == 0) {
  			kfree(buf);
  			goto out;
  		}
  		res = audit_proctitle_rtrim(buf, res);
  		if (res == 0) {
  			kfree(buf);
  			goto out;
  		}
  		context->proctitle.value = buf;
  		context->proctitle.len = res;
  	}
  	msg = context->proctitle.value;
  	len = context->proctitle.len;
  out:
  	audit_log_n_untrustedstring(ab, msg, len);
  	audit_log_end(ab);
  }
2a1fe215e   Paul Moore   audit: use curren...
1428
  static void audit_log_exit(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
  {
9c7aa6aa7   Steve Grubb   [PATCH] change ls...
1430
  	int i, call_panic = 0;
2a1fe215e   Paul Moore   audit: use curren...
1431
  	struct audit_context *context = audit_context();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1432
  	struct audit_buffer *ab;
7551ced33   David Woodhouse   AUDIT: Defer free...
1433
  	struct audit_aux_data *aux;
5195d8e21   Eric Paris   audit: dynamicall...
1434
  	struct audit_names *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1435

2a1fe215e   Paul Moore   audit: use curren...
1436
  	context->personality = current->personality;
e495149b1   Al Viro   [PATCH] drop gfp_...
1437
1438
  
  	ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
  	if (!ab)
  		return;		/* audit_panic has been called */
bccf6ae08   David Woodhouse   AUDIT: Unify auid...
1441
1442
  	audit_log_format(ab, "arch=%x syscall=%d",
  			 context->arch, context->major);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1443
1444
1445
  	if (context->personality != PER_LINUX)
  		audit_log_format(ab, " per=%lx", context->personality);
  	if (context->return_valid)
9f8dbe9c9   Daniel Walker   whitespace fixes:...
1446
  		audit_log_format(ab, " success=%s exit=%ld",
2fd6f58ba   David Woodhouse   [AUDIT] Don't all...
1447
1448
  				 (context->return_valid==AUDITSC_SUCCESS)?"yes":"no",
  				 context->return_code);
eb84a20e9   Alan Cox   [PATCH] audit/acc...
1449

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1450
  	audit_log_format(ab,
e23eb920b   Peter Moody   audit: export aud...
1451
1452
1453
1454
1455
1456
  			 " a0=%lx a1=%lx a2=%lx a3=%lx items=%d",
  			 context->argv[0],
  			 context->argv[1],
  			 context->argv[2],
  			 context->argv[3],
  			 context->name_count);
eb84a20e9   Alan Cox   [PATCH] audit/acc...
1457

2a1fe215e   Paul Moore   audit: use curren...
1458
  	audit_log_task_info(ab);
9d9609851   Eric Paris   Audit: clean up a...
1459
  	audit_log_key(ab, context->filterkey);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460
  	audit_log_end(ab);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1461

7551ced33   David Woodhouse   AUDIT: Defer free...
1462
  	for (aux = context->aux; aux; aux = aux->next) {
c04049939   Steve Grubb   AUDIT: Add messag...
1463

e495149b1   Al Viro   [PATCH] drop gfp_...
1464
  		ab = audit_log_start(context, GFP_KERNEL, aux->type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1465
1466
  		if (!ab)
  			continue; /* audit_panic has been called */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1467
  		switch (aux->type) {
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
1468

3fc689e96   Eric Paris   Any time fcaps or...
1469
1470
1471
1472
1473
1474
1475
1476
1477
  		case AUDIT_BPRM_FCAPS: {
  			struct audit_aux_data_bprm_fcaps *axs = (void *)aux;
  			audit_log_format(ab, "fver=%x", axs->fcap_ver);
  			audit_log_cap(ab, "fp", &axs->fcap.permitted);
  			audit_log_cap(ab, "fi", &axs->fcap.inheritable);
  			audit_log_format(ab, " fe=%d", axs->fcap.fE);
  			audit_log_cap(ab, "old_pp", &axs->old_pcap.permitted);
  			audit_log_cap(ab, "old_pi", &axs->old_pcap.inheritable);
  			audit_log_cap(ab, "old_pe", &axs->old_pcap.effective);
7786f6b6d   Richard Guy Briggs   audit: add ambien...
1478
1479
1480
1481
1482
  			audit_log_cap(ab, "old_pa", &axs->old_pcap.ambient);
  			audit_log_cap(ab, "pp", &axs->new_pcap.permitted);
  			audit_log_cap(ab, "pi", &axs->new_pcap.inheritable);
  			audit_log_cap(ab, "pe", &axs->new_pcap.effective);
  			audit_log_cap(ab, "pa", &axs->new_pcap.ambient);
2fec30e24   Richard Guy Briggs   audit: add suppor...
1483
1484
1485
  			audit_log_format(ab, " frootid=%d",
  					 from_kuid(&init_user_ns,
  						   axs->fcap.rootid));
3fc689e96   Eric Paris   Any time fcaps or...
1486
  			break; }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1487
1488
  		}
  		audit_log_end(ab);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1489
  	}
f3298dc4f   Al Viro   sanitize audit_so...
1490
  	if (context->type)
a33e67510   Al Viro   sanitize audit_ip...
1491
  		show_special(context, &call_panic);
f3298dc4f   Al Viro   sanitize audit_so...
1492

157cf649a   Al Viro   sanitize audit_fd...
1493
1494
1495
1496
1497
1498
1499
1500
  	if (context->fds[0] >= 0) {
  		ab = audit_log_start(context, GFP_KERNEL, AUDIT_FD_PAIR);
  		if (ab) {
  			audit_log_format(ab, "fd0=%d fd1=%d",
  					context->fds[0], context->fds[1]);
  			audit_log_end(ab);
  		}
  	}
4f6b434fe   Al Viro   don't reallocate ...
1501
1502
1503
1504
1505
1506
1507
1508
1509
  	if (context->sockaddr_len) {
  		ab = audit_log_start(context, GFP_KERNEL, AUDIT_SOCKADDR);
  		if (ab) {
  			audit_log_format(ab, "saddr=");
  			audit_log_n_hex(ab, (void *)context->sockaddr,
  					context->sockaddr_len);
  			audit_log_end(ab);
  		}
  	}
e54dc2431   Amy Griffis   [PATCH] audit sig...
1510
1511
  	for (aux = context->aux_pids; aux; aux = aux->next) {
  		struct audit_aux_data_pids *axs = (void *)aux;
e54dc2431   Amy Griffis   [PATCH] audit sig...
1512
1513
1514
  
  		for (i = 0; i < axs->pid_count; i++)
  			if (audit_log_pid_context(context, axs->target_pid[i],
c2a7780ef   Eric Paris   [AUDIT] collect u...
1515
1516
  						  axs->target_auid[i],
  						  axs->target_uid[i],
4746ec5b0   Eric Paris   [AUDIT] add sessi...
1517
  						  axs->target_sessionid[i],
c2a7780ef   Eric Paris   [AUDIT] collect u...
1518
1519
  						  axs->target_sid[i],
  						  axs->target_comm[i]))
e54dc2431   Amy Griffis   [PATCH] audit sig...
1520
  				call_panic = 1;
a5cb013da   Al Viro   [PATCH] auditing ...
1521
  	}
e54dc2431   Amy Griffis   [PATCH] audit sig...
1522
1523
  	if (context->target_pid &&
  	    audit_log_pid_context(context, context->target_pid,
c2a7780ef   Eric Paris   [AUDIT] collect u...
1524
  				  context->target_auid, context->target_uid,
4746ec5b0   Eric Paris   [AUDIT] add sessi...
1525
  				  context->target_sessionid,
c2a7780ef   Eric Paris   [AUDIT] collect u...
1526
  				  context->target_sid, context->target_comm))
e54dc2431   Amy Griffis   [PATCH] audit sig...
1527
  			call_panic = 1;
44707fdf5   Jan Blunck   d_path: Use struc...
1528
  	if (context->pwd.dentry && context->pwd.mnt) {
e495149b1   Al Viro   [PATCH] drop gfp_...
1529
  		ab = audit_log_start(context, GFP_KERNEL, AUDIT_CWD);
8f37d47c9   David Woodhouse   AUDIT: Record wor...
1530
  		if (ab) {
0b7a0fdb2   Steve Grubb   audit: fix whites...
1531
  			audit_log_d_path(ab, "cwd=", &context->pwd);
8f37d47c9   David Woodhouse   AUDIT: Record wor...
1532
1533
1534
  			audit_log_end(ab);
  		}
  	}
73241ccca   Amy Griffis   [PATCH] Collect m...
1535

5195d8e21   Eric Paris   audit: dynamicall...
1536
  	i = 0;
79f6530cb   Jeff Layton   audit: fix mq_ope...
1537
1538
1539
  	list_for_each_entry(n, &context->names_list, list) {
  		if (n->hidden)
  			continue;
b24a30a73   Eric Paris   audit: fix event ...
1540
  		audit_log_name(context, n, NULL, i++, &call_panic);
79f6530cb   Jeff Layton   audit: fix mq_ope...
1541
  	}
c0641f28d   Eric Paris   [AUDIT] Add End o...
1542

2a1fe215e   Paul Moore   audit: use curren...
1543
  	audit_log_proctitle();
3f1c82502   William Roberts   audit: Audit proc...
1544

c0641f28d   Eric Paris   [AUDIT] Add End o...
1545
1546
1547
1548
  	/* Send end of event record to help user space know we are finished */
  	ab = audit_log_start(context, GFP_KERNEL, AUDIT_EOE);
  	if (ab)
  		audit_log_end(ab);
9c7aa6aa7   Steve Grubb   [PATCH] change ls...
1549
1550
  	if (call_panic)
  		audit_panic("error converting sid to string");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1551
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1552
  /**
196a50855   Geliang Tang   audit: update the...
1553
   * __audit_free - free a per-task audit context
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1554
1555
   * @tsk: task whose audit context block to free
   *
fa84cb935   Al Viro   [PATCH] move call...
1556
   * Called from copy_process and do_exit
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1557
   */
a4ff8dba7   Eric Paris   audit: inline aud...
1558
  void __audit_free(struct task_struct *tsk)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1559
  {
2a1fe215e   Paul Moore   audit: use curren...
1560
  	struct audit_context *context = tsk->audit_context;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561

56179a6ec   Eric Paris   audit: drop some ...
1562
  	if (!context)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1563
  		return;
9e36a5d49   Richard Guy Briggs   audit: hand taken...
1564
1565
  	if (!list_empty(&context->killed_trees))
  		audit_kill_trees(context);
2a1fe215e   Paul Moore   audit: use curren...
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
  	/* We are called either by do_exit() or the fork() error handling code;
  	 * in the former case tsk == current and in the latter tsk is a
  	 * random task_struct that doesn't doesn't have any meaningful data we
  	 * need to log via audit_log_exit().
  	 */
  	if (tsk == current && !context->dummy && context->in_syscall) {
  		context->return_valid = 0;
  		context->return_code = 0;
  
  		audit_filter_syscall(tsk, context,
  				     &audit_filter_list[AUDIT_FILTER_EXIT]);
  		audit_filter_inodes(tsk, context);
  		if (context->current_state == AUDIT_RECORD_CONTEXT)
  			audit_log_exit();
  	}
2a1fe215e   Paul Moore   audit: use curren...
1581
  	audit_set_context(tsk, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1582
1583
  	audit_free_context(context);
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1584
  /**
196a50855   Geliang Tang   audit: update the...
1585
   * __audit_syscall_entry - fill in an audit record at syscall entry
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1586
1587
1588
1589
1590
1591
1592
   * @major: major syscall type (function)
   * @a1: additional syscall register 1
   * @a2: additional syscall register 2
   * @a3: additional syscall register 3
   * @a4: additional syscall register 4
   *
   * Fill in audit context at syscall entry.  This only happens if the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593
1594
1595
1596
1597
   * audit context was created when the task was created and the state or
   * filters demand the audit context be built.  If the state from the
   * per-task filter or from the per-syscall filter is AUDIT_RECORD_CONTEXT,
   * then the record will be written at syscall exit time (otherwise, it
   * will only be written if another part of the kernel requests that it
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1598
1599
   * be written).
   */
b4f0d3755   Richard Guy Briggs   audit: x86: drop ...
1600
1601
  void __audit_syscall_entry(int major, unsigned long a1, unsigned long a2,
  			   unsigned long a3, unsigned long a4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1602
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
1603
  	struct audit_context *context = audit_context();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1604
  	enum audit_state     state;
94d14e3e7   Richard Guy Briggs   audit: bail befor...
1605
  	if (!audit_enabled || !context)
86a1c34a9   Roland McGrath   x86_64 syscall au...
1606
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1607

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
  	BUG_ON(context->in_syscall || context->name_count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1609
  	state = context->state;
5260ecc2e   Richard Guy Briggs   audit: deprecate ...
1610
1611
  	if (state == AUDIT_DISABLED)
  		return;
d51374adf   Al Viro   [PATCH] mark cont...
1612
  	context->dummy = !audit_n_rules;
0590b9335   Al Viro   fixing audit rule...
1613
1614
  	if (!context->dummy && state == AUDIT_BUILD_CONTEXT) {
  		context->prio = 0;
cdfb6b341   Richard Guy Briggs   audit: use inline...
1615
  		if (auditd_test_task(current))
5260ecc2e   Richard Guy Briggs   audit: deprecate ...
1616
  			return;
0590b9335   Al Viro   fixing audit rule...
1617
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1618

16add4116   Dmitry V. Levin   syscall_get_arch:...
1619
  	context->arch	    = syscall_get_arch(current);
5260ecc2e   Richard Guy Briggs   audit: deprecate ...
1620
1621
1622
1623
1624
  	context->major      = major;
  	context->argv[0]    = a1;
  	context->argv[1]    = a2;
  	context->argv[2]    = a3;
  	context->argv[3]    = a4;
ce625a801   David Woodhouse   AUDIT: Reduce con...
1625
  	context->serial     = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1626
  	context->in_syscall = 1;
0590b9335   Al Viro   fixing audit rule...
1627
  	context->current_state  = state;
419c58f11   Alexander Viro   [PATCH] PPID filt...
1628
  	context->ppid       = 0;
290e44b7d   Paul Moore   audit: use ktime_...
1629
  	ktime_get_coarse_real_ts64(&context->ctime);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1630
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1631
  /**
196a50855   Geliang Tang   audit: update the...
1632
   * __audit_syscall_exit - deallocate audit context after a system call
42ae610c1   Randy Dunlap   kernel-doc: fix n...
1633
1634
   * @success: success value of the syscall
   * @return_code: return value of the syscall
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1635
1636
   *
   * Tear down after system call.  If the audit context has been marked as
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1637
   * auditable (either because of the AUDIT_RECORD_CONTEXT state from
42ae610c1   Randy Dunlap   kernel-doc: fix n...
1638
   * filtering, or because some other part of the kernel wrote an audit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1639
   * message), then write out the syscall information.  In call cases,
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1640
1641
   * free the names stored from getname().
   */
d7e7528bc   Eric Paris   Audit: push audit...
1642
  void __audit_syscall_exit(int success, long return_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1643
1644
  {
  	struct audit_context *context;
2a1fe215e   Paul Moore   audit: use curren...
1645
  	context = audit_context();
56179a6ec   Eric Paris   audit: drop some ...
1646
  	if (!context)
97e94c453   Al Viro   [PATCH] no need t...
1647
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1648

9e36a5d49   Richard Guy Briggs   audit: hand taken...
1649
1650
  	if (!list_empty(&context->killed_trees))
  		audit_kill_trees(context);
2a1fe215e   Paul Moore   audit: use curren...
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
  	if (!context->dummy && context->in_syscall) {
  		if (success)
  			context->return_valid = AUDITSC_SUCCESS;
  		else
  			context->return_valid = AUDITSC_FAILURE;
  
  		/*
  		 * we need to fix up the return code in the audit logs if the
  		 * actual return codes are later going to be fixed up by the
  		 * arch specific signal handlers
  		 *
  		 * This is actually a test for:
  		 * (rc == ERESTARTSYS ) || (rc == ERESTARTNOINTR) ||
  		 * (rc == ERESTARTNOHAND) || (rc == ERESTART_RESTARTBLOCK)
  		 *
  		 * but is faster than a bunch of ||
  		 */
  		if (unlikely(return_code <= -ERESTARTSYS) &&
  		    (return_code >= -ERESTART_RESTARTBLOCK) &&
  		    (return_code != -ENOIOCTLCMD))
  			context->return_code = -EINTR;
  		else
  			context->return_code  = return_code;
  
  		audit_filter_syscall(current, context,
  				     &audit_filter_list[AUDIT_FILTER_EXIT]);
  		audit_filter_inodes(current, context);
  		if (context->current_state == AUDIT_RECORD_CONTEXT)
  			audit_log_exit();
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
  
  	context->in_syscall = 0;
0590b9335   Al Viro   fixing audit rule...
1683
  	context->prio = context->state == AUDIT_RECORD_CONTEXT ? ~0ULL : 0;
2fd6f58ba   David Woodhouse   [AUDIT] Don't all...
1684

95e0b46fc   Li RongQing   audit: fix a meml...
1685
  	audit_free_module(context);
c62d773a3   Al Viro   audit: no nested ...
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
  	audit_free_names(context);
  	unroll_tree_refs(context, NULL, 0);
  	audit_free_aux(context);
  	context->aux = NULL;
  	context->aux_pids = NULL;
  	context->target_pid = 0;
  	context->target_sid = 0;
  	context->sockaddr_len = 0;
  	context->type = 0;
  	context->fds[0] = -1;
  	if (context->state != AUDIT_RECORD_CONTEXT) {
  		kfree(context->filterkey);
  		context->filterkey = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1699
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1700
  }
74c3cbe33   Al Viro   [PATCH] audit: wa...
1701
1702
  static inline void handle_one(const struct inode *inode)
  {
74c3cbe33   Al Viro   [PATCH] audit: wa...
1703
1704
1705
1706
  	struct audit_context *context;
  	struct audit_tree_refs *p;
  	struct audit_chunk *chunk;
  	int count;
08991e83b   Jan Kara   fsnotify: Free fs...
1707
  	if (likely(!inode->i_fsnotify_marks))
74c3cbe33   Al Viro   [PATCH] audit: wa...
1708
  		return;
cdfb6b341   Richard Guy Briggs   audit: use inline...
1709
  	context = audit_context();
74c3cbe33   Al Viro   [PATCH] audit: wa...
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
  	p = context->trees;
  	count = context->tree_count;
  	rcu_read_lock();
  	chunk = audit_tree_lookup(inode);
  	rcu_read_unlock();
  	if (!chunk)
  		return;
  	if (likely(put_tree_ref(context, chunk)))
  		return;
  	if (unlikely(!grow_tree_refs(context))) {
f952d10ff   Richard Guy Briggs   audit: Use more c...
1720
1721
  		pr_warn("out of memory, audit has lost a tree reference
  ");
74c3cbe33   Al Viro   [PATCH] audit: wa...
1722
1723
1724
1725
1726
1727
  		audit_set_auditable(context);
  		audit_put_chunk(chunk);
  		unroll_tree_refs(context, p, count);
  		return;
  	}
  	put_tree_ref(context, chunk);
74c3cbe33   Al Viro   [PATCH] audit: wa...
1728
1729
1730
1731
  }
  
  static void handle_path(const struct dentry *dentry)
  {
74c3cbe33   Al Viro   [PATCH] audit: wa...
1732
1733
1734
1735
1736
1737
  	struct audit_context *context;
  	struct audit_tree_refs *p;
  	const struct dentry *d, *parent;
  	struct audit_chunk *drop;
  	unsigned long seq;
  	int count;
cdfb6b341   Richard Guy Briggs   audit: use inline...
1738
  	context = audit_context();
74c3cbe33   Al Viro   [PATCH] audit: wa...
1739
1740
1741
1742
1743
1744
1745
1746
  	p = context->trees;
  	count = context->tree_count;
  retry:
  	drop = NULL;
  	d = dentry;
  	rcu_read_lock();
  	seq = read_seqbegin(&rename_lock);
  	for(;;) {
3b362157b   David Howells   VFS: audit: d_bac...
1747
  		struct inode *inode = d_backing_inode(d);
08991e83b   Jan Kara   fsnotify: Free fs...
1748
  		if (inode && unlikely(inode->i_fsnotify_marks)) {
74c3cbe33   Al Viro   [PATCH] audit: wa...
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
  			struct audit_chunk *chunk;
  			chunk = audit_tree_lookup(inode);
  			if (chunk) {
  				if (unlikely(!put_tree_ref(context, chunk))) {
  					drop = chunk;
  					break;
  				}
  			}
  		}
  		parent = d->d_parent;
  		if (parent == d)
  			break;
  		d = parent;
  	}
  	if (unlikely(read_seqretry(&rename_lock, seq) || drop)) {  /* in this order */
  		rcu_read_unlock();
  		if (!drop) {
  			/* just a race with rename */
  			unroll_tree_refs(context, p, count);
  			goto retry;
  		}
  		audit_put_chunk(drop);
  		if (grow_tree_refs(context)) {
  			/* OK, got more space */
  			unroll_tree_refs(context, p, count);
  			goto retry;
  		}
  		/* too bad */
f952d10ff   Richard Guy Briggs   audit: Use more c...
1777
1778
  		pr_warn("out of memory, audit has lost a tree reference
  ");
74c3cbe33   Al Viro   [PATCH] audit: wa...
1779
1780
1781
1782
1783
  		unroll_tree_refs(context, p, count);
  		audit_set_auditable(context);
  		return;
  	}
  	rcu_read_unlock();
74c3cbe33   Al Viro   [PATCH] audit: wa...
1784
  }
78e2e802a   Jeff Layton   audit: add a new ...
1785
1786
  static struct audit_names *audit_alloc_name(struct audit_context *context,
  						unsigned char type)
5195d8e21   Eric Paris   audit: dynamicall...
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
  {
  	struct audit_names *aname;
  
  	if (context->name_count < AUDIT_NAMES) {
  		aname = &context->preallocated_names[context->name_count];
  		memset(aname, 0, sizeof(*aname));
  	} else {
  		aname = kzalloc(sizeof(*aname), GFP_NOFS);
  		if (!aname)
  			return NULL;
  		aname->should_free = true;
  	}
84cb777e6   Richard Guy Briggs   audit: use macros...
1799
  	aname->ino = AUDIT_INO_UNSET;
78e2e802a   Jeff Layton   audit: add a new ...
1800
  	aname->type = type;
5195d8e21   Eric Paris   audit: dynamicall...
1801
1802
1803
  	list_add_tail(&aname->list, &context->names_list);
  
  	context->name_count++;
5195d8e21   Eric Paris   audit: dynamicall...
1804
1805
  	return aname;
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1806
  /**
196a50855   Geliang Tang   audit: update the...
1807
   * __audit_reusename - fill out filename with info from existing entry
7ac86265d   Jeff Layton   audit: allow audi...
1808
1809
1810
1811
1812
1813
1814
1815
1816
   * @uptr: userland ptr to pathname
   *
   * Search the audit_names list for the current audit context. If there is an
   * existing entry with a matching "uptr" then return the filename
   * associated with that audit_name. If not, return NULL.
   */
  struct filename *
  __audit_reusename(const __user char *uptr)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
1817
  	struct audit_context *context = audit_context();
7ac86265d   Jeff Layton   audit: allow audi...
1818
1819
1820
1821
1822
  	struct audit_names *n;
  
  	list_for_each_entry(n, &context->names_list, list) {
  		if (!n->name)
  			continue;
55422d0bd   Paul Moore   audit: replace ge...
1823
1824
  		if (n->name->uptr == uptr) {
  			n->name->refcnt++;
7ac86265d   Jeff Layton   audit: allow audi...
1825
  			return n->name;
55422d0bd   Paul Moore   audit: replace ge...
1826
  		}
7ac86265d   Jeff Layton   audit: allow audi...
1827
1828
1829
  	}
  	return NULL;
  }
d7481b24b   Richard Guy Briggs   audit: issue CWD ...
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
  inline void _audit_getcwd(struct audit_context *context)
  {
  	if (!context->pwd.dentry)
  		get_fs_pwd(current->fs, &context->pwd);
  }
  
  void __audit_getcwd(void)
  {
  	struct audit_context *context = audit_context();
  
  	if (context->in_syscall)
  		_audit_getcwd(context);
  }
7ac86265d   Jeff Layton   audit: allow audi...
1843
  /**
196a50855   Geliang Tang   audit: update the...
1844
   * __audit_getname - add a name to the list
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1845
1846
1847
1848
1849
   * @name: name to add
   *
   * Add a name to the list of audit names for this context.
   * Called from fs/namei.c:getname().
   */
91a27b2a7   Jeff Layton   vfs: define struc...
1850
  void __audit_getname(struct filename *name)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1851
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
1852
  	struct audit_context *context = audit_context();
5195d8e21   Eric Paris   audit: dynamicall...
1853
  	struct audit_names *n;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1854

55422d0bd   Paul Moore   audit: replace ge...
1855
  	if (!context->in_syscall)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1856
  		return;
91a27b2a7   Jeff Layton   vfs: define struc...
1857

78e2e802a   Jeff Layton   audit: add a new ...
1858
  	n = audit_alloc_name(context, AUDIT_TYPE_UNKNOWN);
5195d8e21   Eric Paris   audit: dynamicall...
1859
1860
1861
1862
1863
  	if (!n)
  		return;
  
  	n->name = name;
  	n->name_len = AUDIT_NAME_FULL;
adb5c2473   Jeff Layton   audit: make audit...
1864
  	name->aname = n;
55422d0bd   Paul Moore   audit: replace ge...
1865
  	name->refcnt++;
5195d8e21   Eric Paris   audit: dynamicall...
1866

d7481b24b   Richard Guy Briggs   audit: issue CWD ...
1867
  	_audit_getcwd(context);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1868
  }
5f3d544f1   Richard Guy Briggs   audit: remove aud...
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
  static inline int audit_copy_fcaps(struct audit_names *name,
  				   const struct dentry *dentry)
  {
  	struct cpu_vfs_cap_data caps;
  	int rc;
  
  	if (!dentry)
  		return 0;
  
  	rc = get_vfs_caps_from_disk(dentry, &caps);
  	if (rc)
  		return rc;
  
  	name->fcap.permitted = caps.permitted;
  	name->fcap.inheritable = caps.inheritable;
  	name->fcap.fE = !!(caps.magic_etc & VFS_CAP_FLAGS_EFFECTIVE);
  	name->fcap.rootid = caps.rootid;
  	name->fcap_ver = (caps.magic_etc & VFS_CAP_REVISION_MASK) >>
  				VFS_CAP_REVISION_SHIFT;
  
  	return 0;
  }
  
  /* Copy inode data into an audit_names. */
2efa48fec   YueHaibing   audit: Make audit...
1893
1894
1895
  static void audit_copy_inode(struct audit_names *name,
  			     const struct dentry *dentry,
  			     struct inode *inode, unsigned int flags)
5f3d544f1   Richard Guy Briggs   audit: remove aud...
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
  {
  	name->ino   = inode->i_ino;
  	name->dev   = inode->i_sb->s_dev;
  	name->mode  = inode->i_mode;
  	name->uid   = inode->i_uid;
  	name->gid   = inode->i_gid;
  	name->rdev  = inode->i_rdev;
  	security_inode_getsecid(inode, &name->osid);
  	if (flags & AUDIT_INODE_NOEVAL) {
  		name->fcap_ver = -1;
  		return;
  	}
  	audit_copy_fcaps(name, dentry);
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1910
  /**
bfcec7087   Jeff Layton   audit: set the na...
1911
   * __audit_inode - store the inode and device from a lookup
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1912
   * @name: name being audited
481968f44   Randy Dunlap   auditsc: fix kern...
1913
   * @dentry: dentry being audited
79f6530cb   Jeff Layton   audit: fix mq_ope...
1914
   * @flags: attributes for this particular entry
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
1915
   */
adb5c2473   Jeff Layton   audit: make audit...
1916
  void __audit_inode(struct filename *name, const struct dentry *dentry,
79f6530cb   Jeff Layton   audit: fix mq_ope...
1917
  		   unsigned int flags)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1918
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
1919
  	struct audit_context *context = audit_context();
d6335d77a   Andreas Gruenbacher   security: Make in...
1920
  	struct inode *inode = d_backing_inode(dentry);
5195d8e21   Eric Paris   audit: dynamicall...
1921
  	struct audit_names *n;
79f6530cb   Jeff Layton   audit: fix mq_ope...
1922
  	bool parent = flags & AUDIT_INODE_PARENT;
a252f56a3   Richard Guy Briggs   audit: more filte...
1923
1924
1925
  	struct audit_entry *e;
  	struct list_head *list = &audit_filter_list[AUDIT_FILTER_FS];
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926
1927
1928
  
  	if (!context->in_syscall)
  		return;
5195d8e21   Eric Paris   audit: dynamicall...
1929

a252f56a3   Richard Guy Briggs   audit: more filte...
1930
  	rcu_read_lock();
699c1868a   Richard Guy Briggs   audit: purge unne...
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
  	list_for_each_entry_rcu(e, list, list) {
  		for (i = 0; i < e->rule.field_count; i++) {
  			struct audit_field *f = &e->rule.fields[i];
  
  			if (f->type == AUDIT_FSTYPE
  			    && audit_comparator(inode->i_sb->s_magic,
  						f->op, f->val)
  			    && e->rule.action == AUDIT_NEVER) {
  				rcu_read_unlock();
  				return;
a252f56a3   Richard Guy Briggs   audit: more filte...
1941
1942
1943
1944
  			}
  		}
  	}
  	rcu_read_unlock();
9cec9d68a   Jeff Layton   audit: no need to...
1945
1946
  	if (!name)
  		goto out_alloc;
adb5c2473   Jeff Layton   audit: make audit...
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
  	/*
  	 * If we have a pointer to an audit_names entry already, then we can
  	 * just use it directly if the type is correct.
  	 */
  	n = name->aname;
  	if (n) {
  		if (parent) {
  			if (n->type == AUDIT_TYPE_PARENT ||
  			    n->type == AUDIT_TYPE_UNKNOWN)
  				goto out;
  		} else {
  			if (n->type != AUDIT_TYPE_PARENT)
  				goto out;
  		}
  	}
5195d8e21   Eric Paris   audit: dynamicall...
1962
  	list_for_each_entry_reverse(n, &context->names_list, list) {
57c59f583   Paul Moore   audit: fix filena...
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
  		if (n->ino) {
  			/* valid inode number, use that for the comparison */
  			if (n->ino != inode->i_ino ||
  			    n->dev != inode->i_sb->s_dev)
  				continue;
  		} else if (n->name) {
  			/* inode number has not been set, check the name */
  			if (strcmp(n->name->name, name->name))
  				continue;
  		} else
  			/* no inode and no name (?!) ... this is odd ... */
bfcec7087   Jeff Layton   audit: set the na...
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
  			continue;
  
  		/* match the correct record type */
  		if (parent) {
  			if (n->type == AUDIT_TYPE_PARENT ||
  			    n->type == AUDIT_TYPE_UNKNOWN)
  				goto out;
  		} else {
  			if (n->type != AUDIT_TYPE_PARENT)
  				goto out;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1985
  	}
5195d8e21   Eric Paris   audit: dynamicall...
1986

9cec9d68a   Jeff Layton   audit: no need to...
1987
  out_alloc:
4a9284360   Paul Moore   audit: correctly ...
1988
1989
  	/* unable to find an entry with both a matching name and type */
  	n = audit_alloc_name(context, AUDIT_TYPE_UNKNOWN);
5195d8e21   Eric Paris   audit: dynamicall...
1990
1991
  	if (!n)
  		return;
fcf22d826   Paul Moore   audit: create pri...
1992
  	if (name) {
fd3522fdc   Paul Moore   audit: enable fil...
1993
  		n->name = name;
55422d0bd   Paul Moore   audit: replace ge...
1994
  		name->refcnt++;
fcf22d826   Paul Moore   audit: create pri...
1995
  	}
4a9284360   Paul Moore   audit: correctly ...
1996

5195d8e21   Eric Paris   audit: dynamicall...
1997
  out:
bfcec7087   Jeff Layton   audit: set the na...
1998
  	if (parent) {
91a27b2a7   Jeff Layton   vfs: define struc...
1999
  		n->name_len = n->name ? parent_len(n->name->name) : AUDIT_NAME_FULL;
bfcec7087   Jeff Layton   audit: set the na...
2000
  		n->type = AUDIT_TYPE_PARENT;
79f6530cb   Jeff Layton   audit: fix mq_ope...
2001
2002
  		if (flags & AUDIT_INODE_HIDDEN)
  			n->hidden = true;
bfcec7087   Jeff Layton   audit: set the na...
2003
2004
2005
2006
  	} else {
  		n->name_len = AUDIT_NAME_FULL;
  		n->type = AUDIT_TYPE_NORMAL;
  	}
74c3cbe33   Al Viro   [PATCH] audit: wa...
2007
  	handle_path(dentry);
57d465771   Richard Guy Briggs   audit: ignore fca...
2008
  	audit_copy_inode(n, dentry, inode, flags & AUDIT_INODE_NOEVAL);
73241ccca   Amy Griffis   [PATCH] Collect m...
2009
  }
9f45f5bf3   Al Viro   new helper: audit...
2010
2011
2012
2013
  void __audit_file(const struct file *file)
  {
  	__audit_inode(NULL, file->f_path.dentry, 0);
  }
73241ccca   Amy Griffis   [PATCH] Collect m...
2014
  /**
c43a25abb   Jeff Layton   audit: reverse ar...
2015
   * __audit_inode_child - collect inode info for created/removed objects
73d3ec5ab   Amy Griffis   [PATCH] fix misse...
2016
   * @parent: inode of dentry parent
c43a25abb   Jeff Layton   audit: reverse ar...
2017
   * @dentry: dentry being audited
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2018
   * @type:   AUDIT_TYPE_* value that we're looking for
73241ccca   Amy Griffis   [PATCH] Collect m...
2019
2020
2021
2022
2023
2024
2025
2026
2027
   *
   * For syscalls that create or remove filesystem objects, audit_inode
   * can only collect information for the filesystem object's parent.
   * This call updates the audit context with the child's information.
   * Syscalls that create a new filesystem object must be hooked after
   * the object is created.  Syscalls that remove a filesystem object
   * must be hooked prior, in order to capture the target inode during
   * unsuccessful attempts.
   */
d6335d77a   Andreas Gruenbacher   security: Make in...
2028
  void __audit_inode_child(struct inode *parent,
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2029
2030
  			 const struct dentry *dentry,
  			 const unsigned char type)
73241ccca   Amy Griffis   [PATCH] Collect m...
2031
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2032
  	struct audit_context *context = audit_context();
d6335d77a   Andreas Gruenbacher   security: Make in...
2033
  	struct inode *inode = d_backing_inode(dentry);
795d673af   Al Viro   audit_compare_dna...
2034
  	const struct qstr *dname = &dentry->d_name;
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2035
  	struct audit_names *n, *found_parent = NULL, *found_child = NULL;
42d5e3765   Richard Guy Briggs   audit: filter PAT...
2036
2037
2038
  	struct audit_entry *e;
  	struct list_head *list = &audit_filter_list[AUDIT_FILTER_FS];
  	int i;
73241ccca   Amy Griffis   [PATCH] Collect m...
2039
2040
2041
  
  	if (!context->in_syscall)
  		return;
42d5e3765   Richard Guy Briggs   audit: filter PAT...
2042
  	rcu_read_lock();
699c1868a   Richard Guy Briggs   audit: purge unne...
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
  	list_for_each_entry_rcu(e, list, list) {
  		for (i = 0; i < e->rule.field_count; i++) {
  			struct audit_field *f = &e->rule.fields[i];
  
  			if (f->type == AUDIT_FSTYPE
  			    && audit_comparator(parent->i_sb->s_magic,
  						f->op, f->val)
  			    && e->rule.action == AUDIT_NEVER) {
  				rcu_read_unlock();
  				return;
42d5e3765   Richard Guy Briggs   audit: filter PAT...
2053
2054
2055
2056
  			}
  		}
  	}
  	rcu_read_unlock();
74c3cbe33   Al Viro   [PATCH] audit: wa...
2057
2058
  	if (inode)
  		handle_one(inode);
73241ccca   Amy Griffis   [PATCH] Collect m...
2059

4fa6b5ecb   Jeff Layton   audit: overhaul _...
2060
  	/* look for a parent entry first */
5195d8e21   Eric Paris   audit: dynamicall...
2061
  	list_for_each_entry(n, &context->names_list, list) {
57c59f583   Paul Moore   audit: fix filena...
2062
2063
2064
  		if (!n->name ||
  		    (n->type != AUDIT_TYPE_PARENT &&
  		     n->type != AUDIT_TYPE_UNKNOWN))
5712e88f2   Amy Griffis   [PATCH] match aud...
2065
  			continue;
57c59f583   Paul Moore   audit: fix filena...
2066
2067
2068
2069
2070
  		if (n->ino == parent->i_ino && n->dev == parent->i_sb->s_dev &&
  		    !audit_compare_dname_path(dname,
  					      n->name->name, n->name_len)) {
  			if (n->type == AUDIT_TYPE_UNKNOWN)
  				n->type = AUDIT_TYPE_PARENT;
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2071
2072
  			found_parent = n;
  			break;
f368c07d7   Amy Griffis   [PATCH] audit: pa...
2073
  		}
5712e88f2   Amy Griffis   [PATCH] match aud...
2074
  	}
73241ccca   Amy Griffis   [PATCH] Collect m...
2075

4fa6b5ecb   Jeff Layton   audit: overhaul _...
2076
  	/* is there a matching child entry? */
5195d8e21   Eric Paris   audit: dynamicall...
2077
  	list_for_each_entry(n, &context->names_list, list) {
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2078
  		/* can only match entries that have a name */
57c59f583   Paul Moore   audit: fix filena...
2079
2080
  		if (!n->name ||
  		    (n->type != type && n->type != AUDIT_TYPE_UNKNOWN))
5712e88f2   Amy Griffis   [PATCH] match aud...
2081
  			continue;
795d673af   Al Viro   audit_compare_dna...
2082
  		if (!strcmp(dname->name, n->name->name) ||
91a27b2a7   Jeff Layton   vfs: define struc...
2083
  		    !audit_compare_dname_path(dname, n->name->name,
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2084
2085
  						found_parent ?
  						found_parent->name_len :
e3d6b07b8   Jeff Layton   audit: optimize a...
2086
  						AUDIT_NAME_FULL)) {
57c59f583   Paul Moore   audit: fix filena...
2087
2088
  			if (n->type == AUDIT_TYPE_UNKNOWN)
  				n->type = type;
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2089
2090
  			found_child = n;
  			break;
5712e88f2   Amy Griffis   [PATCH] match aud...
2091
  		}
ac9910ce0   Steve Grubb   [PATCH] name_coun...
2092
  	}
5712e88f2   Amy Griffis   [PATCH] match aud...
2093

5712e88f2   Amy Griffis   [PATCH] match aud...
2094
  	if (!found_parent) {
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2095
2096
  		/* create a new, "anonymous" parent record */
  		n = audit_alloc_name(context, AUDIT_TYPE_PARENT);
5195d8e21   Eric Paris   audit: dynamicall...
2097
  		if (!n)
ac9910ce0   Steve Grubb   [PATCH] name_coun...
2098
  			return;
57d465771   Richard Guy Briggs   audit: ignore fca...
2099
  		audit_copy_inode(n, NULL, parent, 0);
73d3ec5ab   Amy Griffis   [PATCH] fix misse...
2100
  	}
5712e88f2   Amy Griffis   [PATCH] match aud...
2101
2102
  
  	if (!found_child) {
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2103
2104
  		found_child = audit_alloc_name(context, type);
  		if (!found_child)
5712e88f2   Amy Griffis   [PATCH] match aud...
2105
  			return;
5712e88f2   Amy Griffis   [PATCH] match aud...
2106
2107
2108
2109
2110
  
  		/* Re-use the name belonging to the slot for a matching parent
  		 * directory. All names for this context are relinquished in
  		 * audit_free_names() */
  		if (found_parent) {
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2111
2112
  			found_child->name = found_parent->name;
  			found_child->name_len = AUDIT_NAME_FULL;
55422d0bd   Paul Moore   audit: replace ge...
2113
  			found_child->name->refcnt++;
5712e88f2   Amy Griffis   [PATCH] match aud...
2114
  		}
5712e88f2   Amy Griffis   [PATCH] match aud...
2115
  	}
57c59f583   Paul Moore   audit: fix filena...
2116

4fa6b5ecb   Jeff Layton   audit: overhaul _...
2117
  	if (inode)
57d465771   Richard Guy Briggs   audit: ignore fca...
2118
  		audit_copy_inode(found_child, dentry, inode, 0);
4fa6b5ecb   Jeff Layton   audit: overhaul _...
2119
  	else
84cb777e6   Richard Guy Briggs   audit: use macros...
2120
  		found_child->ino = AUDIT_INO_UNSET;
3e2efce06   Amy Griffis   [PATCH] fix fault...
2121
  }
50e437d52   Trond Myklebust   SUNRPC: Convert r...
2122
  EXPORT_SYMBOL_GPL(__audit_inode_child);
3e2efce06   Amy Griffis   [PATCH] fix fault...
2123
2124
  
  /**
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2125
2126
   * auditsc_get_stamp - get local copies of audit_context values
   * @ctx: audit_context for the task
2115bb250   Deepa Dinamani   audit: Use timesp...
2127
   * @t: timespec64 to store time recorded in the audit_context
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2128
2129
2130
2131
   * @serial: serial value that is recorded in the audit_context
   *
   * Also sets the context as auditable.
   */
48887e63d   Al Viro   [PATCH] fix broke...
2132
  int auditsc_get_stamp(struct audit_context *ctx,
2115bb250   Deepa Dinamani   audit: Use timesp...
2133
  		       struct timespec64 *t, unsigned int *serial)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2134
  {
48887e63d   Al Viro   [PATCH] fix broke...
2135
2136
  	if (!ctx->in_syscall)
  		return 0;
ce625a801   David Woodhouse   AUDIT: Reduce con...
2137
2138
  	if (!ctx->serial)
  		ctx->serial = audit_serial();
bfb4496e7   David Woodhouse   AUDIT: Assign ser...
2139
2140
2141
  	t->tv_sec  = ctx->ctime.tv_sec;
  	t->tv_nsec = ctx->ctime.tv_nsec;
  	*serial    = ctx->serial;
0590b9335   Al Viro   fixing audit rule...
2142
2143
2144
2145
  	if (!ctx->prio) {
  		ctx->prio = 1;
  		ctx->current_state = AUDIT_RECORD_CONTEXT;
  	}
48887e63d   Al Viro   [PATCH] fix broke...
2146
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2147
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2148
  /**
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2149
2150
2151
   * __audit_mq_open - record audit data for a POSIX MQ open
   * @oflag: open flag
   * @mode: mode bits
6b9625599   Randy Dunlap   auditsc: fix kern...
2152
   * @attr: queue attributes
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2153
   *
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2154
   */
df0a42837   Al Viro   switch mq_open() ...
2155
  void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2156
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2157
  	struct audit_context *context = audit_context();
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2158

564f6993f   Al Viro   sanitize audit_mq...
2159
2160
2161
2162
  	if (attr)
  		memcpy(&context->mq_open.attr, attr, sizeof(struct mq_attr));
  	else
  		memset(&context->mq_open.attr, 0, sizeof(struct mq_attr));
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2163

564f6993f   Al Viro   sanitize audit_mq...
2164
2165
  	context->mq_open.oflag = oflag;
  	context->mq_open.mode = mode;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2166

564f6993f   Al Viro   sanitize audit_mq...
2167
  	context->type = AUDIT_MQ_OPEN;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2168
2169
2170
  }
  
  /**
c32c8af43   Al Viro   sanitize AUDIT_MQ...
2171
   * __audit_mq_sendrecv - record audit data for a POSIX MQ timed send/receive
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2172
2173
2174
   * @mqdes: MQ descriptor
   * @msg_len: Message length
   * @msg_prio: Message priority
c32c8af43   Al Viro   sanitize AUDIT_MQ...
2175
   * @abs_timeout: Message timeout in absolute time
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2176
   *
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2177
   */
c32c8af43   Al Viro   sanitize AUDIT_MQ...
2178
  void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio,
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
2179
  			const struct timespec64 *abs_timeout)
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2180
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2181
  	struct audit_context *context = audit_context();
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
2182
  	struct timespec64 *p = &context->mq_sendrecv.abs_timeout;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2183

c32c8af43   Al Viro   sanitize AUDIT_MQ...
2184
  	if (abs_timeout)
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
2185
  		memcpy(p, abs_timeout, sizeof(*p));
c32c8af43   Al Viro   sanitize AUDIT_MQ...
2186
  	else
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
2187
  		memset(p, 0, sizeof(*p));
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2188

c32c8af43   Al Viro   sanitize AUDIT_MQ...
2189
2190
2191
  	context->mq_sendrecv.mqdes = mqdes;
  	context->mq_sendrecv.msg_len = msg_len;
  	context->mq_sendrecv.msg_prio = msg_prio;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2192

c32c8af43   Al Viro   sanitize AUDIT_MQ...
2193
  	context->type = AUDIT_MQ_SENDRECV;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2194
2195
2196
2197
2198
  }
  
  /**
   * __audit_mq_notify - record audit data for a POSIX MQ notify
   * @mqdes: MQ descriptor
6b9625599   Randy Dunlap   auditsc: fix kern...
2199
   * @notification: Notification event
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2200
   *
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2201
   */
20114f71b   Al Viro   sanitize audit_mq...
2202
  void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification)
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2203
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2204
  	struct audit_context *context = audit_context();
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2205

20114f71b   Al Viro   sanitize audit_mq...
2206
2207
2208
2209
  	if (notification)
  		context->mq_notify.sigev_signo = notification->sigev_signo;
  	else
  		context->mq_notify.sigev_signo = 0;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2210

20114f71b   Al Viro   sanitize audit_mq...
2211
2212
  	context->mq_notify.mqdes = mqdes;
  	context->type = AUDIT_MQ_NOTIFY;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2213
2214
2215
2216
2217
2218
2219
  }
  
  /**
   * __audit_mq_getsetattr - record audit data for a POSIX MQ get/set attribute
   * @mqdes: MQ descriptor
   * @mqstat: MQ flags
   *
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2220
   */
7392906ea   Al Viro   sanitize audit_mq...
2221
  void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2222
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2223
  	struct audit_context *context = audit_context();
7392906ea   Al Viro   sanitize audit_mq...
2224
2225
2226
  	context->mq_getsetattr.mqdes = mqdes;
  	context->mq_getsetattr.mqstat = *mqstat;
  	context->type = AUDIT_MQ_GETSETATTR;
20ca73bc7   George C. Wilson   [PATCH] Audit of ...
2227
2228
2229
  }
  
  /**
196a50855   Geliang Tang   audit: update the...
2230
   * __audit_ipc_obj - record audit data for ipc object
073115d6b   Steve Grubb   [PATCH] Rework of...
2231
2232
   * @ipcp: ipc permissions
   *
073115d6b   Steve Grubb   [PATCH] Rework of...
2233
   */
a33e67510   Al Viro   sanitize audit_ip...
2234
  void __audit_ipc_obj(struct kern_ipc_perm *ipcp)
073115d6b   Steve Grubb   [PATCH] Rework of...
2235
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2236
  	struct audit_context *context = audit_context();
a33e67510   Al Viro   sanitize audit_ip...
2237
2238
2239
  	context->ipc.uid = ipcp->uid;
  	context->ipc.gid = ipcp->gid;
  	context->ipc.mode = ipcp->mode;
e816f370c   Al Viro   sanitize audit_ip...
2240
  	context->ipc.has_perm = 0;
a33e67510   Al Viro   sanitize audit_ip...
2241
2242
  	security_ipc_getsecid(ipcp, &context->ipc.osid);
  	context->type = AUDIT_IPC;
073115d6b   Steve Grubb   [PATCH] Rework of...
2243
2244
2245
  }
  
  /**
196a50855   Geliang Tang   audit: update the...
2246
   * __audit_ipc_set_perm - record audit data for new ipc permissions
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2247
2248
2249
2250
2251
   * @qbytes: msgq bytes
   * @uid: msgq user id
   * @gid: msgq group id
   * @mode: msgq mode (permissions)
   *
e816f370c   Al Viro   sanitize audit_ip...
2252
   * Called only after audit_ipc_obj().
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2253
   */
2570ebbd1   Al Viro   switch kern_ipc_p...
2254
  void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2255
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2256
  	struct audit_context *context = audit_context();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257

e816f370c   Al Viro   sanitize audit_ip...
2258
2259
2260
2261
2262
  	context->ipc.qbytes = qbytes;
  	context->ipc.perm_uid = uid;
  	context->ipc.perm_gid = gid;
  	context->ipc.perm_mode = mode;
  	context->ipc.has_perm = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2263
  }
c2f0c7c35   Steve Grubb   The attached patc...
2264

d9cfea91e   Richard Guy Briggs   audit: move audit...
2265
  void __audit_bprm(struct linux_binprm *bprm)
473ae30bc   Al Viro   [PATCH] execve ar...
2266
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2267
  	struct audit_context *context = audit_context();
473ae30bc   Al Viro   [PATCH] execve ar...
2268

d9cfea91e   Richard Guy Briggs   audit: move audit...
2269
2270
  	context->type = AUDIT_EXECVE;
  	context->execve.argc = bprm->argc;
473ae30bc   Al Viro   [PATCH] execve ar...
2271
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2272
  /**
196a50855   Geliang Tang   audit: update the...
2273
   * __audit_socketcall - record audit data for sys_socketcall
2950fa9d3   Chen Gang   kernel: audit: be...
2274
   * @nargs: number of args, which should not be more than AUDITSC_ARGS.
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2275
2276
   * @args: args array
   *
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2277
   */
2950fa9d3   Chen Gang   kernel: audit: be...
2278
  int __audit_socketcall(int nargs, unsigned long *args)
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2279
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2280
  	struct audit_context *context = audit_context();
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2281

2950fa9d3   Chen Gang   kernel: audit: be...
2282
2283
  	if (nargs <= 0 || nargs > AUDITSC_ARGS || !args)
  		return -EINVAL;
f3298dc4f   Al Viro   sanitize audit_so...
2284
2285
2286
  	context->type = AUDIT_SOCKETCALL;
  	context->socketcall.nargs = nargs;
  	memcpy(context->socketcall.args, args, nargs * sizeof(unsigned long));
2950fa9d3   Chen Gang   kernel: audit: be...
2287
  	return 0;
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2288
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2289
  /**
db3495099   Al Viro   [PATCH] AUDIT_FD_...
2290
2291
2292
2293
   * __audit_fd_pair - record audit data for pipe and socketpair
   * @fd1: the first file descriptor
   * @fd2: the second file descriptor
   *
db3495099   Al Viro   [PATCH] AUDIT_FD_...
2294
   */
157cf649a   Al Viro   sanitize audit_fd...
2295
  void __audit_fd_pair(int fd1, int fd2)
db3495099   Al Viro   [PATCH] AUDIT_FD_...
2296
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2297
  	struct audit_context *context = audit_context();
157cf649a   Al Viro   sanitize audit_fd...
2298
2299
  	context->fds[0] = fd1;
  	context->fds[1] = fd2;
db3495099   Al Viro   [PATCH] AUDIT_FD_...
2300
2301
2302
  }
  
  /**
196a50855   Geliang Tang   audit: update the...
2303
   * __audit_sockaddr - record audit data for sys_bind, sys_connect, sys_sendto
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2304
2305
2306
2307
2308
   * @len: data length in user space
   * @a: data address in kernel space
   *
   * Returns 0 for success or NULL context or < 0 on error.
   */
07c494178   Eric Paris   audit: inline che...
2309
  int __audit_sockaddr(int len, void *a)
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2310
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2311
  	struct audit_context *context = audit_context();
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2312

4f6b434fe   Al Viro   don't reallocate ...
2313
2314
2315
2316
2317
2318
  	if (!context->sockaddr) {
  		void *p = kmalloc(sizeof(struct sockaddr_storage), GFP_KERNEL);
  		if (!p)
  			return -ENOMEM;
  		context->sockaddr = p;
  	}
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2319

4f6b434fe   Al Viro   don't reallocate ...
2320
2321
  	context->sockaddr_len = len;
  	memcpy(context->sockaddr, a, len);
3ec3b2fba   David Woodhouse   AUDIT: Capture sy...
2322
2323
  	return 0;
  }
a5cb013da   Al Viro   [PATCH] auditing ...
2324
2325
  void __audit_ptrace(struct task_struct *t)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2326
  	struct audit_context *context = audit_context();
a5cb013da   Al Viro   [PATCH] auditing ...
2327

fa2bea2f5   Paul Moore   audit: consistent...
2328
  	context->target_pid = task_tgid_nr(t);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2329
  	context->target_auid = audit_get_loginuid(t);
c69e8d9c0   David Howells   CRED: Use RCU to ...
2330
  	context->target_uid = task_uid(t);
4746ec5b0   Eric Paris   [AUDIT] add sessi...
2331
  	context->target_sessionid = audit_get_sessionid(t);
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
2332
  	security_task_getsecid(t, &context->target_sid);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2333
  	memcpy(context->target_comm, t->comm, TASK_COMM_LEN);
a5cb013da   Al Viro   [PATCH] auditing ...
2334
  }
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2335
  /**
b48345aaf   Richard Guy Briggs   audit: deliver si...
2336
   * audit_signal_info_syscall - record signal info for syscalls
b0dd25a82   Randy Dunlap   [PATCH] AUDIT: ke...
2337
2338
2339
2340
2341
   * @t: task being signaled
   *
   * If the audit subsystem is being terminated, record the task (pid)
   * and uid that is doing that.
   */
b48345aaf   Richard Guy Briggs   audit: deliver si...
2342
  int audit_signal_info_syscall(struct task_struct *t)
c2f0c7c35   Steve Grubb   The attached patc...
2343
  {
e54dc2431   Amy Griffis   [PATCH] audit sig...
2344
  	struct audit_aux_data_pids *axp;
cdfb6b341   Richard Guy Briggs   audit: use inline...
2345
  	struct audit_context *ctx = audit_context();
b48345aaf   Richard Guy Briggs   audit: deliver si...
2346
  	kuid_t t_uid = task_uid(t);
e54dc2431   Amy Griffis   [PATCH] audit sig...
2347

ab6434a13   Paul Moore   audit: move audit...
2348
2349
  	if (!audit_signals || audit_dummy_context())
  		return 0;
e54dc2431   Amy Griffis   [PATCH] audit sig...
2350
2351
2352
  	/* optimize the common case by putting first signal recipient directly
  	 * in audit_context */
  	if (!ctx->target_pid) {
f1dc4867f   Richard Guy Briggs   audit: anchor all...
2353
  		ctx->target_pid = task_tgid_nr(t);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2354
  		ctx->target_auid = audit_get_loginuid(t);
c69e8d9c0   David Howells   CRED: Use RCU to ...
2355
  		ctx->target_uid = t_uid;
4746ec5b0   Eric Paris   [AUDIT] add sessi...
2356
  		ctx->target_sessionid = audit_get_sessionid(t);
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
2357
  		security_task_getsecid(t, &ctx->target_sid);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2358
  		memcpy(ctx->target_comm, t->comm, TASK_COMM_LEN);
e54dc2431   Amy Griffis   [PATCH] audit sig...
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
  		return 0;
  	}
  
  	axp = (void *)ctx->aux_pids;
  	if (!axp || axp->pid_count == AUDIT_AUX_PIDS) {
  		axp = kzalloc(sizeof(*axp), GFP_ATOMIC);
  		if (!axp)
  			return -ENOMEM;
  
  		axp->d.type = AUDIT_OBJ_PID;
  		axp->d.next = ctx->aux_pids;
  		ctx->aux_pids = (void *)axp;
  	}
88ae704c2   Adrian Bunk   kernel/auditsc.c:...
2372
  	BUG_ON(axp->pid_count >= AUDIT_AUX_PIDS);
e54dc2431   Amy Griffis   [PATCH] audit sig...
2373

f1dc4867f   Richard Guy Briggs   audit: anchor all...
2374
  	axp->target_pid[axp->pid_count] = task_tgid_nr(t);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2375
  	axp->target_auid[axp->pid_count] = audit_get_loginuid(t);
c69e8d9c0   David Howells   CRED: Use RCU to ...
2376
  	axp->target_uid[axp->pid_count] = t_uid;
4746ec5b0   Eric Paris   [AUDIT] add sessi...
2377
  	axp->target_sessionid[axp->pid_count] = audit_get_sessionid(t);
2a862b32f   Ahmed S. Darwish   Audit: use new LS...
2378
  	security_task_getsecid(t, &axp->target_sid[axp->pid_count]);
c2a7780ef   Eric Paris   [AUDIT] collect u...
2379
  	memcpy(axp->target_comm[axp->pid_count], t->comm, TASK_COMM_LEN);
e54dc2431   Amy Griffis   [PATCH] audit sig...
2380
2381
2382
  	axp->pid_count++;
  
  	return 0;
c2f0c7c35   Steve Grubb   The attached patc...
2383
  }
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2384
2385
  
  /**
3fc689e96   Eric Paris   Any time fcaps or...
2386
   * __audit_log_bprm_fcaps - store information about a loading bprm and relevant fcaps
d84f4f992   David Howells   CRED: Inaugurate ...
2387
2388
2389
   * @bprm: pointer to the bprm being processed
   * @new: the proposed new credentials
   * @old: the old credentials
3fc689e96   Eric Paris   Any time fcaps or...
2390
2391
2392
2393
   *
   * Simply check if the proc already has the caps given by the file and if not
   * store the priv escalation info for later auditing at the end of the syscall
   *
3fc689e96   Eric Paris   Any time fcaps or...
2394
2395
   * -Eric
   */
d84f4f992   David Howells   CRED: Inaugurate ...
2396
2397
  int __audit_log_bprm_fcaps(struct linux_binprm *bprm,
  			   const struct cred *new, const struct cred *old)
3fc689e96   Eric Paris   Any time fcaps or...
2398
2399
  {
  	struct audit_aux_data_bprm_fcaps *ax;
cdfb6b341   Richard Guy Briggs   audit: use inline...
2400
  	struct audit_context *context = audit_context();
3fc689e96   Eric Paris   Any time fcaps or...
2401
  	struct cpu_vfs_cap_data vcaps;
3fc689e96   Eric Paris   Any time fcaps or...
2402
2403
2404
  
  	ax = kmalloc(sizeof(*ax), GFP_KERNEL);
  	if (!ax)
d84f4f992   David Howells   CRED: Inaugurate ...
2405
  		return -ENOMEM;
3fc689e96   Eric Paris   Any time fcaps or...
2406
2407
2408
2409
  
  	ax->d.type = AUDIT_BPRM_FCAPS;
  	ax->d.next = context->aux;
  	context->aux = (void *)ax;
f4a4a8b12   Al Viro   file->f_path.dent...
2410
  	get_vfs_caps_from_disk(bprm->file->f_path.dentry, &vcaps);
3fc689e96   Eric Paris   Any time fcaps or...
2411
2412
2413
2414
  
  	ax->fcap.permitted = vcaps.permitted;
  	ax->fcap.inheritable = vcaps.inheritable;
  	ax->fcap.fE = !!(vcaps.magic_etc & VFS_CAP_FLAGS_EFFECTIVE);
2fec30e24   Richard Guy Briggs   audit: add suppor...
2415
  	ax->fcap.rootid = vcaps.rootid;
3fc689e96   Eric Paris   Any time fcaps or...
2416
  	ax->fcap_ver = (vcaps.magic_etc & VFS_CAP_REVISION_MASK) >> VFS_CAP_REVISION_SHIFT;
d84f4f992   David Howells   CRED: Inaugurate ...
2417
2418
2419
  	ax->old_pcap.permitted   = old->cap_permitted;
  	ax->old_pcap.inheritable = old->cap_inheritable;
  	ax->old_pcap.effective   = old->cap_effective;
7786f6b6d   Richard Guy Briggs   audit: add ambien...
2420
  	ax->old_pcap.ambient     = old->cap_ambient;
3fc689e96   Eric Paris   Any time fcaps or...
2421

d84f4f992   David Howells   CRED: Inaugurate ...
2422
2423
2424
  	ax->new_pcap.permitted   = new->cap_permitted;
  	ax->new_pcap.inheritable = new->cap_inheritable;
  	ax->new_pcap.effective   = new->cap_effective;
7786f6b6d   Richard Guy Briggs   audit: add ambien...
2425
  	ax->new_pcap.ambient     = new->cap_ambient;
d84f4f992   David Howells   CRED: Inaugurate ...
2426
  	return 0;
3fc689e96   Eric Paris   Any time fcaps or...
2427
2428
2429
  }
  
  /**
e68b75a02   Eric Paris   When the capset s...
2430
   * __audit_log_capset - store information about the arguments to the capset syscall
d84f4f992   David Howells   CRED: Inaugurate ...
2431
2432
   * @new: the new credentials
   * @old: the old (current) credentials
e68b75a02   Eric Paris   When the capset s...
2433
   *
da3dae54e   Masanari Iida   Documentation: Do...
2434
   * Record the arguments userspace sent to sys_capset for later printing by the
e68b75a02   Eric Paris   When the capset s...
2435
2436
   * audit system if applicable
   */
ca24a23eb   Eric W. Biederman   audit: Simplify a...
2437
  void __audit_log_capset(const struct cred *new, const struct cred *old)
e68b75a02   Eric Paris   When the capset s...
2438
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2439
  	struct audit_context *context = audit_context();
fa2bea2f5   Paul Moore   audit: consistent...
2440
  	context->capset.pid = task_tgid_nr(current);
57f71a0af   Al Viro   sanitize audit_lo...
2441
2442
2443
  	context->capset.cap.effective   = new->cap_effective;
  	context->capset.cap.inheritable = new->cap_effective;
  	context->capset.cap.permitted   = new->cap_permitted;
7786f6b6d   Richard Guy Briggs   audit: add ambien...
2444
  	context->capset.cap.ambient     = new->cap_ambient;
57f71a0af   Al Viro   sanitize audit_lo...
2445
  	context->type = AUDIT_CAPSET;
e68b75a02   Eric Paris   When the capset s...
2446
  }
120a795da   Al Viro   audit mmap
2447
2448
  void __audit_mmap_fd(int fd, int flags)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2449
  	struct audit_context *context = audit_context();
120a795da   Al Viro   audit mmap
2450
2451
2452
2453
  	context->mmap.fd = fd;
  	context->mmap.flags = flags;
  	context->type = AUDIT_MMAP;
  }
ca86cad73   Richard Guy Briggs   audit: log module...
2454
2455
  void __audit_log_kern_module(char *name)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2456
  	struct audit_context *context = audit_context();
ca86cad73   Richard Guy Briggs   audit: log module...
2457

b305f7ed0   Yi Wang   audit: fix potent...
2458
2459
2460
  	context->module.name = kstrdup(name, GFP_KERNEL);
  	if (!context->module.name)
  		audit_log_lost("out of memory in __audit_log_kern_module");
ca86cad73   Richard Guy Briggs   audit: log module...
2461
2462
  	context->type = AUDIT_KERN_MODULE;
  }
de8cd83e9   Steve Grubb   audit: Record fan...
2463
2464
  void __audit_fanotify(unsigned int response)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2465
  	audit_log(audit_context(), GFP_KERNEL,
de8cd83e9   Steve Grubb   audit: Record fan...
2466
2467
  		AUDIT_FANOTIFY,	"resp=%u", response);
  }
2d87a0674   Ondrej Mosnacek   timekeeping: Audi...
2468
2469
2470
2471
2472
2473
  void __audit_tk_injoffset(struct timespec64 offset)
  {
  	audit_log(audit_context(), GFP_KERNEL, AUDIT_TIME_INJOFFSET,
  		  "sec=%lli nsec=%li",
  		  (long long)offset.tv_sec, offset.tv_nsec);
  }
7e8eda734   Ondrej Mosnacek   ntp: Audit NTP pa...
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
  static void audit_log_ntp_val(const struct audit_ntp_data *ad,
  			      const char *op, enum audit_ntp_type type)
  {
  	const struct audit_ntp_val *val = &ad->vals[type];
  
  	if (val->newval == val->oldval)
  		return;
  
  	audit_log(audit_context(), GFP_KERNEL, AUDIT_TIME_ADJNTPVAL,
  		  "op=%s old=%lli new=%lli", op, val->oldval, val->newval);
  }
  
  void __audit_ntp_log(const struct audit_ntp_data *ad)
  {
  	audit_log_ntp_val(ad, "offset",	AUDIT_NTP_OFFSET);
  	audit_log_ntp_val(ad, "freq",	AUDIT_NTP_FREQ);
  	audit_log_ntp_val(ad, "status",	AUDIT_NTP_STATUS);
  	audit_log_ntp_val(ad, "tai",	AUDIT_NTP_TAI);
  	audit_log_ntp_val(ad, "tick",	AUDIT_NTP_TICK);
  	audit_log_ntp_val(ad, "adjust",	AUDIT_NTP_ADJUST);
  }
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
2495
  void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries,
142240398   Richard Guy Briggs   audit: add gfp pa...
2496
  		       enum audit_nfcfgop op, gfp_t gfp)
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
2497
2498
  {
  	struct audit_buffer *ab;
9d44a121c   Richard Guy Briggs   audit: add subj c...
2499
  	char comm[sizeof(current->comm)];
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
2500

142240398   Richard Guy Briggs   audit: add gfp pa...
2501
  	ab = audit_log_start(audit_context(), gfp, AUDIT_NETFILTER_CFG);
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
2502
2503
2504
2505
  	if (!ab)
  		return;
  	audit_log_format(ab, "table=%s family=%u entries=%u op=%s",
  			 name, af, nentries, audit_nfcfgs[op].s);
9d44a121c   Richard Guy Briggs   audit: add subj c...
2506
2507
2508
2509
2510
  
  	audit_log_format(ab, " pid=%u", task_pid_nr(current));
  	audit_log_task_context(ab); /* subj= */
  	audit_log_format(ab, " comm=");
  	audit_log_untrustedstring(ab, get_task_comm(comm, current));
c4dad0aab   Richard Guy Briggs   audit: tidy and e...
2511
2512
2513
  	audit_log_end(ab);
  }
  EXPORT_SYMBOL_GPL(__audit_log_nfcfg);
7b9205bd7   Kees Cook   audit: create exp...
2514
  static void audit_log_task(struct audit_buffer *ab)
85e7bac33   Eric Paris   seccomp: audit ab...
2515
  {
cca080d9b   Eric W. Biederman   userns: Convert a...
2516
2517
  	kuid_t auid, uid;
  	kgid_t gid;
85e7bac33   Eric Paris   seccomp: audit ab...
2518
  	unsigned int sessionid;
9eab339b1   Richard Guy Briggs   audit: get comm u...
2519
  	char comm[sizeof(current->comm)];
85e7bac33   Eric Paris   seccomp: audit ab...
2520
2521
2522
2523
2524
2525
  
  	auid = audit_get_loginuid(current);
  	sessionid = audit_get_sessionid(current);
  	current_uid_gid(&uid, &gid);
  
  	audit_log_format(ab, "auid=%u uid=%u gid=%u ses=%u",
cca080d9b   Eric W. Biederman   userns: Convert a...
2526
2527
2528
2529
  			 from_kuid(&init_user_ns, auid),
  			 from_kuid(&init_user_ns, uid),
  			 from_kgid(&init_user_ns, gid),
  			 sessionid);
85e7bac33   Eric Paris   seccomp: audit ab...
2530
  	audit_log_task_context(ab);
fa2bea2f5   Paul Moore   audit: consistent...
2531
  	audit_log_format(ab, " pid=%d comm=", task_tgid_nr(current));
9eab339b1   Richard Guy Briggs   audit: get comm u...
2532
  	audit_log_untrustedstring(ab, get_task_comm(comm, current));
4766b199e   Davidlohr Bueso   audit: consolidat...
2533
  	audit_log_d_path_exe(ab, current->mm);
7b9205bd7   Kees Cook   audit: create exp...
2534
  }
e68b75a02   Eric Paris   When the capset s...
2535
  /**
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2536
   * audit_core_dumps - record information about processes that end abnormally
6d9525b52   Henrik Kretzschmar   kerneldoc fix in ...
2537
   * @signr: signal value
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2538
2539
2540
2541
2542
2543
2544
   *
   * If a process ends with a core dump, something fishy is going on and we
   * should record the event for investigation.
   */
  void audit_core_dumps(long signr)
  {
  	struct audit_buffer *ab;
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2545
2546
2547
2548
2549
2550
  
  	if (!audit_enabled)
  		return;
  
  	if (signr == SIGQUIT)	/* don't care for those */
  		return;
d87de4a87   Richard Guy Briggs   audit: tie ANOM_A...
2551
  	ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_ANOM_ABEND);
0644ec0cc   Kees Cook   audit: catch poss...
2552
2553
  	if (unlikely(!ab))
  		return;
61c0ee879   Paul Davies C   audit: drop audit...
2554
  	audit_log_task(ab);
89670affa   Steve Grubb   audit: Make AUDIT...
2555
  	audit_log_format(ab, " sig=%ld res=1", signr);
85e7bac33   Eric Paris   seccomp: audit ab...
2556
2557
  	audit_log_end(ab);
  }
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2558

326bee028   Tyler Hicks   seccomp: Don't sp...
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
  /**
   * audit_seccomp - record information about a seccomp action
   * @syscall: syscall number
   * @signr: signal value
   * @code: the seccomp action
   *
   * Record the information associated with a seccomp action. Event filtering for
   * seccomp actions that are not to be logged is done in seccomp_log().
   * Therefore, this function forces auditing independent of the audit_enabled
   * and dummy context state because seccomp actions should be logged even when
   * audit is not in use.
   */
  void audit_seccomp(unsigned long syscall, long signr, int code)
85e7bac33   Eric Paris   seccomp: audit ab...
2572
2573
  {
  	struct audit_buffer *ab;
9b8753fff   Richard Guy Briggs   audit: tie SECCOM...
2574
  	ab = audit_log_start(audit_context(), GFP_KERNEL, AUDIT_SECCOMP);
7b9205bd7   Kees Cook   audit: create exp...
2575
2576
2577
  	if (unlikely(!ab))
  		return;
  	audit_log_task(ab);
84db564aa   Richard Guy Briggs   audit: add arch f...
2578
  	audit_log_format(ab, " sig=%ld arch=%x syscall=%ld compat=%d ip=0x%lx code=0x%x",
16add4116   Dmitry V. Levin   syscall_get_arch:...
2579
  			 signr, syscall_get_arch(current), syscall,
efbc0fbf3   Andy Lutomirski   auditsc: for secc...
2580
  			 in_compat_syscall(), KSTK_EIP(current), code);
0a4ff8c25   Steve Grubb   [PATCH] Abnormal ...
2581
2582
  	audit_log_end(ab);
  }
916d75761   Al Viro   Fix rule eviction...
2583

ea6eca778   Tyler Hicks   seccomp: Audit at...
2584
2585
2586
2587
2588
2589
2590
  void audit_seccomp_actions_logged(const char *names, const char *old_names,
  				  int res)
  {
  	struct audit_buffer *ab;
  
  	if (!audit_enabled)
  		return;
8982a1fbe   Richard Guy Briggs   audit: use new au...
2591
  	ab = audit_log_start(audit_context(), GFP_KERNEL,
ea6eca778   Tyler Hicks   seccomp: Audit at...
2592
2593
2594
  			     AUDIT_CONFIG_CHANGE);
  	if (unlikely(!ab))
  		return;
d0a3f18a7   Paul Moore   audit: minimize o...
2595
2596
2597
  	audit_log_format(ab,
  			 "op=seccomp-logging actions=%s old-actions=%s res=%d",
  			 names, old_names, res);
ea6eca778   Tyler Hicks   seccomp: Audit at...
2598
2599
  	audit_log_end(ab);
  }
916d75761   Al Viro   Fix rule eviction...
2600
2601
  struct list_head *audit_killed_trees(void)
  {
cdfb6b341   Richard Guy Briggs   audit: use inline...
2602
  	struct audit_context *ctx = audit_context();
916d75761   Al Viro   Fix rule eviction...
2603
2604
2605
2606
  	if (likely(!ctx || !ctx->in_syscall))
  		return NULL;
  	return &ctx->killed_trees;
  }