Merge gregkh@master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / kernel / auditsc.c
1 /* auditsc.c -- System-call auditing support
2  * Handles all system-call specific auditing features.
3  *
4  * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
5  * Copyright 2005 Hewlett-Packard Development Company, L.P.
6  * Copyright (C) 2005, 2006 IBM Corporation
7  * All Rights Reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  *
23  * Written by Rickard E. (Rik) Faith <faith@redhat.com>
24  *
25  * Many of the ideas implemented here are from Stephen C. Tweedie,
26  * especially the idea of avoiding a copy by using getname.
27  *
28  * The method for actual interception of syscall entry and exit (not in
29  * this file -- see entry.S) is based on a GPL'd patch written by
30  * okir@suse.de and Copyright 2003 SuSE Linux AG.
31  *
32  * POSIX message queue support added by George Wilson <ltcgcw@us.ibm.com>,
33  * 2006.
34  *
35  * The support of additional filter rules compares (>, <, >=, <=) was
36  * added by Dustin Kirkland <dustin.kirkland@us.ibm.com>, 2005.
37  *
38  * Modified by Amy Griffis <amy.griffis@hp.com> to collect additional
39  * filesystem information.
40  *
41  * Subject and object context labeling support added by <danjones@us.ibm.com>
42  * and <dustin.kirkland@us.ibm.com> for LSPP certification compliance.
43  */
44
45 #include <linux/init.h>
46 #include <asm/types.h>
47 #include <asm/atomic.h>
48 #include <asm/types.h>
49 #include <linux/fs.h>
50 #include <linux/namei.h>
51 #include <linux/mm.h>
52 #include <linux/module.h>
53 #include <linux/mount.h>
54 #include <linux/socket.h>
55 #include <linux/mqueue.h>
56 #include <linux/audit.h>
57 #include <linux/personality.h>
58 #include <linux/time.h>
59 #include <linux/netlink.h>
60 #include <linux/compiler.h>
61 #include <asm/unistd.h>
62 #include <linux/security.h>
63 #include <linux/list.h>
64 #include <linux/tty.h>
65 #include <linux/selinux.h>
66 #include <linux/binfmts.h>
67 #include <linux/syscalls.h>
68
69 #include "audit.h"
70
71 extern struct list_head audit_filter_list[];
72
73 /* No syscall auditing will take place unless audit_enabled != 0. */
74 extern int audit_enabled;
75
76 /* AUDIT_NAMES is the number of slots we reserve in the audit_context
77  * for saving names from getname(). */
78 #define AUDIT_NAMES    20
79
80 /* AUDIT_NAMES_RESERVED is the number of slots we reserve in the
81  * audit_context from being used for nameless inodes from
82  * path_lookup. */
83 #define AUDIT_NAMES_RESERVED 7
84
85 /* Indicates that audit should log the full pathname. */
86 #define AUDIT_NAME_FULL -1
87
88 /* number of audit rules */
89 int audit_n_rules;
90
91 /* When fs/namei.c:getname() is called, we store the pointer in name and
92  * we don't let putname() free it (instead we free all of the saved
93  * pointers at syscall exit time).
94  *
95  * Further, in fs/namei.c:path_lookup() we store the inode and device. */
96 struct audit_names {
97         const char      *name;
98         int             name_len;       /* number of name's characters to log */
99         unsigned        name_put;       /* call __putname() for this name */
100         unsigned long   ino;
101         dev_t           dev;
102         umode_t         mode;
103         uid_t           uid;
104         gid_t           gid;
105         dev_t           rdev;
106         u32             osid;
107 };
108
109 struct audit_aux_data {
110         struct audit_aux_data   *next;
111         int                     type;
112 };
113
114 #define AUDIT_AUX_IPCPERM       0
115
116 struct audit_aux_data_mq_open {
117         struct audit_aux_data   d;
118         int                     oflag;
119         mode_t                  mode;
120         struct mq_attr          attr;
121 };
122
123 struct audit_aux_data_mq_sendrecv {
124         struct audit_aux_data   d;
125         mqd_t                   mqdes;
126         size_t                  msg_len;
127         unsigned int            msg_prio;
128         struct timespec         abs_timeout;
129 };
130
131 struct audit_aux_data_mq_notify {
132         struct audit_aux_data   d;
133         mqd_t                   mqdes;
134         struct sigevent         notification;
135 };
136
137 struct audit_aux_data_mq_getsetattr {
138         struct audit_aux_data   d;
139         mqd_t                   mqdes;
140         struct mq_attr          mqstat;
141 };
142
143 struct audit_aux_data_ipcctl {
144         struct audit_aux_data   d;
145         struct ipc_perm         p;
146         unsigned long           qbytes;
147         uid_t                   uid;
148         gid_t                   gid;
149         mode_t                  mode;
150         u32                     osid;
151 };
152
153 struct audit_aux_data_execve {
154         struct audit_aux_data   d;
155         int argc;
156         int envc;
157         char mem[0];
158 };
159
160 struct audit_aux_data_socketcall {
161         struct audit_aux_data   d;
162         int                     nargs;
163         unsigned long           args[0];
164 };
165
166 struct audit_aux_data_sockaddr {
167         struct audit_aux_data   d;
168         int                     len;
169         char                    a[0];
170 };
171
172 struct audit_aux_data_path {
173         struct audit_aux_data   d;
174         struct dentry           *dentry;
175         struct vfsmount         *mnt;
176 };
177
178 /* The per-task audit context. */
179 struct audit_context {
180         int                 dummy;      /* must be the first element */
181         int                 in_syscall; /* 1 if task is in a syscall */
182         enum audit_state    state;
183         unsigned int        serial;     /* serial number for record */
184         struct timespec     ctime;      /* time of syscall entry */
185         uid_t               loginuid;   /* login uid (identity) */
186         int                 major;      /* syscall number */
187         unsigned long       argv[4];    /* syscall arguments */
188         int                 return_valid; /* return code is valid */
189         long                return_code;/* syscall return code */
190         int                 auditable;  /* 1 if record should be written */
191         int                 name_count;
192         struct audit_names  names[AUDIT_NAMES];
193         char *              filterkey;  /* key for rule that triggered record */
194         struct dentry *     pwd;
195         struct vfsmount *   pwdmnt;
196         struct audit_context *previous; /* For nested syscalls */
197         struct audit_aux_data *aux;
198
199                                 /* Save things to print about task_struct */
200         pid_t               pid, ppid;
201         uid_t               uid, euid, suid, fsuid;
202         gid_t               gid, egid, sgid, fsgid;
203         unsigned long       personality;
204         int                 arch;
205
206 #if AUDIT_DEBUG
207         int                 put_count;
208         int                 ino_count;
209 #endif
210 };
211
212 /* Determine if any context name data matches a rule's watch data */
213 /* Compare a task_struct with an audit_rule.  Return 1 on match, 0
214  * otherwise. */
215 static int audit_filter_rules(struct task_struct *tsk,
216                               struct audit_krule *rule,
217                               struct audit_context *ctx,
218                               struct audit_names *name,
219                               enum audit_state *state)
220 {
221         int i, j, need_sid = 1;
222         u32 sid;
223
224         for (i = 0; i < rule->field_count; i++) {
225                 struct audit_field *f = &rule->fields[i];
226                 int result = 0;
227
228                 switch (f->type) {
229                 case AUDIT_PID:
230                         result = audit_comparator(tsk->pid, f->op, f->val);
231                         break;
232                 case AUDIT_PPID:
233                         if (ctx)
234                                 result = audit_comparator(ctx->ppid, f->op, f->val);
235                         break;
236                 case AUDIT_UID:
237                         result = audit_comparator(tsk->uid, f->op, f->val);
238                         break;
239                 case AUDIT_EUID:
240                         result = audit_comparator(tsk->euid, f->op, f->val);
241                         break;
242                 case AUDIT_SUID:
243                         result = audit_comparator(tsk->suid, f->op, f->val);
244                         break;
245                 case AUDIT_FSUID:
246                         result = audit_comparator(tsk->fsuid, f->op, f->val);
247                         break;
248                 case AUDIT_GID:
249                         result = audit_comparator(tsk->gid, f->op, f->val);
250                         break;
251                 case AUDIT_EGID:
252                         result = audit_comparator(tsk->egid, f->op, f->val);
253                         break;
254                 case AUDIT_SGID:
255                         result = audit_comparator(tsk->sgid, f->op, f->val);
256                         break;
257                 case AUDIT_FSGID:
258                         result = audit_comparator(tsk->fsgid, f->op, f->val);
259                         break;
260                 case AUDIT_PERS:
261                         result = audit_comparator(tsk->personality, f->op, f->val);
262                         break;
263                 case AUDIT_ARCH:
264                         if (ctx)
265                                 result = audit_comparator(ctx->arch, f->op, f->val);
266                         break;
267
268                 case AUDIT_EXIT:
269                         if (ctx && ctx->return_valid)
270                                 result = audit_comparator(ctx->return_code, f->op, f->val);
271                         break;
272                 case AUDIT_SUCCESS:
273                         if (ctx && ctx->return_valid) {
274                                 if (f->val)
275                                         result = audit_comparator(ctx->return_valid, f->op, AUDITSC_SUCCESS);
276                                 else
277                                         result = audit_comparator(ctx->return_valid, f->op, AUDITSC_FAILURE);
278                         }
279                         break;
280                 case AUDIT_DEVMAJOR:
281                         if (name)
282                                 result = audit_comparator(MAJOR(name->dev),
283                                                           f->op, f->val);
284                         else if (ctx) {
285                                 for (j = 0; j < ctx->name_count; j++) {
286                                         if (audit_comparator(MAJOR(ctx->names[j].dev),  f->op, f->val)) {
287                                                 ++result;
288                                                 break;
289                                         }
290                                 }
291                         }
292                         break;
293                 case AUDIT_DEVMINOR:
294                         if (name)
295                                 result = audit_comparator(MINOR(name->dev),
296                                                           f->op, f->val);
297                         else if (ctx) {
298                                 for (j = 0; j < ctx->name_count; j++) {
299                                         if (audit_comparator(MINOR(ctx->names[j].dev), f->op, f->val)) {
300                                                 ++result;
301                                                 break;
302                                         }
303                                 }
304                         }
305                         break;
306                 case AUDIT_INODE:
307                         if (name)
308                                 result = (name->ino == f->val);
309                         else if (ctx) {
310                                 for (j = 0; j < ctx->name_count; j++) {
311                                         if (audit_comparator(ctx->names[j].ino, f->op, f->val)) {
312                                                 ++result;
313                                                 break;
314                                         }
315                                 }
316                         }
317                         break;
318                 case AUDIT_WATCH:
319                         if (name && rule->watch->ino != (unsigned long)-1)
320                                 result = (name->dev == rule->watch->dev &&
321                                           name->ino == rule->watch->ino);
322                         break;
323                 case AUDIT_LOGINUID:
324                         result = 0;
325                         if (ctx)
326                                 result = audit_comparator(ctx->loginuid, f->op, f->val);
327                         break;
328                 case AUDIT_SUBJ_USER:
329                 case AUDIT_SUBJ_ROLE:
330                 case AUDIT_SUBJ_TYPE:
331                 case AUDIT_SUBJ_SEN:
332                 case AUDIT_SUBJ_CLR:
333                         /* NOTE: this may return negative values indicating
334                            a temporary error.  We simply treat this as a
335                            match for now to avoid losing information that
336                            may be wanted.   An error message will also be
337                            logged upon error */
338                         if (f->se_rule) {
339                                 if (need_sid) {
340                                         selinux_task_ctxid(tsk, &sid);
341                                         need_sid = 0;
342                                 }
343                                 result = selinux_audit_rule_match(sid, f->type,
344                                                                   f->op,
345                                                                   f->se_rule,
346                                                                   ctx);
347                         }
348                         break;
349                 case AUDIT_OBJ_USER:
350                 case AUDIT_OBJ_ROLE:
351                 case AUDIT_OBJ_TYPE:
352                 case AUDIT_OBJ_LEV_LOW:
353                 case AUDIT_OBJ_LEV_HIGH:
354                         /* The above note for AUDIT_SUBJ_USER...AUDIT_SUBJ_CLR
355                            also applies here */
356                         if (f->se_rule) {
357                                 /* Find files that match */
358                                 if (name) {
359                                         result = selinux_audit_rule_match(
360                                                    name->osid, f->type, f->op,
361                                                    f->se_rule, ctx);
362                                 } else if (ctx) {
363                                         for (j = 0; j < ctx->name_count; j++) {
364                                                 if (selinux_audit_rule_match(
365                                                       ctx->names[j].osid,
366                                                       f->type, f->op,
367                                                       f->se_rule, ctx)) {
368                                                         ++result;
369                                                         break;
370                                                 }
371                                         }
372                                 }
373                                 /* Find ipc objects that match */
374                                 if (ctx) {
375                                         struct audit_aux_data *aux;
376                                         for (aux = ctx->aux; aux;
377                                              aux = aux->next) {
378                                                 if (aux->type == AUDIT_IPC) {
379                                                         struct audit_aux_data_ipcctl *axi = (void *)aux;
380                                                         if (selinux_audit_rule_match(axi->osid, f->type, f->op, f->se_rule, ctx)) {
381                                                                 ++result;
382                                                                 break;
383                                                         }
384                                                 }
385                                         }
386                                 }
387                         }
388                         break;
389                 case AUDIT_ARG0:
390                 case AUDIT_ARG1:
391                 case AUDIT_ARG2:
392                 case AUDIT_ARG3:
393                         if (ctx)
394                                 result = audit_comparator(ctx->argv[f->type-AUDIT_ARG0], f->op, f->val);
395                         break;
396                 case AUDIT_FILTERKEY:
397                         /* ignore this field for filtering */
398                         result = 1;
399                         break;
400                 }
401
402                 if (!result)
403                         return 0;
404         }
405         if (rule->filterkey)
406                 ctx->filterkey = kstrdup(rule->filterkey, GFP_ATOMIC);
407         switch (rule->action) {
408         case AUDIT_NEVER:    *state = AUDIT_DISABLED;       break;
409         case AUDIT_ALWAYS:   *state = AUDIT_RECORD_CONTEXT; break;
410         }
411         return 1;
412 }
413
414 /* At process creation time, we can determine if system-call auditing is
415  * completely disabled for this task.  Since we only have the task
416  * structure at this point, we can only check uid and gid.
417  */
418 static enum audit_state audit_filter_task(struct task_struct *tsk)
419 {
420         struct audit_entry *e;
421         enum audit_state   state;
422
423         rcu_read_lock();
424         list_for_each_entry_rcu(e, &audit_filter_list[AUDIT_FILTER_TASK], list) {
425                 if (audit_filter_rules(tsk, &e->rule, NULL, NULL, &state)) {
426                         rcu_read_unlock();
427                         return state;
428                 }
429         }
430         rcu_read_unlock();
431         return AUDIT_BUILD_CONTEXT;
432 }
433
434 /* At syscall entry and exit time, this filter is called if the
435  * audit_state is not low enough that auditing cannot take place, but is
436  * also not high enough that we already know we have to write an audit
437  * record (i.e., the state is AUDIT_SETUP_CONTEXT or AUDIT_BUILD_CONTEXT).
438  */
439 static enum audit_state audit_filter_syscall(struct task_struct *tsk,
440                                              struct audit_context *ctx,
441                                              struct list_head *list)
442 {
443         struct audit_entry *e;
444         enum audit_state state;
445
446         if (audit_pid && tsk->tgid == audit_pid)
447                 return AUDIT_DISABLED;
448
449         rcu_read_lock();
450         if (!list_empty(list)) {
451                 int word = AUDIT_WORD(ctx->major);
452                 int bit  = AUDIT_BIT(ctx->major);
453
454                 list_for_each_entry_rcu(e, list, list) {
455                         if ((e->rule.mask[word] & bit) == bit &&
456                             audit_filter_rules(tsk, &e->rule, ctx, NULL,
457                                                &state)) {
458                                 rcu_read_unlock();
459                                 return state;
460                         }
461                 }
462         }
463         rcu_read_unlock();
464         return AUDIT_BUILD_CONTEXT;
465 }
466
467 /* At syscall exit time, this filter is called if any audit_names[] have been
468  * collected during syscall processing.  We only check rules in sublists at hash
469  * buckets applicable to the inode numbers in audit_names[].
470  * Regarding audit_state, same rules apply as for audit_filter_syscall().
471  */
472 enum audit_state audit_filter_inodes(struct task_struct *tsk,
473                                      struct audit_context *ctx)
474 {
475         int i;
476         struct audit_entry *e;
477         enum audit_state state;
478
479         if (audit_pid && tsk->tgid == audit_pid)
480                 return AUDIT_DISABLED;
481
482         rcu_read_lock();
483         for (i = 0; i < ctx->name_count; i++) {
484                 int word = AUDIT_WORD(ctx->major);
485                 int bit  = AUDIT_BIT(ctx->major);
486                 struct audit_names *n = &ctx->names[i];
487                 int h = audit_hash_ino((u32)n->ino);
488                 struct list_head *list = &audit_inode_hash[h];
489
490                 if (list_empty(list))
491                         continue;
492
493                 list_for_each_entry_rcu(e, list, list) {
494                         if ((e->rule.mask[word] & bit) == bit &&
495                             audit_filter_rules(tsk, &e->rule, ctx, n, &state)) {
496                                 rcu_read_unlock();
497                                 return state;
498                         }
499                 }
500         }
501         rcu_read_unlock();
502         return AUDIT_BUILD_CONTEXT;
503 }
504
505 void audit_set_auditable(struct audit_context *ctx)
506 {
507         ctx->auditable = 1;
508 }
509
510 static inline struct audit_context *audit_get_context(struct task_struct *tsk,
511                                                       int return_valid,
512                                                       int return_code)
513 {
514         struct audit_context *context = tsk->audit_context;
515
516         if (likely(!context))
517                 return NULL;
518         context->return_valid = return_valid;
519         context->return_code  = return_code;
520
521         if (context->in_syscall && !context->dummy && !context->auditable) {
522                 enum audit_state state;
523
524                 state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_EXIT]);
525                 if (state == AUDIT_RECORD_CONTEXT) {
526                         context->auditable = 1;
527                         goto get_context;
528                 }
529
530                 state = audit_filter_inodes(tsk, context);
531                 if (state == AUDIT_RECORD_CONTEXT)
532                         context->auditable = 1;
533
534         }
535
536 get_context:
537
538         tsk->audit_context = NULL;
539         return context;
540 }
541
542 static inline void audit_free_names(struct audit_context *context)
543 {
544         int i;
545
546 #if AUDIT_DEBUG == 2
547         if (context->auditable
548             ||context->put_count + context->ino_count != context->name_count) {
549                 printk(KERN_ERR "%s:%d(:%d): major=%d in_syscall=%d"
550                        " name_count=%d put_count=%d"
551                        " ino_count=%d [NOT freeing]\n",
552                        __FILE__, __LINE__,
553                        context->serial, context->major, context->in_syscall,
554                        context->name_count, context->put_count,
555                        context->ino_count);
556                 for (i = 0; i < context->name_count; i++) {
557                         printk(KERN_ERR "names[%d] = %p = %s\n", i,
558                                context->names[i].name,
559                                context->names[i].name ?: "(null)");
560                 }
561                 dump_stack();
562                 return;
563         }
564 #endif
565 #if AUDIT_DEBUG
566         context->put_count  = 0;
567         context->ino_count  = 0;
568 #endif
569
570         for (i = 0; i < context->name_count; i++) {
571                 if (context->names[i].name && context->names[i].name_put)
572                         __putname(context->names[i].name);
573         }
574         context->name_count = 0;
575         if (context->pwd)
576                 dput(context->pwd);
577         if (context->pwdmnt)
578                 mntput(context->pwdmnt);
579         context->pwd = NULL;
580         context->pwdmnt = NULL;
581 }
582
583 static inline void audit_free_aux(struct audit_context *context)
584 {
585         struct audit_aux_data *aux;
586
587         while ((aux = context->aux)) {
588                 if (aux->type == AUDIT_AVC_PATH) {
589                         struct audit_aux_data_path *axi = (void *)aux;
590                         dput(axi->dentry);
591                         mntput(axi->mnt);
592                 }
593
594                 context->aux = aux->next;
595                 kfree(aux);
596         }
597 }
598
599 static inline void audit_zero_context(struct audit_context *context,
600                                       enum audit_state state)
601 {
602         uid_t loginuid = context->loginuid;
603
604         memset(context, 0, sizeof(*context));
605         context->state      = state;
606         context->loginuid   = loginuid;
607 }
608
609 static inline struct audit_context *audit_alloc_context(enum audit_state state)
610 {
611         struct audit_context *context;
612
613         if (!(context = kmalloc(sizeof(*context), GFP_KERNEL)))
614                 return NULL;
615         audit_zero_context(context, state);
616         return context;
617 }
618
619 /**
620  * audit_alloc - allocate an audit context block for a task
621  * @tsk: task
622  *
623  * Filter on the task information and allocate a per-task audit context
624  * if necessary.  Doing so turns on system call auditing for the
625  * specified task.  This is called from copy_process, so no lock is
626  * needed.
627  */
628 int audit_alloc(struct task_struct *tsk)
629 {
630         struct audit_context *context;
631         enum audit_state     state;
632
633         if (likely(!audit_enabled))
634                 return 0; /* Return if not auditing. */
635
636         state = audit_filter_task(tsk);
637         if (likely(state == AUDIT_DISABLED))
638                 return 0;
639
640         if (!(context = audit_alloc_context(state))) {
641                 audit_log_lost("out of memory in audit_alloc");
642                 return -ENOMEM;
643         }
644
645                                 /* Preserve login uid */
646         context->loginuid = -1;
647         if (current->audit_context)
648                 context->loginuid = current->audit_context->loginuid;
649
650         tsk->audit_context  = context;
651         set_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
652         return 0;
653 }
654
655 static inline void audit_free_context(struct audit_context *context)
656 {
657         struct audit_context *previous;
658         int                  count = 0;
659
660         do {
661                 previous = context->previous;
662                 if (previous || (count &&  count < 10)) {
663                         ++count;
664                         printk(KERN_ERR "audit(:%d): major=%d name_count=%d:"
665                                " freeing multiple contexts (%d)\n",
666                                context->serial, context->major,
667                                context->name_count, count);
668                 }
669                 audit_free_names(context);
670                 audit_free_aux(context);
671                 kfree(context->filterkey);
672                 kfree(context);
673                 context  = previous;
674         } while (context);
675         if (count >= 10)
676                 printk(KERN_ERR "audit: freed %d contexts\n", count);
677 }
678
679 static void audit_log_task_context(struct audit_buffer *ab)
680 {
681         char *ctx = NULL;
682         ssize_t len = 0;
683
684         len = security_getprocattr(current, "current", NULL, 0);
685         if (len < 0) {
686                 if (len != -EINVAL)
687                         goto error_path;
688                 return;
689         }
690
691         ctx = kmalloc(len, GFP_KERNEL);
692         if (!ctx)
693                 goto error_path;
694
695         len = security_getprocattr(current, "current", ctx, len);
696         if (len < 0 )
697                 goto error_path;
698
699         audit_log_format(ab, " subj=%s", ctx);
700         return;
701
702 error_path:
703         kfree(ctx);
704         audit_panic("error in audit_log_task_context");
705         return;
706 }
707
708 static void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
709 {
710         char name[sizeof(tsk->comm)];
711         struct mm_struct *mm = tsk->mm;
712         struct vm_area_struct *vma;
713
714         /* tsk == current */
715
716         get_task_comm(name, tsk);
717         audit_log_format(ab, " comm=");
718         audit_log_untrustedstring(ab, name);
719
720         if (mm) {
721                 down_read(&mm->mmap_sem);
722                 vma = mm->mmap;
723                 while (vma) {
724                         if ((vma->vm_flags & VM_EXECUTABLE) &&
725                             vma->vm_file) {
726                                 audit_log_d_path(ab, "exe=",
727                                                  vma->vm_file->f_dentry,
728                                                  vma->vm_file->f_vfsmnt);
729                                 break;
730                         }
731                         vma = vma->vm_next;
732                 }
733                 up_read(&mm->mmap_sem);
734         }
735         audit_log_task_context(ab);
736 }
737
738 static void audit_log_exit(struct audit_context *context, struct task_struct *tsk)
739 {
740         int i, call_panic = 0;
741         struct audit_buffer *ab;
742         struct audit_aux_data *aux;
743         const char *tty;
744
745         /* tsk == current */
746         context->pid = tsk->pid;
747         context->ppid = sys_getppid();  /* sic.  tsk == current in all cases */
748         context->uid = tsk->uid;
749         context->gid = tsk->gid;
750         context->euid = tsk->euid;
751         context->suid = tsk->suid;
752         context->fsuid = tsk->fsuid;
753         context->egid = tsk->egid;
754         context->sgid = tsk->sgid;
755         context->fsgid = tsk->fsgid;
756         context->personality = tsk->personality;
757
758         ab = audit_log_start(context, GFP_KERNEL, AUDIT_SYSCALL);
759         if (!ab)
760                 return;         /* audit_panic has been called */
761         audit_log_format(ab, "arch=%x syscall=%d",
762                          context->arch, context->major);
763         if (context->personality != PER_LINUX)
764                 audit_log_format(ab, " per=%lx", context->personality);
765         if (context->return_valid)
766                 audit_log_format(ab, " success=%s exit=%ld", 
767                                  (context->return_valid==AUDITSC_SUCCESS)?"yes":"no",
768                                  context->return_code);
769         if (tsk->signal && tsk->signal->tty && tsk->signal->tty->name)
770                 tty = tsk->signal->tty->name;
771         else
772                 tty = "(none)";
773         audit_log_format(ab,
774                   " a0=%lx a1=%lx a2=%lx a3=%lx items=%d"
775                   " ppid=%d pid=%d auid=%u uid=%u gid=%u"
776                   " euid=%u suid=%u fsuid=%u"
777                   " egid=%u sgid=%u fsgid=%u tty=%s",
778                   context->argv[0],
779                   context->argv[1],
780                   context->argv[2],
781                   context->argv[3],
782                   context->name_count,
783                   context->ppid,
784                   context->pid,
785                   context->loginuid,
786                   context->uid,
787                   context->gid,
788                   context->euid, context->suid, context->fsuid,
789                   context->egid, context->sgid, context->fsgid, tty);
790         audit_log_task_info(ab, tsk);
791         if (context->filterkey) {
792                 audit_log_format(ab, " key=");
793                 audit_log_untrustedstring(ab, context->filterkey);
794         } else
795                 audit_log_format(ab, " key=(null)");
796         audit_log_end(ab);
797
798         for (aux = context->aux; aux; aux = aux->next) {
799
800                 ab = audit_log_start(context, GFP_KERNEL, aux->type);
801                 if (!ab)
802                         continue; /* audit_panic has been called */
803
804                 switch (aux->type) {
805                 case AUDIT_MQ_OPEN: {
806                         struct audit_aux_data_mq_open *axi = (void *)aux;
807                         audit_log_format(ab,
808                                 "oflag=0x%x mode=%#o mq_flags=0x%lx mq_maxmsg=%ld "
809                                 "mq_msgsize=%ld mq_curmsgs=%ld",
810                                 axi->oflag, axi->mode, axi->attr.mq_flags,
811                                 axi->attr.mq_maxmsg, axi->attr.mq_msgsize,
812                                 axi->attr.mq_curmsgs);
813                         break; }
814
815                 case AUDIT_MQ_SENDRECV: {
816                         struct audit_aux_data_mq_sendrecv *axi = (void *)aux;
817                         audit_log_format(ab,
818                                 "mqdes=%d msg_len=%zd msg_prio=%u "
819                                 "abs_timeout_sec=%ld abs_timeout_nsec=%ld",
820                                 axi->mqdes, axi->msg_len, axi->msg_prio,
821                                 axi->abs_timeout.tv_sec, axi->abs_timeout.tv_nsec);
822                         break; }
823
824                 case AUDIT_MQ_NOTIFY: {
825                         struct audit_aux_data_mq_notify *axi = (void *)aux;
826                         audit_log_format(ab,
827                                 "mqdes=%d sigev_signo=%d",
828                                 axi->mqdes,
829                                 axi->notification.sigev_signo);
830                         break; }
831
832                 case AUDIT_MQ_GETSETATTR: {
833                         struct audit_aux_data_mq_getsetattr *axi = (void *)aux;
834                         audit_log_format(ab,
835                                 "mqdes=%d mq_flags=0x%lx mq_maxmsg=%ld mq_msgsize=%ld "
836                                 "mq_curmsgs=%ld ",
837                                 axi->mqdes,
838                                 axi->mqstat.mq_flags, axi->mqstat.mq_maxmsg,
839                                 axi->mqstat.mq_msgsize, axi->mqstat.mq_curmsgs);
840                         break; }
841
842                 case AUDIT_IPC: {
843                         struct audit_aux_data_ipcctl *axi = (void *)aux;
844                         audit_log_format(ab, 
845                                  "ouid=%u ogid=%u mode=%x",
846                                  axi->uid, axi->gid, axi->mode);
847                         if (axi->osid != 0) {
848                                 char *ctx = NULL;
849                                 u32 len;
850                                 if (selinux_ctxid_to_string(
851                                                 axi->osid, &ctx, &len)) {
852                                         audit_log_format(ab, " osid=%u",
853                                                         axi->osid);
854                                         call_panic = 1;
855                                 } else
856                                         audit_log_format(ab, " obj=%s", ctx);
857                                 kfree(ctx);
858                         }
859                         break; }
860
861                 case AUDIT_IPC_SET_PERM: {
862                         struct audit_aux_data_ipcctl *axi = (void *)aux;
863                         audit_log_format(ab,
864                                 "qbytes=%lx ouid=%u ogid=%u mode=%x",
865                                 axi->qbytes, axi->uid, axi->gid, axi->mode);
866                         break; }
867
868                 case AUDIT_EXECVE: {
869                         struct audit_aux_data_execve *axi = (void *)aux;
870                         int i;
871                         const char *p;
872                         for (i = 0, p = axi->mem; i < axi->argc; i++) {
873                                 audit_log_format(ab, "a%d=", i);
874                                 p = audit_log_untrustedstring(ab, p);
875                                 audit_log_format(ab, "\n");
876                         }
877                         break; }
878
879                 case AUDIT_SOCKETCALL: {
880                         int i;
881                         struct audit_aux_data_socketcall *axs = (void *)aux;
882                         audit_log_format(ab, "nargs=%d", axs->nargs);
883                         for (i=0; i<axs->nargs; i++)
884                                 audit_log_format(ab, " a%d=%lx", i, axs->args[i]);
885                         break; }
886
887                 case AUDIT_SOCKADDR: {
888                         struct audit_aux_data_sockaddr *axs = (void *)aux;
889
890                         audit_log_format(ab, "saddr=");
891                         audit_log_hex(ab, axs->a, axs->len);
892                         break; }
893
894                 case AUDIT_AVC_PATH: {
895                         struct audit_aux_data_path *axi = (void *)aux;
896                         audit_log_d_path(ab, "path=", axi->dentry, axi->mnt);
897                         break; }
898
899                 }
900                 audit_log_end(ab);
901         }
902
903         if (context->pwd && context->pwdmnt) {
904                 ab = audit_log_start(context, GFP_KERNEL, AUDIT_CWD);
905                 if (ab) {
906                         audit_log_d_path(ab, "cwd=", context->pwd, context->pwdmnt);
907                         audit_log_end(ab);
908                 }
909         }
910         for (i = 0; i < context->name_count; i++) {
911                 struct audit_names *n = &context->names[i];
912
913                 ab = audit_log_start(context, GFP_KERNEL, AUDIT_PATH);
914                 if (!ab)
915                         continue; /* audit_panic has been called */
916
917                 audit_log_format(ab, "item=%d", i);
918
919                 if (n->name) {
920                         switch(n->name_len) {
921                         case AUDIT_NAME_FULL:
922                                 /* log the full path */
923                                 audit_log_format(ab, " name=");
924                                 audit_log_untrustedstring(ab, n->name);
925                                 break;
926                         case 0:
927                                 /* name was specified as a relative path and the
928                                  * directory component is the cwd */
929                                 audit_log_d_path(ab, " name=", context->pwd,
930                                                  context->pwdmnt);
931                                 break;
932                         default:
933                                 /* log the name's directory component */
934                                 audit_log_format(ab, " name=");
935                                 audit_log_n_untrustedstring(ab, n->name_len,
936                                                             n->name);
937                         }
938                 } else
939                         audit_log_format(ab, " name=(null)");
940
941                 if (n->ino != (unsigned long)-1) {
942                         audit_log_format(ab, " inode=%lu"
943                                          " dev=%02x:%02x mode=%#o"
944                                          " ouid=%u ogid=%u rdev=%02x:%02x",
945                                          n->ino,
946                                          MAJOR(n->dev),
947                                          MINOR(n->dev),
948                                          n->mode,
949                                          n->uid,
950                                          n->gid,
951                                          MAJOR(n->rdev),
952                                          MINOR(n->rdev));
953                 }
954                 if (n->osid != 0) {
955                         char *ctx = NULL;
956                         u32 len;
957                         if (selinux_ctxid_to_string(
958                                 n->osid, &ctx, &len)) {
959                                 audit_log_format(ab, " osid=%u", n->osid);
960                                 call_panic = 2;
961                         } else
962                                 audit_log_format(ab, " obj=%s", ctx);
963                         kfree(ctx);
964                 }
965
966                 audit_log_end(ab);
967         }
968         if (call_panic)
969                 audit_panic("error converting sid to string");
970 }
971
972 /**
973  * audit_free - free a per-task audit context
974  * @tsk: task whose audit context block to free
975  *
976  * Called from copy_process and do_exit
977  */
978 void audit_free(struct task_struct *tsk)
979 {
980         struct audit_context *context;
981
982         context = audit_get_context(tsk, 0, 0);
983         if (likely(!context))
984                 return;
985
986         /* Check for system calls that do not go through the exit
987          * function (e.g., exit_group), then free context block. 
988          * We use GFP_ATOMIC here because we might be doing this 
989          * in the context of the idle thread */
990         /* that can happen only if we are called from do_exit() */
991         if (context->in_syscall && context->auditable)
992                 audit_log_exit(context, tsk);
993
994         audit_free_context(context);
995 }
996
997 /**
998  * audit_syscall_entry - fill in an audit record at syscall entry
999  * @tsk: task being audited
1000  * @arch: architecture type
1001  * @major: major syscall type (function)
1002  * @a1: additional syscall register 1
1003  * @a2: additional syscall register 2
1004  * @a3: additional syscall register 3
1005  * @a4: additional syscall register 4
1006  *
1007  * Fill in audit context at syscall entry.  This only happens if the
1008  * audit context was created when the task was created and the state or
1009  * filters demand the audit context be built.  If the state from the
1010  * per-task filter or from the per-syscall filter is AUDIT_RECORD_CONTEXT,
1011  * then the record will be written at syscall exit time (otherwise, it
1012  * will only be written if another part of the kernel requests that it
1013  * be written).
1014  */
1015 void audit_syscall_entry(int arch, int major,
1016                          unsigned long a1, unsigned long a2,
1017                          unsigned long a3, unsigned long a4)
1018 {
1019         struct task_struct *tsk = current;
1020         struct audit_context *context = tsk->audit_context;
1021         enum audit_state     state;
1022
1023         BUG_ON(!context);
1024
1025         /*
1026          * This happens only on certain architectures that make system
1027          * calls in kernel_thread via the entry.S interface, instead of
1028          * with direct calls.  (If you are porting to a new
1029          * architecture, hitting this condition can indicate that you
1030          * got the _exit/_leave calls backward in entry.S.)
1031          *
1032          * i386     no
1033          * x86_64   no
1034          * ppc64    yes (see arch/powerpc/platforms/iseries/misc.S)
1035          *
1036          * This also happens with vm86 emulation in a non-nested manner
1037          * (entries without exits), so this case must be caught.
1038          */
1039         if (context->in_syscall) {
1040                 struct audit_context *newctx;
1041
1042 #if AUDIT_DEBUG
1043                 printk(KERN_ERR
1044                        "audit(:%d) pid=%d in syscall=%d;"
1045                        " entering syscall=%d\n",
1046                        context->serial, tsk->pid, context->major, major);
1047 #endif
1048                 newctx = audit_alloc_context(context->state);
1049                 if (newctx) {
1050                         newctx->previous   = context;
1051                         context            = newctx;
1052                         tsk->audit_context = newctx;
1053                 } else  {
1054                         /* If we can't alloc a new context, the best we
1055                          * can do is to leak memory (any pending putname
1056                          * will be lost).  The only other alternative is
1057                          * to abandon auditing. */
1058                         audit_zero_context(context, context->state);
1059                 }
1060         }
1061         BUG_ON(context->in_syscall || context->name_count);
1062
1063         if (!audit_enabled)
1064                 return;
1065
1066         context->arch       = arch;
1067         context->major      = major;
1068         context->argv[0]    = a1;
1069         context->argv[1]    = a2;
1070         context->argv[2]    = a3;
1071         context->argv[3]    = a4;
1072
1073         state = context->state;
1074         context->dummy = !audit_n_rules;
1075         if (!context->dummy && (state == AUDIT_SETUP_CONTEXT || state == AUDIT_BUILD_CONTEXT))
1076                 state = audit_filter_syscall(tsk, context, &audit_filter_list[AUDIT_FILTER_ENTRY]);
1077         if (likely(state == AUDIT_DISABLED))
1078                 return;
1079
1080         context->serial     = 0;
1081         context->ctime      = CURRENT_TIME;
1082         context->in_syscall = 1;
1083         context->auditable  = !!(state == AUDIT_RECORD_CONTEXT);
1084 }
1085
1086 /**
1087  * audit_syscall_exit - deallocate audit context after a system call
1088  * @tsk: task being audited
1089  * @valid: success/failure flag
1090  * @return_code: syscall return value
1091  *
1092  * Tear down after system call.  If the audit context has been marked as
1093  * auditable (either because of the AUDIT_RECORD_CONTEXT state from
1094  * filtering, or because some other part of the kernel write an audit
1095  * message), then write out the syscall information.  In call cases,
1096  * free the names stored from getname().
1097  */
1098 void audit_syscall_exit(int valid, long return_code)
1099 {
1100         struct task_struct *tsk = current;
1101         struct audit_context *context;
1102
1103         context = audit_get_context(tsk, valid, return_code);
1104
1105         if (likely(!context))
1106                 return;
1107
1108         if (context->in_syscall && context->auditable)
1109                 audit_log_exit(context, tsk);
1110
1111         context->in_syscall = 0;
1112         context->auditable  = 0;
1113
1114         if (context->previous) {
1115                 struct audit_context *new_context = context->previous;
1116                 context->previous  = NULL;
1117                 audit_free_context(context);
1118                 tsk->audit_context = new_context;
1119         } else {
1120                 audit_free_names(context);
1121                 audit_free_aux(context);
1122                 kfree(context->filterkey);
1123                 context->filterkey = NULL;
1124                 tsk->audit_context = context;
1125         }
1126 }
1127
1128 /**
1129  * audit_getname - add a name to the list
1130  * @name: name to add
1131  *
1132  * Add a name to the list of audit names for this context.
1133  * Called from fs/namei.c:getname().
1134  */
1135 void __audit_getname(const char *name)
1136 {
1137         struct audit_context *context = current->audit_context;
1138
1139         if (IS_ERR(name) || !name)
1140                 return;
1141
1142         if (!context->in_syscall) {
1143 #if AUDIT_DEBUG == 2
1144                 printk(KERN_ERR "%s:%d(:%d): ignoring getname(%p)\n",
1145                        __FILE__, __LINE__, context->serial, name);
1146                 dump_stack();
1147 #endif
1148                 return;
1149         }
1150         BUG_ON(context->name_count >= AUDIT_NAMES);
1151         context->names[context->name_count].name = name;
1152         context->names[context->name_count].name_len = AUDIT_NAME_FULL;
1153         context->names[context->name_count].name_put = 1;
1154         context->names[context->name_count].ino  = (unsigned long)-1;
1155         ++context->name_count;
1156         if (!context->pwd) {
1157                 read_lock(&current->fs->lock);
1158                 context->pwd = dget(current->fs->pwd);
1159                 context->pwdmnt = mntget(current->fs->pwdmnt);
1160                 read_unlock(&current->fs->lock);
1161         }
1162                 
1163 }
1164
1165 /* audit_putname - intercept a putname request
1166  * @name: name to intercept and delay for putname
1167  *
1168  * If we have stored the name from getname in the audit context,
1169  * then we delay the putname until syscall exit.
1170  * Called from include/linux/fs.h:putname().
1171  */
1172 void audit_putname(const char *name)
1173 {
1174         struct audit_context *context = current->audit_context;
1175
1176         BUG_ON(!context);
1177         if (!context->in_syscall) {
1178 #if AUDIT_DEBUG == 2
1179                 printk(KERN_ERR "%s:%d(:%d): __putname(%p)\n",
1180                        __FILE__, __LINE__, context->serial, name);
1181                 if (context->name_count) {
1182                         int i;
1183                         for (i = 0; i < context->name_count; i++)
1184                                 printk(KERN_ERR "name[%d] = %p = %s\n", i,
1185                                        context->names[i].name,
1186                                        context->names[i].name ?: "(null)");
1187                 }
1188 #endif
1189                 __putname(name);
1190         }
1191 #if AUDIT_DEBUG
1192         else {
1193                 ++context->put_count;
1194                 if (context->put_count > context->name_count) {
1195                         printk(KERN_ERR "%s:%d(:%d): major=%d"
1196                                " in_syscall=%d putname(%p) name_count=%d"
1197                                " put_count=%d\n",
1198                                __FILE__, __LINE__,
1199                                context->serial, context->major,
1200                                context->in_syscall, name, context->name_count,
1201                                context->put_count);
1202                         dump_stack();
1203                 }
1204         }
1205 #endif
1206 }
1207
1208 /* Copy inode data into an audit_names. */
1209 static void audit_copy_inode(struct audit_names *name, const struct inode *inode)
1210 {
1211         name->ino   = inode->i_ino;
1212         name->dev   = inode->i_sb->s_dev;
1213         name->mode  = inode->i_mode;
1214         name->uid   = inode->i_uid;
1215         name->gid   = inode->i_gid;
1216         name->rdev  = inode->i_rdev;
1217         selinux_get_inode_sid(inode, &name->osid);
1218 }
1219
1220 /**
1221  * audit_inode - store the inode and device from a lookup
1222  * @name: name being audited
1223  * @inode: inode being audited
1224  *
1225  * Called from fs/namei.c:path_lookup().
1226  */
1227 void __audit_inode(const char *name, const struct inode *inode)
1228 {
1229         int idx;
1230         struct audit_context *context = current->audit_context;
1231
1232         if (!context->in_syscall)
1233                 return;
1234         if (context->name_count
1235             && context->names[context->name_count-1].name
1236             && context->names[context->name_count-1].name == name)
1237                 idx = context->name_count - 1;
1238         else if (context->name_count > 1
1239                  && context->names[context->name_count-2].name
1240                  && context->names[context->name_count-2].name == name)
1241                 idx = context->name_count - 2;
1242         else {
1243                 /* FIXME: how much do we care about inodes that have no
1244                  * associated name? */
1245                 if (context->name_count >= AUDIT_NAMES - AUDIT_NAMES_RESERVED)
1246                         return;
1247                 idx = context->name_count++;
1248                 context->names[idx].name = NULL;
1249 #if AUDIT_DEBUG
1250                 ++context->ino_count;
1251 #endif
1252         }
1253         audit_copy_inode(&context->names[idx], inode);
1254 }
1255
1256 /**
1257  * audit_inode_child - collect inode info for created/removed objects
1258  * @dname: inode's dentry name
1259  * @inode: inode being audited
1260  * @parent: inode of dentry parent
1261  *
1262  * For syscalls that create or remove filesystem objects, audit_inode
1263  * can only collect information for the filesystem object's parent.
1264  * This call updates the audit context with the child's information.
1265  * Syscalls that create a new filesystem object must be hooked after
1266  * the object is created.  Syscalls that remove a filesystem object
1267  * must be hooked prior, in order to capture the target inode during
1268  * unsuccessful attempts.
1269  */
1270 void __audit_inode_child(const char *dname, const struct inode *inode,
1271                          const struct inode *parent)
1272 {
1273         int idx;
1274         struct audit_context *context = current->audit_context;
1275         const char *found_name = NULL;
1276         int dirlen = 0;
1277
1278         if (!context->in_syscall)
1279                 return;
1280
1281         /* determine matching parent */
1282         if (!dname)
1283                 goto update_context;
1284         for (idx = 0; idx < context->name_count; idx++)
1285                 if (context->names[idx].ino == parent->i_ino) {
1286                         const char *name = context->names[idx].name;
1287
1288                         if (!name)
1289                                 continue;
1290
1291                         if (audit_compare_dname_path(dname, name, &dirlen) == 0) {
1292                                 context->names[idx].name_len = dirlen;
1293                                 found_name = name;
1294                                 break;
1295                         }
1296                 }
1297
1298 update_context:
1299         idx = context->name_count++;
1300 #if AUDIT_DEBUG
1301         context->ino_count++;
1302 #endif
1303         /* Re-use the name belonging to the slot for a matching parent directory.
1304          * All names for this context are relinquished in audit_free_names() */
1305         context->names[idx].name = found_name;
1306         context->names[idx].name_len = AUDIT_NAME_FULL;
1307         context->names[idx].name_put = 0;       /* don't call __putname() */
1308
1309         if (!inode)
1310                 context->names[idx].ino = (unsigned long)-1;
1311         else
1312                 audit_copy_inode(&context->names[idx], inode);
1313
1314         /* A parent was not found in audit_names, so copy the inode data for the
1315          * provided parent. */
1316         if (!found_name) {
1317                 idx = context->name_count++;
1318 #if AUDIT_DEBUG
1319                 context->ino_count++;
1320 #endif
1321                 audit_copy_inode(&context->names[idx], parent);
1322         }
1323 }
1324
1325 /**
1326  * audit_inode_update - update inode info for last collected name
1327  * @inode: inode being audited
1328  *
1329  * When open() is called on an existing object with the O_CREAT flag, the inode
1330  * data audit initially collects is incorrect.  This additional hook ensures
1331  * audit has the inode data for the actual object to be opened.
1332  */
1333 void __audit_inode_update(const struct inode *inode)
1334 {
1335         struct audit_context *context = current->audit_context;
1336         int idx;
1337
1338         if (!context->in_syscall || !inode)
1339                 return;
1340
1341         if (context->name_count == 0) {
1342                 context->name_count++;
1343 #if AUDIT_DEBUG
1344                 context->ino_count++;
1345 #endif
1346         }
1347         idx = context->name_count - 1;
1348
1349         audit_copy_inode(&context->names[idx], inode);
1350 }
1351
1352 /**
1353  * auditsc_get_stamp - get local copies of audit_context values
1354  * @ctx: audit_context for the task
1355  * @t: timespec to store time recorded in the audit_context
1356  * @serial: serial value that is recorded in the audit_context
1357  *
1358  * Also sets the context as auditable.
1359  */
1360 void auditsc_get_stamp(struct audit_context *ctx,
1361                        struct timespec *t, unsigned int *serial)
1362 {
1363         if (!ctx->serial)
1364                 ctx->serial = audit_serial();
1365         t->tv_sec  = ctx->ctime.tv_sec;
1366         t->tv_nsec = ctx->ctime.tv_nsec;
1367         *serial    = ctx->serial;
1368         ctx->auditable = 1;
1369 }
1370
1371 /**
1372  * audit_set_loginuid - set a task's audit_context loginuid
1373  * @task: task whose audit context is being modified
1374  * @loginuid: loginuid value
1375  *
1376  * Returns 0.
1377  *
1378  * Called (set) from fs/proc/base.c::proc_loginuid_write().
1379  */
1380 int audit_set_loginuid(struct task_struct *task, uid_t loginuid)
1381 {
1382         struct audit_context *context = task->audit_context;
1383
1384         if (context) {
1385                 /* Only log if audit is enabled */
1386                 if (context->in_syscall) {
1387                         struct audit_buffer *ab;
1388
1389                         ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN);
1390                         if (ab) {
1391                                 audit_log_format(ab, "login pid=%d uid=%u "
1392                                         "old auid=%u new auid=%u",
1393                                         task->pid, task->uid,
1394                                         context->loginuid, loginuid);
1395                                 audit_log_end(ab);
1396                         }
1397                 }
1398                 context->loginuid = loginuid;
1399         }
1400         return 0;
1401 }
1402
1403 /**
1404  * audit_get_loginuid - get the loginuid for an audit_context
1405  * @ctx: the audit_context
1406  *
1407  * Returns the context's loginuid or -1 if @ctx is NULL.
1408  */
1409 uid_t audit_get_loginuid(struct audit_context *ctx)
1410 {
1411         return ctx ? ctx->loginuid : -1;
1412 }
1413
1414 /**
1415  * __audit_mq_open - record audit data for a POSIX MQ open
1416  * @oflag: open flag
1417  * @mode: mode bits
1418  * @u_attr: queue attributes
1419  *
1420  * Returns 0 for success or NULL context or < 0 on error.
1421  */
1422 int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr)
1423 {
1424         struct audit_aux_data_mq_open *ax;
1425         struct audit_context *context = current->audit_context;
1426
1427         if (!audit_enabled)
1428                 return 0;
1429
1430         if (likely(!context))
1431                 return 0;
1432
1433         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1434         if (!ax)
1435                 return -ENOMEM;
1436
1437         if (u_attr != NULL) {
1438                 if (copy_from_user(&ax->attr, u_attr, sizeof(ax->attr))) {
1439                         kfree(ax);
1440                         return -EFAULT;
1441                 }
1442         } else
1443                 memset(&ax->attr, 0, sizeof(ax->attr));
1444
1445         ax->oflag = oflag;
1446         ax->mode = mode;
1447
1448         ax->d.type = AUDIT_MQ_OPEN;
1449         ax->d.next = context->aux;
1450         context->aux = (void *)ax;
1451         return 0;
1452 }
1453
1454 /**
1455  * __audit_mq_timedsend - record audit data for a POSIX MQ timed send
1456  * @mqdes: MQ descriptor
1457  * @msg_len: Message length
1458  * @msg_prio: Message priority
1459  * @u_abs_timeout: Message timeout in absolute time
1460  *
1461  * Returns 0 for success or NULL context or < 0 on error.
1462  */
1463 int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio,
1464                         const struct timespec __user *u_abs_timeout)
1465 {
1466         struct audit_aux_data_mq_sendrecv *ax;
1467         struct audit_context *context = current->audit_context;
1468
1469         if (!audit_enabled)
1470                 return 0;
1471
1472         if (likely(!context))
1473                 return 0;
1474
1475         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1476         if (!ax)
1477                 return -ENOMEM;
1478
1479         if (u_abs_timeout != NULL) {
1480                 if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) {
1481                         kfree(ax);
1482                         return -EFAULT;
1483                 }
1484         } else
1485                 memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout));
1486
1487         ax->mqdes = mqdes;
1488         ax->msg_len = msg_len;
1489         ax->msg_prio = msg_prio;
1490
1491         ax->d.type = AUDIT_MQ_SENDRECV;
1492         ax->d.next = context->aux;
1493         context->aux = (void *)ax;
1494         return 0;
1495 }
1496
1497 /**
1498  * __audit_mq_timedreceive - record audit data for a POSIX MQ timed receive
1499  * @mqdes: MQ descriptor
1500  * @msg_len: Message length
1501  * @u_msg_prio: Message priority
1502  * @u_abs_timeout: Message timeout in absolute time
1503  *
1504  * Returns 0 for success or NULL context or < 0 on error.
1505  */
1506 int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len,
1507                                 unsigned int __user *u_msg_prio,
1508                                 const struct timespec __user *u_abs_timeout)
1509 {
1510         struct audit_aux_data_mq_sendrecv *ax;
1511         struct audit_context *context = current->audit_context;
1512
1513         if (!audit_enabled)
1514                 return 0;
1515
1516         if (likely(!context))
1517                 return 0;
1518
1519         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1520         if (!ax)
1521                 return -ENOMEM;
1522
1523         if (u_msg_prio != NULL) {
1524                 if (get_user(ax->msg_prio, u_msg_prio)) {
1525                         kfree(ax);
1526                         return -EFAULT;
1527                 }
1528         } else
1529                 ax->msg_prio = 0;
1530
1531         if (u_abs_timeout != NULL) {
1532                 if (copy_from_user(&ax->abs_timeout, u_abs_timeout, sizeof(ax->abs_timeout))) {
1533                         kfree(ax);
1534                         return -EFAULT;
1535                 }
1536         } else
1537                 memset(&ax->abs_timeout, 0, sizeof(ax->abs_timeout));
1538
1539         ax->mqdes = mqdes;
1540         ax->msg_len = msg_len;
1541
1542         ax->d.type = AUDIT_MQ_SENDRECV;
1543         ax->d.next = context->aux;
1544         context->aux = (void *)ax;
1545         return 0;
1546 }
1547
1548 /**
1549  * __audit_mq_notify - record audit data for a POSIX MQ notify
1550  * @mqdes: MQ descriptor
1551  * @u_notification: Notification event
1552  *
1553  * Returns 0 for success or NULL context or < 0 on error.
1554  */
1555
1556 int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification)
1557 {
1558         struct audit_aux_data_mq_notify *ax;
1559         struct audit_context *context = current->audit_context;
1560
1561         if (!audit_enabled)
1562                 return 0;
1563
1564         if (likely(!context))
1565                 return 0;
1566
1567         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1568         if (!ax)
1569                 return -ENOMEM;
1570
1571         if (u_notification != NULL) {
1572                 if (copy_from_user(&ax->notification, u_notification, sizeof(ax->notification))) {
1573                         kfree(ax);
1574                         return -EFAULT;
1575                 }
1576         } else
1577                 memset(&ax->notification, 0, sizeof(ax->notification));
1578
1579         ax->mqdes = mqdes;
1580
1581         ax->d.type = AUDIT_MQ_NOTIFY;
1582         ax->d.next = context->aux;
1583         context->aux = (void *)ax;
1584         return 0;
1585 }
1586
1587 /**
1588  * __audit_mq_getsetattr - record audit data for a POSIX MQ get/set attribute
1589  * @mqdes: MQ descriptor
1590  * @mqstat: MQ flags
1591  *
1592  * Returns 0 for success or NULL context or < 0 on error.
1593  */
1594 int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
1595 {
1596         struct audit_aux_data_mq_getsetattr *ax;
1597         struct audit_context *context = current->audit_context;
1598
1599         if (!audit_enabled)
1600                 return 0;
1601
1602         if (likely(!context))
1603                 return 0;
1604
1605         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1606         if (!ax)
1607                 return -ENOMEM;
1608
1609         ax->mqdes = mqdes;
1610         ax->mqstat = *mqstat;
1611
1612         ax->d.type = AUDIT_MQ_GETSETATTR;
1613         ax->d.next = context->aux;
1614         context->aux = (void *)ax;
1615         return 0;
1616 }
1617
1618 /**
1619  * audit_ipc_obj - record audit data for ipc object
1620  * @ipcp: ipc permissions
1621  *
1622  * Returns 0 for success or NULL context or < 0 on error.
1623  */
1624 int __audit_ipc_obj(struct kern_ipc_perm *ipcp)
1625 {
1626         struct audit_aux_data_ipcctl *ax;
1627         struct audit_context *context = current->audit_context;
1628
1629         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1630         if (!ax)
1631                 return -ENOMEM;
1632
1633         ax->uid = ipcp->uid;
1634         ax->gid = ipcp->gid;
1635         ax->mode = ipcp->mode;
1636         selinux_get_ipc_sid(ipcp, &ax->osid);
1637
1638         ax->d.type = AUDIT_IPC;
1639         ax->d.next = context->aux;
1640         context->aux = (void *)ax;
1641         return 0;
1642 }
1643
1644 /**
1645  * audit_ipc_set_perm - record audit data for new ipc permissions
1646  * @qbytes: msgq bytes
1647  * @uid: msgq user id
1648  * @gid: msgq group id
1649  * @mode: msgq mode (permissions)
1650  *
1651  * Returns 0 for success or NULL context or < 0 on error.
1652  */
1653 int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode)
1654 {
1655         struct audit_aux_data_ipcctl *ax;
1656         struct audit_context *context = current->audit_context;
1657
1658         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1659         if (!ax)
1660                 return -ENOMEM;
1661
1662         ax->qbytes = qbytes;
1663         ax->uid = uid;
1664         ax->gid = gid;
1665         ax->mode = mode;
1666
1667         ax->d.type = AUDIT_IPC_SET_PERM;
1668         ax->d.next = context->aux;
1669         context->aux = (void *)ax;
1670         return 0;
1671 }
1672
1673 int audit_bprm(struct linux_binprm *bprm)
1674 {
1675         struct audit_aux_data_execve *ax;
1676         struct audit_context *context = current->audit_context;
1677         unsigned long p, next;
1678         void *to;
1679
1680         if (likely(!audit_enabled || !context || context->dummy))
1681                 return 0;
1682
1683         ax = kmalloc(sizeof(*ax) + PAGE_SIZE * MAX_ARG_PAGES - bprm->p,
1684                                 GFP_KERNEL);
1685         if (!ax)
1686                 return -ENOMEM;
1687
1688         ax->argc = bprm->argc;
1689         ax->envc = bprm->envc;
1690         for (p = bprm->p, to = ax->mem; p < MAX_ARG_PAGES*PAGE_SIZE; p = next) {
1691                 struct page *page = bprm->page[p / PAGE_SIZE];
1692                 void *kaddr = kmap(page);
1693                 next = (p + PAGE_SIZE) & ~(PAGE_SIZE - 1);
1694                 memcpy(to, kaddr + (p & (PAGE_SIZE - 1)), next - p);
1695                 to += next - p;
1696                 kunmap(page);
1697         }
1698
1699         ax->d.type = AUDIT_EXECVE;
1700         ax->d.next = context->aux;
1701         context->aux = (void *)ax;
1702         return 0;
1703 }
1704
1705
1706 /**
1707  * audit_socketcall - record audit data for sys_socketcall
1708  * @nargs: number of args
1709  * @args: args array
1710  *
1711  * Returns 0 for success or NULL context or < 0 on error.
1712  */
1713 int audit_socketcall(int nargs, unsigned long *args)
1714 {
1715         struct audit_aux_data_socketcall *ax;
1716         struct audit_context *context = current->audit_context;
1717
1718         if (likely(!context || context->dummy))
1719                 return 0;
1720
1721         ax = kmalloc(sizeof(*ax) + nargs * sizeof(unsigned long), GFP_KERNEL);
1722         if (!ax)
1723                 return -ENOMEM;
1724
1725         ax->nargs = nargs;
1726         memcpy(ax->args, args, nargs * sizeof(unsigned long));
1727
1728         ax->d.type = AUDIT_SOCKETCALL;
1729         ax->d.next = context->aux;
1730         context->aux = (void *)ax;
1731         return 0;
1732 }
1733
1734 /**
1735  * audit_sockaddr - record audit data for sys_bind, sys_connect, sys_sendto
1736  * @len: data length in user space
1737  * @a: data address in kernel space
1738  *
1739  * Returns 0 for success or NULL context or < 0 on error.
1740  */
1741 int audit_sockaddr(int len, void *a)
1742 {
1743         struct audit_aux_data_sockaddr *ax;
1744         struct audit_context *context = current->audit_context;
1745
1746         if (likely(!context || context->dummy))
1747                 return 0;
1748
1749         ax = kmalloc(sizeof(*ax) + len, GFP_KERNEL);
1750         if (!ax)
1751                 return -ENOMEM;
1752
1753         ax->len = len;
1754         memcpy(ax->a, a, len);
1755
1756         ax->d.type = AUDIT_SOCKADDR;
1757         ax->d.next = context->aux;
1758         context->aux = (void *)ax;
1759         return 0;
1760 }
1761
1762 /**
1763  * audit_avc_path - record the granting or denial of permissions
1764  * @dentry: dentry to record
1765  * @mnt: mnt to record
1766  *
1767  * Returns 0 for success or NULL context or < 0 on error.
1768  *
1769  * Called from security/selinux/avc.c::avc_audit()
1770  */
1771 int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt)
1772 {
1773         struct audit_aux_data_path *ax;
1774         struct audit_context *context = current->audit_context;
1775
1776         if (likely(!context))
1777                 return 0;
1778
1779         ax = kmalloc(sizeof(*ax), GFP_ATOMIC);
1780         if (!ax)
1781                 return -ENOMEM;
1782
1783         ax->dentry = dget(dentry);
1784         ax->mnt = mntget(mnt);
1785
1786         ax->d.type = AUDIT_AVC_PATH;
1787         ax->d.next = context->aux;
1788         context->aux = (void *)ax;
1789         return 0;
1790 }
1791
1792 /**
1793  * audit_signal_info - record signal info for shutting down audit subsystem
1794  * @sig: signal value
1795  * @t: task being signaled
1796  *
1797  * If the audit subsystem is being terminated, record the task (pid)
1798  * and uid that is doing that.
1799  */
1800 void __audit_signal_info(int sig, struct task_struct *t)
1801 {
1802         extern pid_t audit_sig_pid;
1803         extern uid_t audit_sig_uid;
1804         extern u32 audit_sig_sid;
1805
1806         if (sig == SIGTERM || sig == SIGHUP || sig == SIGUSR1) {
1807                 struct task_struct *tsk = current;
1808                 struct audit_context *ctx = tsk->audit_context;
1809                 audit_sig_pid = tsk->pid;
1810                 if (ctx)
1811                         audit_sig_uid = ctx->loginuid;
1812                 else
1813                         audit_sig_uid = tsk->uid;
1814                 selinux_get_task_sid(tsk, &audit_sig_sid);
1815         }
1816 }