summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/uapi/linux/audit.h1
-rw-r--r--kernel/audit.c16
2 files changed, 16 insertions, 1 deletions
diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h
index 843540c398eb..d820aa979620 100644
--- a/include/uapi/linux/audit.h
+++ b/include/uapi/linux/audit.h
@@ -110,6 +110,7 @@
110#define AUDIT_SECCOMP 1326 /* Secure Computing event */ 110#define AUDIT_SECCOMP 1326 /* Secure Computing event */
111#define AUDIT_PROCTITLE 1327 /* Proctitle emit event */ 111#define AUDIT_PROCTITLE 1327 /* Proctitle emit event */
112#define AUDIT_FEATURE_CHANGE 1328 /* audit log listing feature changes */ 112#define AUDIT_FEATURE_CHANGE 1328 /* audit log listing feature changes */
113#define AUDIT_REPLACE 1329 /* Replace auditd if this packet unanswerd */
113 114
114#define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ 115#define AUDIT_AVC 1400 /* SE Linux avc denial or grant */
115#define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ 116#define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */
diff --git a/kernel/audit.c b/kernel/audit.c
index d6dd95cc59e6..2fd63d6879c5 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -809,6 +809,16 @@ static int audit_set_feature(struct sk_buff *skb)
809 return 0; 809 return 0;
810} 810}
811 811
812static int audit_replace(pid_t pid)
813{
814 struct sk_buff *skb = audit_make_reply(0, 0, AUDIT_REPLACE, 0, 0,
815 &pid, sizeof(pid));
816
817 if (!skb)
818 return -ENOMEM;
819 return netlink_unicast(audit_sock, skb, audit_nlk_portid, 0);
820}
821
812static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 822static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
813{ 823{
814 u32 seq; 824 u32 seq;
@@ -870,9 +880,13 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
870 } 880 }
871 if (s.mask & AUDIT_STATUS_PID) { 881 if (s.mask & AUDIT_STATUS_PID) {
872 int new_pid = s.pid; 882 int new_pid = s.pid;
883 pid_t requesting_pid = task_tgid_vnr(current);
873 884
874 if ((!new_pid) && (task_tgid_vnr(current) != audit_pid)) 885 if ((!new_pid) && (requesting_pid != audit_pid))
875 return -EACCES; 886 return -EACCES;
887 if (audit_pid && new_pid &&
888 audit_replace(requesting_pid) != -ECONNREFUSED)
889 return -EEXIST;
876 if (audit_enabled != AUDIT_OFF) 890 if (audit_enabled != AUDIT_OFF)
877 audit_log_config_change("audit_pid", new_pid, audit_pid, 1); 891 audit_log_config_change("audit_pid", new_pid, audit_pid, 1);
878 audit_pid = new_pid; 892 audit_pid = new_pid;