Merge branch 'upstream' of git://git.infradead.org/users/pcmoore/audit
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 27 Jun 2015 20:53:16 +0000 (13:53 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 27 Jun 2015 20:53:16 +0000 (13:53 -0700)
Pull audit updates from Paul Moore:
 "Four small audit patches for v4.2, all bug fixes.  Only 10 lines of
  change this time so very unremarkable, the patch subject lines pretty
  much tell the whole story"

* 'upstream' of git://git.infradead.org/users/pcmoore/audit:
  audit: Fix check of return value of strnlen_user()
  audit: obsolete audit_context check is removed in audit_filter_rules()
  audit: fix for typo in comment to function audit_log_link_denied()
  lsm: rename duplicate labels in LSM_AUDIT_DATA_TASK audit message type

1  2 
kernel/audit.c
kernel/auditsc.c
security/lsm_audit.c

diff --combined kernel/audit.c
index 1c13e4267de6e78c0ceb566c6517b837ce2b947e,7497a5a0fac04bcf0a408f489a6d0370f50b3904..f9e6065346db1e826ddf19fff7ef7d6806aca51f
@@@ -43,7 -43,6 +43,7 @@@
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
 +#include <linux/file.h>
  #include <linux/init.h>
  #include <linux/types.h>
  #include <linux/atomic.h>
@@@ -108,7 -107,6 +108,7 @@@ static u32 audit_rate_limit
   * When set to zero, this means unlimited. */
  static u32    audit_backlog_limit = 64;
  #define AUDIT_BACKLOG_WAIT_TIME (60 * HZ)
 +static u32    audit_backlog_wait_time_master = AUDIT_BACKLOG_WAIT_TIME;
  static u32    audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME;
  static u32    audit_backlog_wait_overflow = 0;
  
@@@ -340,13 -338,13 +340,13 @@@ static int audit_set_backlog_limit(u32 
  static int audit_set_backlog_wait_time(u32 timeout)
  {
        return audit_do_config_change("audit_backlog_wait_time",
 -                                    &audit_backlog_wait_time, timeout);
 +                                    &audit_backlog_wait_time_master, timeout);
  }
  
  static int audit_set_enabled(u32 state)
  {
        int rc;
 -      if (state < AUDIT_OFF || state > AUDIT_LOCKED)
 +      if (state > AUDIT_LOCKED)
                return -EINVAL;
  
        rc =  audit_do_config_change("audit_enabled", &audit_enabled, state);
@@@ -665,7 -663,7 +665,7 @@@ static int audit_netlink_ok(struct sk_b
        case AUDIT_MAKE_EQUIV:
                /* Only support auditd and auditctl in initial pid namespace
                 * for now. */
 -              if ((task_active_pid_ns(current) != &init_pid_ns))
 +              if (task_active_pid_ns(current) != &init_pid_ns)
                        return -EPERM;
  
                if (!netlink_capable(skb, CAP_AUDIT_CONTROL))
@@@ -836,7 -834,7 +836,7 @@@ static int audit_receive_msg(struct sk_
                s.lost                  = atomic_read(&audit_lost);
                s.backlog               = skb_queue_len(&audit_skb_queue);
                s.feature_bitmap        = AUDIT_FEATURE_BITMAP_ALL;
 -              s.backlog_wait_time     = audit_backlog_wait_time;
 +              s.backlog_wait_time     = audit_backlog_wait_time_master;
                audit_send_reply(skb, seq, AUDIT_GET, 0, 0, &s, sizeof(s));
                break;
        }
                if (s.mask & AUDIT_STATUS_BACKLOG_WAIT_TIME) {
                        if (sizeof(s) > (size_t)nlh->nlmsg_len)
                                return -EINVAL;
 -                      if (s.backlog_wait_time < 0 ||
 -                          s.backlog_wait_time > 10*AUDIT_BACKLOG_WAIT_TIME)
 +                      if (s.backlog_wait_time > 10*AUDIT_BACKLOG_WAIT_TIME)
                                return -EINVAL;
                        err = audit_set_backlog_wait_time(s.backlog_wait_time);
                        if (err < 0)
@@@ -1386,8 -1385,7 +1386,8 @@@ struct audit_buffer *audit_log_start(st
                return NULL;
        }
  
 -      audit_backlog_wait_time = AUDIT_BACKLOG_WAIT_TIME;
 +      if (!reserve)
 +              audit_backlog_wait_time = audit_backlog_wait_time_master;
  
        ab = audit_buffer_alloc(ctx, gfp_mask, type);
        if (!ab) {
@@@ -1761,7 -1759,7 +1761,7 @@@ void audit_log_name(struct audit_contex
        } else
                audit_log_format(ab, " name=(null)");
  
 -      if (n->ino != (unsigned long)-1) {
 +      if (n->ino != (unsigned long)-1)
                audit_log_format(ab, " inode=%lu"
                                 " dev=%02x:%02x mode=%#ho"
                                 " ouid=%u ogid=%u rdev=%02x:%02x",
                                 from_kgid(&init_user_ns, n->gid),
                                 MAJOR(n->rdev),
                                 MINOR(n->rdev));
 -      }
        if (n->osid != 0) {
                char *ctx = NULL;
                u32 len;
@@@ -1839,29 -1838,11 +1839,29 @@@ error_path
  }
  EXPORT_SYMBOL(audit_log_task_context);
  
 +void audit_log_d_path_exe(struct audit_buffer *ab,
 +                        struct mm_struct *mm)
 +{
 +      struct file *exe_file;
 +
 +      if (!mm)
 +              goto out_null;
 +
 +      exe_file = get_mm_exe_file(mm);
 +      if (!exe_file)
 +              goto out_null;
 +
 +      audit_log_d_path(ab, " exe=", &exe_file->f_path);
 +      fput(exe_file);
 +      return;
 +out_null:
 +      audit_log_format(ab, " exe=(null)");
 +}
 +
  void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
  {
        const struct cred *cred;
        char comm[sizeof(tsk->comm)];
 -      struct mm_struct *mm = tsk->mm;
        char *tty;
  
        if (!ab)
        audit_log_format(ab, " comm=");
        audit_log_untrustedstring(ab, get_task_comm(comm, tsk));
  
 -      if (mm) {
 -              down_read(&mm->mmap_sem);
 -              if (mm->exe_file)
 -                      audit_log_d_path(ab, " exe=", &mm->exe_file->f_path);
 -              up_read(&mm->mmap_sem);
 -      } else
 -              audit_log_format(ab, " exe=(null)");
 +      audit_log_d_path_exe(ab, tsk->mm);
        audit_log_task_context(ab);
  }
  EXPORT_SYMBOL(audit_log_task_info);
  
  /**
   * audit_log_link_denied - report a link restriction denial
-  * @operation: specific link opreation
+  * @operation: specific link operation
   * @link: the path that triggered the restriction
   */
  void audit_log_link_denied(const char *operation, struct path *link)
  
        /* Generate AUDIT_PATH record with object. */
        name->type = AUDIT_TYPE_NORMAL;
 -      audit_copy_inode(name, link->dentry, link->dentry->d_inode);
 +      audit_copy_inode(name, link->dentry, d_backing_inode(link->dentry));
        audit_log_name(current->audit_context, name, link, 0, NULL);
  out:
        kfree(name);
diff --combined kernel/auditsc.c
index 9fb9d1cb83ce2b19997be912aefdfd2c2a4fae3d,f6bc31e7dca9bd76e5579ec6786a97f70ccedb6d..09c65640cad6156f0ea702bc32ba9847b9465249
@@@ -599,9 -599,7 +599,7 @@@ static int audit_filter_rules(struct ta
                                result = match_tree_refs(ctx, rule->tree);
                        break;
                case AUDIT_LOGINUID:
-                       result = 0;
-                       if (ctx)
-                               result = audit_uid_comparator(tsk->loginuid, f->op, f->uid);
+                       result = audit_uid_comparator(tsk->loginuid, f->op, f->uid);
                        break;
                case AUDIT_LOGINUID_SET:
                        result = audit_comparator(audit_loginuid_set(tsk), f->op, f->val);
@@@ -1023,7 -1021,7 +1021,7 @@@ static int audit_log_single_execve_arg(
         * for strings that are too long, we should not have created
         * any.
         */
-       if (unlikely((len == -1) || len > MAX_ARG_STRLEN - 1)) {
+       if (unlikely((len == 0) || len > MAX_ARG_STRLEN - 1)) {
                WARN_ON(1);
                send_sig(SIGKILL, current, 0);
                return -1;
@@@ -1629,7 -1627,7 +1627,7 @@@ retry
        rcu_read_lock();
        seq = read_seqbegin(&rename_lock);
        for(;;) {
 -              struct inode *inode = d->d_inode;
 +              struct inode *inode = d_backing_inode(d);
                if (inode && unlikely(!hlist_empty(&inode->i_fsnotify_marks))) {
                        struct audit_chunk *chunk;
                        chunk = audit_tree_lookup(inode);
@@@ -1754,7 -1752,7 +1752,7 @@@ void __audit_inode(struct filename *nam
                   unsigned int flags)
  {
        struct audit_context *context = current->audit_context;
 -      const struct inode *inode = dentry->d_inode;
 +      const struct inode *inode = d_backing_inode(dentry);
        struct audit_names *n;
        bool parent = flags & AUDIT_INODE_PARENT;
  
@@@ -1853,7 -1851,7 +1851,7 @@@ void __audit_inode_child(const struct i
                         const unsigned char type)
  {
        struct audit_context *context = current->audit_context;
 -      const struct inode *inode = dentry->d_inode;
 +      const struct inode *inode = d_backing_inode(dentry);
        const char *dname = dentry->d_name.name;
        struct audit_names *n, *found_parent = NULL, *found_child = NULL;
  
@@@ -2361,6 -2359,7 +2359,6 @@@ static void audit_log_task(struct audit
        kuid_t auid, uid;
        kgid_t gid;
        unsigned int sessionid;
 -      struct mm_struct *mm = current->mm;
        char comm[sizeof(current->comm)];
  
        auid = audit_get_loginuid(current);
        audit_log_task_context(ab);
        audit_log_format(ab, " pid=%d comm=", task_pid_nr(current));
        audit_log_untrustedstring(ab, get_task_comm(comm, current));
 -      if (mm) {
 -              down_read(&mm->mmap_sem);
 -              if (mm->exe_file)
 -                      audit_log_d_path(ab, " exe=", &mm->exe_file->f_path);
 -              up_read(&mm->mmap_sem);
 -      } else
 -              audit_log_format(ab, " exe=(null)");
 +      audit_log_d_path_exe(ab, current->mm);
  }
  
  /**
diff --combined security/lsm_audit.c
index 1d34277dc402b5971122fdb35d0171eb33f612f5,07fc99724d4135c280d78b887008aba7550f3d38..4ed98107ace31c3bfef3dc87f6c58e0e91a581cf
@@@ -211,7 -211,7 +211,7 @@@ static inline void print_ipv4_addr(stru
  static void dump_common_audit_data(struct audit_buffer *ab,
                                   struct common_audit_data *a)
  {
 -      struct task_struct *tsk = current;
 +      char comm[sizeof(current->comm)];
  
        /*
         * To keep stack sizes in check force programers to notice if they
         */
        BUILD_BUG_ON(sizeof(a->u) > sizeof(void *)*2);
  
 -      audit_log_format(ab, " pid=%d comm=", task_pid_nr(tsk));
 -      audit_log_untrustedstring(ab, tsk->comm);
 +      audit_log_format(ab, " pid=%d comm=", task_pid_nr(current));
 +      audit_log_untrustedstring(ab, memcpy(comm, current->comm, sizeof(comm)));
  
        switch (a->type) {
        case LSM_AUDIT_DATA_NONE:
  
                audit_log_d_path(ab, " path=", &a->u.path);
  
 -              inode = a->u.path.dentry->d_inode;
 +              inode = d_backing_inode(a->u.path.dentry);
                if (inode) {
                        audit_log_format(ab, " dev=");
                        audit_log_untrustedstring(ab, inode->i_sb->s_id);
                audit_log_format(ab, " name=");
                audit_log_untrustedstring(ab, a->u.dentry->d_name.name);
  
 -              inode = a->u.dentry->d_inode;
 +              inode = d_backing_inode(a->u.dentry);
                if (inode) {
                        audit_log_format(ab, " dev=");
                        audit_log_untrustedstring(ab, inode->i_sb->s_id);
                audit_log_format(ab, " ino=%lu", inode->i_ino);
                break;
        }
 -      case LSM_AUDIT_DATA_TASK:
 -              tsk = a->u.tsk;
 +      case LSM_AUDIT_DATA_TASK: {
 +              struct task_struct *tsk = a->u.tsk;
                if (tsk) {
                        pid_t pid = task_pid_nr(tsk);
                        if (pid) {
-                               audit_log_format(ab, " pid=%d comm=", pid);
 +                              char comm[sizeof(tsk->comm)];
 -                              audit_log_untrustedstring(ab, tsk->comm);
+                               audit_log_format(ab, " opid=%d ocomm=", pid);
 +                              audit_log_untrustedstring(ab,
 +                                  memcpy(comm, tsk->comm, sizeof(comm)));
                        }
                }
                break;
 +      }
        case LSM_AUDIT_DATA_NET:
                if (a->u.net->sk) {
                        struct sock *sk = a->u.net->sk;