Merge branch 'audit.b21' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit...
Linus Torvalds [Tue, 20 Jun 2006 22:37:56 +0000 (15:37 -0700)]
* 'audit.b21' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current: (25 commits)
  [PATCH] make set_loginuid obey audit_enabled
  [PATCH] log more info for directory entry change events
  [PATCH] fix AUDIT_FILTER_PREPEND handling
  [PATCH] validate rule fields' types
  [PATCH] audit: path-based rules
  [PATCH] Audit of POSIX Message Queue Syscalls v.2
  [PATCH] fix se_sen audit filter
  [PATCH] deprecate AUDIT_POSSBILE
  [PATCH] inline more audit helpers
  [PATCH] proc_loginuid_write() uses simple_strtoul() on non-terminated array
  [PATCH] update of IPC audit record cleanup
  [PATCH] minor audit updates
  [PATCH] fix audit_krule_to_{rule,data} return values
  [PATCH] add filtering by ppid
  [PATCH] log ppid
  [PATCH] collect sid of those who send signals to auditd
  [PATCH] execve argument logging
  [PATCH] fix deadlocks in AUDIT_LIST/AUDIT_LIST_RULES
  [PATCH] audit_panic() is audit-internal
  [PATCH] inotify (5/5): update kernel documentation
  ...

Manual fixup of conflict in unclude/linux/inotify.h

1  2 
fs/Kconfig
include/linux/audit.h
include/linux/sched.h
init/Kconfig

diff --combined fs/Kconfig
@@@ -393,16 -393,28 +393,28 @@@ config INOTIF
        bool "Inotify file change notification support"
        default y
        ---help---
-         Say Y here to enable inotify support and the associated system
-         calls.  Inotify is a file change notification system and a
-         replacement for dnotify.  Inotify fixes numerous shortcomings in
-         dnotify and introduces several new features.  It allows monitoring
-         of both files and directories via a single open fd.  Other features
-         include multiple file events, one-shot support, and unmount
+         Say Y here to enable inotify support.  Inotify is a file change
+         notification system and a replacement for dnotify.  Inotify fixes
+         numerous shortcomings in dnotify and introduces several new features
+         including multiple file events, one-shot support, and unmount
          notification.
  
          For more information, see Documentation/filesystems/inotify.txt
  
+         If unsure, say Y.
+ config INOTIFY_USER
+       bool "Inotify support for userspace"
+       depends on INOTIFY
+       default y
+       ---help---
+         Say Y here to enable inotify support for userspace, including the
+         associated system calls.  Inotify allows monitoring of both files and
+         directories via a single open fd.  Events are read from the file
+         descriptor, which is also select()- and poll()-able.
+         For more information, see Documentation/filesystems/inotify.txt
          If unsure, say Y.
  
  config QUOTA
