aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/audit.h24
-rw-r--r--include/linux/tty.h4
-rw-r--r--kernel/audit.c30
-rw-r--r--kernel/audit_tree.c12
-rw-r--r--kernel/auditsc.c8
5 files changed, 48 insertions, 30 deletions
diff --git a/include/linux/audit.h b/include/linux/audit.h
index e38e3fc13ea8..961a417d641e 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -26,6 +26,7 @@
26#include <linux/sched.h> 26#include <linux/sched.h>
27#include <linux/ptrace.h> 27#include <linux/ptrace.h>
28#include <uapi/linux/audit.h> 28#include <uapi/linux/audit.h>
29#include <linux/tty.h>
29 30
30#define AUDIT_INO_UNSET ((unsigned long)-1) 31#define AUDIT_INO_UNSET ((unsigned long)-1)
31#define AUDIT_DEV_UNSET ((dev_t)-1) 32#define AUDIT_DEV_UNSET ((dev_t)-1)
@@ -347,6 +348,23 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
347 return tsk->sessionid; 348 return tsk->sessionid;
348} 349}
349 350
351static inline struct tty_struct *audit_get_tty(struct task_struct *tsk)
352{
353 struct tty_struct *tty = NULL;
354 unsigned long flags;
355
356 spin_lock_irqsave(&tsk->sighand->siglock, flags);
357 if (tsk->signal)
358 tty = tty_kref_get(tsk->signal->tty);
359 spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
360 return tty;
361}
362
363static inline void audit_put_tty(struct tty_struct *tty)
364{
365 tty_kref_put(tty);
366}
367
350extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp); 368extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp);
351extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode); 369extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode);
352extern void __audit_bprm(struct linux_binprm *bprm); 370extern void __audit_bprm(struct linux_binprm *bprm);
@@ -504,6 +522,12 @@ static inline unsigned int audit_get_sessionid(struct task_struct *tsk)
504{ 522{
505 return -1; 523 return -1;
506} 524}
525static inline struct tty_struct *audit_get_tty(struct task_struct *tsk)
526{
527 return NULL;
528}
529static inline void audit_put_tty(struct tty_struct *tty)
530{ }
507static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp) 531static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
508{ } 532{ }
509static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, 533static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid,
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 3b09f235db66..17b247c94440 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -371,6 +371,7 @@ extern void proc_clear_tty(struct task_struct *p);
371extern struct tty_struct *get_current_tty(void); 371extern struct tty_struct *get_current_tty(void);
372/* tty_io.c */ 372/* tty_io.c */
373extern int __init tty_init(void); 373extern int __init tty_init(void);
374extern const char *tty_name(const struct tty_struct *tty);
374#else 375#else
375static inline void console_init(void) 376static inline void console_init(void)
376{ } 377{ }
@@ -391,6 +392,8 @@ static inline struct tty_struct *get_current_tty(void)
391/* tty_io.c */ 392/* tty_io.c */
392static inline int __init tty_init(void) 393static inline int __init tty_init(void)
393{ return 0; } 394{ return 0; }
395static inline const char *tty_name(const struct tty_struct *tty)
396{ return "(none)"; }
394#endif 397#endif
395 398
396extern struct ktermios tty_std_termios; 399extern struct ktermios tty_std_termios;
@@ -415,7 +418,6 @@ static inline struct tty_struct *tty_kref_get(struct tty_struct *tty)
415 return tty; 418 return tty;
416} 419}
417 420
418extern const char *tty_name(const struct tty_struct *tty);
419extern const char *tty_driver_name(const struct tty_struct *tty); 421extern const char *tty_driver_name(const struct tty_struct *tty);
420extern void tty_wait_until_sent(struct tty_struct *tty, long timeout); 422extern void tty_wait_until_sent(struct tty_struct *tty, long timeout);
421extern int __tty_check_change(struct tty_struct *tty, int sig); 423extern int __tty_check_change(struct tty_struct *tty, int sig);
diff --git a/kernel/audit.c b/kernel/audit.c
index 678c3f000191..22bb4f24f071 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -64,7 +64,6 @@
64#include <linux/security.h> 64#include <linux/security.h>
65#endif 65#endif
66#include <linux/freezer.h> 66#include <linux/freezer.h>
67#include <linux/tty.h>
68#include <linux/pid_namespace.h> 67#include <linux/pid_namespace.h>
69#include <net/netns/generic.h> 68#include <net/netns/generic.h>
70 69
@@ -430,7 +429,6 @@ restart:
430 attempts, audit_pid); 429 attempts, audit_pid);
431 set_current_state(TASK_INTERRUPTIBLE); 430 set_current_state(TASK_INTERRUPTIBLE);
432 schedule(); 431 schedule();
433 __set_current_state(TASK_RUNNING);
434 goto restart; 432 goto restart;
435 } 433 }
436 } 434 }
@@ -1341,15 +1339,14 @@ static inline void audit_get_stamp(struct audit_context *ctx,
1341static long wait_for_auditd(long sleep_time) 1339static long wait_for_auditd(long sleep_time)
1342{ 1340{
1343 DECLARE_WAITQUEUE(wait, current); 1341 DECLARE_WAITQUEUE(wait, current);
1344 set_current_state(TASK_UNINTERRUPTIBLE);
1345 add_wait_queue_exclusive(&audit_backlog_wait, &wait);
1346 1342
1347 if (audit_backlog_limit && 1343 if (audit_backlog_limit &&
1348 skb_queue_len(&audit_skb_queue) > audit_backlog_limit) 1344 skb_queue_len(&audit_skb_queue) > audit_backlog_limit) {
1345 add_wait_queue_exclusive(&audit_backlog_wait, &wait);
1346 set_current_state(TASK_UNINTERRUPTIBLE);
1349 sleep_time = schedule_timeout(sleep_time); 1347 sleep_time = schedule_timeout(sleep_time);
1350 1348 remove_wait_queue(&audit_backlog_wait, &wait);
1351 __set_current_state(TASK_RUNNING); 1349 }
1352 remove_wait_queue(&audit_backlog_wait, &wait);
1353 1350
1354 return sleep_time; 1351 return sleep_time;
1355} 1352}
@@ -1890,21 +1887,14 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
1890{ 1887{
1891 const struct cred *cred; 1888 const struct cred *cred;
1892 char comm[sizeof(tsk->comm)]; 1889 char comm[sizeof(tsk->comm)];
1893 char *tty; 1890 struct tty_struct *tty;
1894 1891
1895 if (!ab) 1892 if (!ab)
1896 return; 1893 return;
1897 1894
1898 /* tsk == current */ 1895 /* tsk == current */
1899 cred = current_cred(); 1896 cred = current_cred();
1900 1897 tty = audit_get_tty(tsk);
1901 spin_lock_irq(&tsk->sighand->siglock);
1902 if (tsk->signal && tsk->signal->tty && tsk->signal->tty->name)
1903 tty = tsk->signal->tty->name;
1904 else
1905 tty = "(none)";
1906 spin_unlock_irq(&tsk->sighand->siglock);
1907
1908 audit_log_format(ab, 1898 audit_log_format(ab,
1909 " ppid=%d pid=%d auid=%u uid=%u gid=%u" 1899 " ppid=%d pid=%d auid=%u uid=%u gid=%u"
1910 " euid=%u suid=%u fsuid=%u" 1900 " euid=%u suid=%u fsuid=%u"
@@ -1920,11 +1910,11 @@ void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk)
1920 from_kgid(&init_user_ns, cred->egid), 1910 from_kgid(&init_user_ns, cred->egid),
1921 from_kgid(&init_user_ns, cred->sgid), 1911 from_kgid(&init_user_ns, cred->sgid),
1922 from_kgid(&init_user_ns, cred->fsgid), 1912 from_kgid(&init_user_ns, cred->fsgid),
1923 tty, audit_get_sessionid(tsk)); 1913 tty ? tty_name(tty) : "(none)",
1924 1914 audit_get_sessionid(tsk));
1915 audit_put_tty(tty);
1925 audit_log_format(ab, " comm="); 1916 audit_log_format(ab, " comm=");
1926 audit_log_untrustedstring(ab, get_task_comm(comm, tsk)); 1917 audit_log_untrustedstring(ab, get_task_comm(comm, tsk));
1927
1928 audit_log_d_path_exe(ab, tsk->mm); 1918 audit_log_d_path_exe(ab, tsk->mm);
1929 audit_log_task_context(ab); 1919 audit_log_task_context(ab);
1930} 1920}
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
index 5efe9b299a12..25772476fa4a 100644
--- a/kernel/audit_tree.c
+++ b/kernel/audit_tree.c
@@ -661,10 +661,10 @@ static int tag_mount(struct vfsmount *mnt, void *arg)
661static int prune_tree_thread(void *unused) 661static int prune_tree_thread(void *unused)
662{ 662{
663 for (;;) { 663 for (;;) {
664 set_current_state(TASK_INTERRUPTIBLE); 664 if (list_empty(&prune_list)) {
665 if (list_empty(&prune_list)) 665 set_current_state(TASK_INTERRUPTIBLE);
666 schedule(); 666 schedule();
667 __set_current_state(TASK_RUNNING); 667 }
668 668
669 mutex_lock(&audit_cmd_mutex); 669 mutex_lock(&audit_cmd_mutex);
670 mutex_lock(&audit_filter_mutex); 670 mutex_lock(&audit_filter_mutex);
@@ -693,16 +693,14 @@ static int audit_launch_prune(void)
693{ 693{
694 if (prune_thread) 694 if (prune_thread)
695 return 0; 695 return 0;
696 prune_thread = kthread_create(prune_tree_thread, NULL, 696 prune_thread = kthread_run(prune_tree_thread, NULL,
697 "audit_prune_tree"); 697 "audit_prune_tree");
698 if (IS_ERR(prune_thread)) { 698 if (IS_ERR(prune_thread)) {
699 pr_err("cannot start thread audit_prune_tree"); 699 pr_err("cannot start thread audit_prune_tree");
700 prune_thread = NULL; 700 prune_thread = NULL;
701 return -ENOMEM; 701 return -ENOMEM;
702 } else {
703 wake_up_process(prune_thread);
704 return 0;
705 } 702 }
703 return 0;
706} 704}
707 705
708/* called with audit_filter_mutex */ 706/* called with audit_filter_mutex */
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index 7d0e3cf8abe1..62ab53d7619c 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -1980,6 +1980,7 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid,
1980{ 1980{
1981 struct audit_buffer *ab; 1981 struct audit_buffer *ab;
1982 uid_t uid, oldloginuid, loginuid; 1982 uid_t uid, oldloginuid, loginuid;
1983 struct tty_struct *tty;
1983 1984
1984 if (!audit_enabled) 1985 if (!audit_enabled)
1985 return; 1986 return;
@@ -1987,14 +1988,17 @@ static void audit_log_set_loginuid(kuid_t koldloginuid, kuid_t kloginuid,
1987 uid = from_kuid(&init_user_ns, task_uid(current)); 1988 uid = from_kuid(&init_user_ns, task_uid(current));
1988 oldloginuid = from_kuid(&init_user_ns, koldloginuid); 1989 oldloginuid = from_kuid(&init_user_ns, koldloginuid);
1989 loginuid = from_kuid(&init_user_ns, kloginuid), 1990 loginuid = from_kuid(&init_user_ns, kloginuid),
1991 tty = audit_get_tty(current);
1990 1992
1991 ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN); 1993 ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_LOGIN);
1992 if (!ab) 1994 if (!ab)
1993 return; 1995 return;
1994 audit_log_format(ab, "pid=%d uid=%u", task_pid_nr(current), uid); 1996 audit_log_format(ab, "pid=%d uid=%u", task_pid_nr(current), uid);
1995 audit_log_task_context(ab); 1997 audit_log_task_context(ab);
1996 audit_log_format(ab, " old-auid=%u auid=%u old-ses=%u ses=%u res=%d", 1998 audit_log_format(ab, " old-auid=%u auid=%u tty=%s old-ses=%u ses=%u res=%d",
1997 oldloginuid, loginuid, oldsessionid, sessionid, !rc); 1999 oldloginuid, loginuid, tty ? tty_name(tty) : "(none)",
2000 oldsessionid, sessionid, !rc);
2001 audit_put_tty(tty);
1998 audit_log_end(ab); 2002 audit_log_end(ab);
1999} 2003}
2000 2004