vserver 2.0-rc4
[linux-2.6.git] / kernel / auditsc.c
index 342b571..3435b71 100644 (file)
@@ -177,9 +177,10 @@ static inline int audit_add_rule(struct audit_entry *entry,
        return 0;
 }
 
-static void audit_free_rule(void *arg)
+static void audit_free_rule(struct rcu_head *head)
 {
-       kfree(arg);
+       struct audit_entry *e = container_of(head, struct audit_entry, rcu);
+       kfree(e);
 }
 
 /* Note that audit_add_rule and audit_del_rule are called via
@@ -195,7 +196,7 @@ static inline int audit_del_rule(struct audit_rule *rule,
        list_for_each_entry(e, list, list) {
                if (!audit_compare_rule(rule, &e->rule)) {
                        list_del_rcu(&e->list);
-                       call_rcu(&e->rcu, audit_free_rule, e);
+                       call_rcu(&e->rcu, audit_free_rule);
                        return 0;
                }
        }
@@ -249,8 +250,6 @@ int audit_receive_filter(int type, int pid, int uid, int seq, void *data)
                audit_send_reply(pid, seq, AUDIT_LIST, 1, 1, NULL, 0);
                break;
        case AUDIT_ADD:
-               if (!capable(CAP_SYS_ADMIN))
-                       return -EPERM;
                if (!(entry = kmalloc(sizeof(*entry), GFP_KERNEL)))
                        return -ENOMEM;
                if (audit_copy_rule(&entry->rule, data)) {
@@ -359,7 +358,7 @@ static int audit_filter_rules(struct task_struct *tsk,
                case AUDIT_INODE:
                        if (ctx) {
                                for (j = 0; j < ctx->name_count; j++) {
-                                       if (MINOR(ctx->names[j].ino)==value) {
+                                       if (ctx->names[j].ino == value) {
                                                ++result;
                                                break;
                                        }
@@ -548,8 +547,8 @@ int audit_alloc(struct task_struct *tsk)
 
                                /* Preserve login uid */
        context->loginuid = -1;
-       if (tsk->audit_context)
-               context->loginuid = tsk->audit_context->loginuid;
+       if (current->audit_context)
+               context->loginuid = current->audit_context->loginuid;
 
        tsk->audit_context  = context;
        set_tsk_thread_flag(tsk, TIF_SYSCALL_AUDIT);
@@ -590,7 +589,7 @@ static void audit_log_exit(struct audit_context *context)
        if (context->personality != PER_LINUX)
                audit_log_format(ab, " per=%lx", context->personality);
        if (context->return_valid)
-               audit_log_format(ab, " exit=%u", context->return_code);
+               audit_log_format(ab, " exit=%d", context->return_code);
        audit_log_format(ab,
                  " a0=%lx a1=%lx a2=%lx a3=%lx items=%d"
                  " pid=%d loginuid=%d uid=%d gid=%d"
@@ -856,6 +855,7 @@ void audit_putname(const char *name)
        }
 #endif
 }
+EXPORT_SYMBOL(audit_putname);
 
 /* Store the inode and device from a lookup.  Called from
  * fs/namei.c:path_lookup(). */
@@ -903,20 +903,27 @@ void audit_get_stamp(struct audit_context *ctx,
        }
 }
 
+extern int audit_set_type(struct audit_buffer *ab, int type);
+
 int audit_set_loginuid(struct audit_context *ctx, uid_t loginuid)
 {
        if (ctx) {
-               if (loginuid < 0)
-                       return -EINVAL;
+               struct audit_buffer *ab;
+
+               ab = audit_log_start(NULL);
+               if (ab) {
+                       audit_log_format(ab, "login pid=%d uid=%u "
+                               "old loginuid=%u new loginuid=%u",
+                               ctx->pid, ctx->uid, ctx->loginuid, loginuid);
+                       audit_set_type(ab, AUDIT_LOGIN);
+                       audit_log_end(ab);
+               }
                ctx->loginuid = loginuid;
        }
        return 0;
 }
 
-EXPORT_SYMBOL_GPL(audit_alloc);
-EXPORT_SYMBOL_GPL(audit_free);
-EXPORT_SYMBOL_GPL(audit_syscall_entry);
-EXPORT_SYMBOL_GPL(audit_syscall_exit);
-EXPORT_SYMBOL_GPL(audit_getname);
-EXPORT_SYMBOL_GPL(audit_putname);
-EXPORT_SYMBOL_GPL(audit_inode);
+uid_t audit_get_loginuid(struct audit_context *ctx)
+{
+       return ctx ? ctx->loginuid : -1;
+}