@@@ -1101,44 -1113,6 +1113,44 @@@ config JFFS2_SUMMAR
  
          If unsure, say 'N'.
  
 +config JFFS2_FS_XATTR
 +      bool "JFFS2 XATTR support (EXPERIMENTAL)"
 +      depends on JFFS2_FS && EXPERIMENTAL && !JFFS2_FS_WRITEBUFFER
 +      default n
 +      help
 +        Extended attributes are name:value pairs associated with inodes by
 +        the kernel or by users (see the attr(5) manual page, or visit
 +        <http://acl.bestbits.at/> for details).
 +        
 +        If unsure, say N.
 +
 +config JFFS2_FS_POSIX_ACL
 +      bool "JFFS2 POSIX Access Control Lists"
 +      depends on JFFS2_FS_XATTR
 +      default y
 +      select FS_POSIX_ACL
 +      help
 +        Posix Access Control Lists (ACLs) support permissions for users and
 +        groups beyond the owner/group/world scheme.
 +        
 +        To learn more about Access Control Lists, visit the Posix ACLs for
 +        Linux website <http://acl.bestbits.at/>.
 +        
 +        If you don't know what Access Control Lists are, say N
 +
 +config JFFS2_FS_SECURITY
 +      bool "JFFS2 Security Labels"
 +      depends on JFFS2_FS_XATTR
 +      default y
 +      help
 +        Security labels support alternative access control models
 +        implemented by security modules like SELinux.  This option
 +        enables an extended attribute handler for file security
 +        labels in the jffs2 filesystem.
 +        
 +        If you are not using a security module that requires using
 +        extended attributes for file security labels, say N.
 +
  config JFFS2_COMPRESSION_OPTIONS
        bool "Advanced compression options for JFFS2"
        depends on JFFS2_FS
diff --combined include/linux/audit.h
@@@ -24,7 -24,8 +24,7 @@@
  #ifndef _LINUX_AUDIT_H_
  #define _LINUX_AUDIT_H_
  
 -#include <linux/sched.h>
 -#include <linux/elf.h>
 +#include <linux/elf-em.h>
  
  /* The netlink messages for the audit system is divided into blocks:
   * 1000 - 1099 are for commanding the audit system
  #define AUDIT_CONFIG_CHANGE   1305    /* Audit system configuration change */
  #define AUDIT_SOCKADDR                1306    /* sockaddr copied as syscall arg */
  #define AUDIT_CWD             1307    /* Current working directory */
+ #define AUDIT_EXECVE          1309    /* execve arguments */
  #define AUDIT_IPC_SET_PERM    1311    /* IPC new permissions record type */
+ #define AUDIT_MQ_OPEN         1312    /* POSIX MQ open record type */
+ #define AUDIT_MQ_SENDRECV     1313    /* POSIX MQ send/receive record type */
+ #define AUDIT_MQ_NOTIFY               1314    /* POSIX MQ notify record type */
+ #define AUDIT_MQ_GETSETATTR   1315    /* POSIX MQ get/set attribute record type */
  
  #define AUDIT_AVC             1400    /* SE Linux avc denial or grant */
  #define AUDIT_SELINUX_ERR     1401    /* Internal SE Linux Errors */
  #define AUDIT_SE_TYPE 15      /* security label type */
  #define AUDIT_SE_SEN  16      /* security label sensitivity label */
  #define AUDIT_SE_CLR  17      /* security label clearance label */
+ #define AUDIT_PPID    18
  
                                /* These are ONLY useful when checking
                                 * at syscall exit time (AUDIT_AT_EXIT). */
  #define AUDIT_INODE   102
  #define AUDIT_EXIT    103
  #define AUDIT_SUCCESS   104   /* exit >= 0; value ignored */
+ #define AUDIT_WATCH   105
  
  #define AUDIT_ARG0      200
  #define AUDIT_ARG1      (AUDIT_ARG0+1)
@@@ -272,17 -280,20 +279,21 @@@ struct audit_rule {             /* for AUDIT_LIST
  };
  
  #ifdef __KERNEL__
 +#include <linux/sched.h>
  
  struct audit_sig_info {
        uid_t           uid;
        pid_t           pid;
+       char            ctx[0];
  };
  
  struct audit_buffer;
  struct audit_context;
  struct inode;
  struct netlink_skb_parms;
+ struct linux_binprm;
+ struct mq_attr;
+ struct mqstat;
  
  #define AUDITSC_INVALID 0
  #define AUDITSC_SUCCESS 1
@@@ -297,15 -308,19 +308,19 @@@ extern void audit_syscall_entry(int arc
                                int major, unsigned long a0, unsigned long a1,
                                unsigned long a2, unsigned long a3);
  extern void audit_syscall_exit(int failed, long return_code);
- extern void audit_getname(const char *name);
+ extern void __audit_getname(const char *name);
  extern void audit_putname(const char *name);
- extern void __audit_inode(const char *name, const struct inode *inode, unsigned flags);
+ extern void __audit_inode(const char *name, const struct inode *inode);
  extern void __audit_inode_child(const char *dname, const struct inode *inode,
                                unsigned long pino);
- static inline void audit_inode(const char *name, const struct inode *inode,
-                              unsigned flags) {
+ static inline void audit_getname(const char *name)
+ {
        if (unlikely(current->audit_context))
-               __audit_inode(name, inode, flags);
+               __audit_getname(name);
+ }
+ static inline void audit_inode(const char *name, const struct inode *inode) {
+       if (unlikely(current->audit_context))
+               __audit_inode(name, inode);
  }
  static inline void audit_inode_child(const char *dname, 
                                     const struct inode *inode, 
@@@ -320,13 -335,61 +335,61 @@@ extern void auditsc_get_stamp(struct au
                              struct timespec *t, unsigned int *serial);
  extern int  audit_set_loginuid(struct task_struct *task, uid_t loginuid);
  extern uid_t audit_get_loginuid(struct audit_context *ctx);
- extern int audit_ipc_obj(struct kern_ipc_perm *ipcp);
- extern int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode, struct kern_ipc_perm *ipcp);
+ extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp);
+ extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode);
+ extern int audit_bprm(struct linux_binprm *bprm);
  extern int audit_socketcall(int nargs, unsigned long *args);
  extern int audit_sockaddr(int len, void *addr);
  extern int audit_avc_path(struct dentry *dentry, struct vfsmount *mnt);
- extern void audit_signal_info(int sig, struct task_struct *t);
  extern int audit_set_macxattr(const char *name);
+ extern int __audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr);
+ extern int __audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout);
+ extern int __audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout);
+ extern int __audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification);
+ extern int __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
+ static inline int audit_ipc_obj(struct kern_ipc_perm *ipcp)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_ipc_obj(ipcp);
+       return 0;
+ }
+ static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, mode_t mode)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_ipc_set_perm(qbytes, uid, gid, mode);
+       return 0;
+ }
+ static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user *u_attr)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_mq_open(oflag, mode, u_attr);
+       return 0;
+ }
+ static inline int audit_mq_timedsend(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec __user *u_abs_timeout)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_mq_timedsend(mqdes, msg_len, msg_prio, u_abs_timeout);
+       return 0;
+ }
+ static inline int audit_mq_timedreceive(mqd_t mqdes, size_t msg_len, unsigned int __user *u_msg_prio, const struct timespec __user *u_abs_timeout)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_mq_timedreceive(mqdes, msg_len, u_msg_prio, u_abs_timeout);
+       return 0;
+ }
+ static inline int audit_mq_notify(mqd_t mqdes, const struct sigevent __user *u_notification)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_mq_notify(mqdes, u_notification);
+       return 0;
+ }
+ static inline int audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
+ {
+       if (unlikely(current->audit_context))
+               return __audit_mq_getsetattr(mqdes, mqstat);
+       return 0;
+ }
  #else
  #define audit_alloc(t) ({ 0; })
  #define audit_free(t) do { ; } while (0)
  #define audit_syscall_exit(f,r) do { ; } while (0)
  #define audit_getname(n) do { ; } while (0)
  #define audit_putname(n) do { ; } while (0)
- #define __audit_inode(n,i,f) do { ; } while (0)
+ #define __audit_inode(n,i) do { ; } while (0)
  #define __audit_inode_child(d,i,p) do { ; } while (0)
- #define audit_inode(n,i,f) do { ; } while (0)
+ #define audit_inode(n,i) do { ; } while (0)
  #define audit_inode_child(d,i,p) do { ; } while (0)
  #define auditsc_get_stamp(c,t,s) do { BUG(); } while (0)
  #define audit_get_loginuid(c) ({ -1; })
  #define audit_ipc_obj(i) ({ 0; })
- #define audit_ipc_set_perm(q,u,g,m,i) ({ 0; })
+ #define audit_ipc_set_perm(q,u,g,m) ({ 0; })
+ #define audit_bprm(p) ({ 0; })
  #define audit_socketcall(n,a) ({ 0; })
  #define audit_sockaddr(len, addr) ({ 0; })
  #define audit_avc_path(dentry, mnt) ({ 0; })
- #define audit_signal_info(s,t) do { ; } while (0)
  #define audit_set_macxattr(n) do { ; } while (0)
+ #define audit_mq_open(o,m,a) ({ 0; })
+ #define audit_mq_timedsend(d,l,p,t) ({ 0; })
+ #define audit_mq_timedreceive(d,l,p,t) ({ 0; })
+ #define audit_mq_notify(d,n) ({ 0; })
+ #define audit_mq_getsetattr(d,s) ({ 0; })
  #endif
  
  #ifdef CONFIG_AUDIT
@@@ -364,8 -432,11 +432,11 @@@ extern void                  audit_log_end(struct a
  extern void               audit_log_hex(struct audit_buffer *ab,
                                          const unsigned char *buf,
                                          size_t len);
- extern void               audit_log_untrustedstring(struct audit_buffer *ab,
+ extern const char *       audit_log_untrustedstring(struct audit_buffer *ab,
                                                      const char *string);
+ extern const char *       audit_log_n_untrustedstring(struct audit_buffer *ab,
+                                                       size_t n,
+                                                       const char *string);
  extern void               audit_log_d_path(struct audit_buffer *ab,
                                             const char *prefix,
                                             struct dentry *dentry,
@@@ -383,8 -454,8 +454,8 @@@ extern int  audit_receive_filter(int ty
  #define audit_log_end(b) do { ; } while (0)
  #define audit_log_hex(a,b,l) do { ; } while (0)
  #define audit_log_untrustedstring(a,s) do { ; } while (0)
+ #define audit_log_n_untrustedstring(a,n,s) do { ; } while (0)
  #define audit_log_d_path(b,p,d,v) do { ; } while (0)
- #define audit_panic(m) do { ; } while (0)
  #endif
  #endif
  #endif
diff --combined include/linux/sched.h
@@@ -1,46 -1,9 +1,46 @@@
  #ifndef _LINUX_SCHED_H
  #define _LINUX_SCHED_H
  
 +#include <linux/auxvec.h>     /* For AT_VECTOR_SIZE */
 +
 +/*
 + * cloning flags:
 + */
 +#define CSIGNAL               0x000000ff      /* signal mask to be sent at exit */
 +#define CLONE_VM      0x00000100      /* set if VM shared between processes */
 +#define CLONE_FS      0x00000200      /* set if fs info shared between processes */
 +#define CLONE_FILES   0x00000400      /* set if open files shared between processes */
 +#define CLONE_SIGHAND 0x00000800      /* set if signal handlers and blocked signals shared */
 +#define CLONE_PTRACE  0x00002000      /* set if we want to let tracing continue on the child too */
 +#define CLONE_VFORK   0x00004000      /* set if the parent wants the child to wake it up on mm_release */
 +#define CLONE_PARENT  0x00008000      /* set if we want to have the same parent as the cloner */
 +#define CLONE_THREAD  0x00010000      /* Same thread group? */
 +#define CLONE_NEWNS   0x00020000      /* New namespace group? */
 +#define CLONE_SYSVSEM 0x00040000      /* share system V SEM_UNDO semantics */
 +#define CLONE_SETTLS  0x00080000      /* create a new TLS for the child */
 +#define CLONE_PARENT_SETTID   0x00100000      /* set the TID in the parent */
 +#define CLONE_CHILD_CLEARTID  0x00200000      /* clear the TID in the child */
 +#define CLONE_DETACHED                0x00400000      /* Unused, ignored */
 +#define CLONE_UNTRACED                0x00800000      /* set if the tracing process can't force CLONE_PTRACE on this clone */
 +#define CLONE_CHILD_SETTID    0x01000000      /* set the TID in the child */
 +#define CLONE_STOPPED         0x02000000      /* Start in stopped state */
 +
 +/*
 + * Scheduling policies
 + */
 +#define SCHED_NORMAL          0
 +#define SCHED_FIFO            1
 +#define SCHED_RR              2
 +#define SCHED_BATCH           3
 +
 +#ifdef __KERNEL__
 +
 +struct sched_param {
 +      int sched_priority;
 +};
 +
  #include <asm/param.h>        /* for HZ */
  
 -#include <linux/config.h>
  #include <linux/capability.h>
  #include <linux/threads.h>
  #include <linux/kernel.h>
  #include <linux/rcupdate.h>
  #include <linux/futex.h>
  
 -#include <linux/auxvec.h>     /* For AT_VECTOR_SIZE */
 +#include <linux/time.h>
 +#include <linux/param.h>
 +#include <linux/resource.h>
 +#include <linux/timer.h>
 +#include <linux/hrtimer.h>
  
 -struct exec_domain;
 +#include <asm/processor.h>
  
 -/*
 - * cloning flags:
 - */
 -#define CSIGNAL               0x000000ff      /* signal mask to be sent at exit */
 -#define CLONE_VM      0x00000100      /* set if VM shared between processes */
 -#define CLONE_FS      0x00000200      /* set if fs info shared between processes */
 -#define CLONE_FILES   0x00000400      /* set if open files shared between processes */
 -#define CLONE_SIGHAND 0x00000800      /* set if signal handlers and blocked signals shared */
 -#define CLONE_PTRACE  0x00002000      /* set if we want to let tracing continue on the child too */
 -#define CLONE_VFORK   0x00004000      /* set if the parent wants the child to wake it up on mm_release */
 -#define CLONE_PARENT  0x00008000      /* set if we want to have the same parent as the cloner */
 -#define CLONE_THREAD  0x00010000      /* Same thread group? */
 -#define CLONE_NEWNS   0x00020000      /* New namespace group? */
 -#define CLONE_SYSVSEM 0x00040000      /* share system V SEM_UNDO semantics */
 -#define CLONE_SETTLS  0x00080000      /* create a new TLS for the child */
 -#define CLONE_PARENT_SETTID   0x00100000      /* set the TID in the parent */
 -#define CLONE_CHILD_CLEARTID  0x00200000      /* clear the TID in the child */
 -#define CLONE_DETACHED                0x00400000      /* Unused, ignored */
 -#define CLONE_UNTRACED                0x00800000      /* set if the tracing process can't force CLONE_PTRACE on this clone */
 -#define CLONE_CHILD_SETTID    0x01000000      /* set the TID in the child */
 -#define CLONE_STOPPED         0x02000000      /* Start in stopped state */
 +struct exec_domain;
  
  /*
   * List of flags we want to share for kernel threads,
@@@ -124,6 -103,13 +124,6 @@@ extern unsigned long nr_uninterruptible
  extern unsigned long nr_active(void);
  extern unsigned long nr_iowait(void);
  
 -#include <linux/time.h>
 -#include <linux/param.h>
 -#include <linux/resource.h>
 -#include <linux/timer.h>
 -#include <linux/hrtimer.h>
 -
 -#include <asm/processor.h>
  
  /*
   * Task state bitmask. NOTE! These bits are also
  /* Task command name length */
  #define TASK_COMM_LEN 16
  
 -/*
 - * Scheduling policies
 - */
 -#define SCHED_NORMAL          0
 -#define SCHED_FIFO            1
 -#define SCHED_RR              2
 -#define SCHED_BATCH           3
 -
 -struct sched_param {
 -      int sched_priority;
 -};
 -
 -#ifdef __KERNEL__
 -
  #include <linux/spinlock.h>
  
  /*
@@@ -494,7 -494,7 +494,7 @@@ struct user_struct 
        atomic_t processes;     /* How many processes does this user have? */
        atomic_t files;         /* How many open files does this user have? */
        atomic_t sigpending;    /* How many pending signals does this user have? */
- #ifdef CONFIG_INOTIFY
+ #ifdef CONFIG_INOTIFY_USER
        atomic_t inotify_watches; /* How many inotify watches does this user have? */
        atomic_t inotify_devs;  /* How many inotify devs does this user have opened? */
  #endif
diff --combined init/Kconfig
@@@ -182,7 -182,8 +182,8 @@@ config AUDITSYSCAL
        help
          Enable low-overhead system-call auditing infrastructure that
          can be used independently or with another kernel subsystem,
-         such as SELinux.
+         such as SELinux.  To use audit's filesystem watch feature, please
+         ensure that INOTIFY is configured.
  
  config IKCONFIG
        bool "Kernel .config support"
@@@ -389,6 -390,9 +390,6 @@@ config SLO
        default !SLAB
        bool
  
 -config OBSOLETE_INTERMODULE
 -      tristate
 -
  menu "Loadable module support"
  
  config MODULES