aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/auditfilter.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2014-02-28 20:36:55 -0800
committerEric Paris <eparis@redhat.com>2014-03-20 10:11:02 -0400
commit099dd235113700bbb476e572cd191ddb77b9af46 (patch)
tree7f8137af9685dbe6c2ddbd686feaf13808ab7d2c /kernel/auditfilter.c
parentaudit: Use struct net not pid_t to remember the network namespce to reply in (diff)
downloadlinux-dev-099dd235113700bbb476e572cd191ddb77b9af46.tar.xz
linux-dev-099dd235113700bbb476e572cd191ddb77b9af46.zip
audit: Send replies in the proper network namespace.
In perverse cases of file descriptor passing the current network namespace of a process and the network namespace of a socket used by that socket may differ. Therefore use the network namespace of the appropiate socket to ensure replies always go to the appropiate socket. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Acked-by: Richard Guy Briggs <rgb@redhat.com> Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'kernel/auditfilter.c')
-rw-r--r--kernel/auditfilter.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
index a0d470131fd0..549bbb6e6597 100644
--- a/kernel/auditfilter.c
+++ b/kernel/auditfilter.c
@@ -32,6 +32,7 @@
#include <linux/slab.h>
#include <linux/security.h>
#include <net/net_namespace.h>
+#include <net/sock.h>
#include "audit.h"
/*
@@ -1071,8 +1072,10 @@ int audit_rule_change(int type, __u32 portid, int seq, void *data,
* @portid: target portid for netlink audit messages
* @seq: netlink audit message sequence (serial) number
*/
-int audit_list_rules_send(__u32 portid, int seq)
+int audit_list_rules_send(struct sk_buff *request_skb, int seq)
{
+ u32 portid = NETLINK_CB(request_skb).portid;
+ struct net *net = sock_net(NETLINK_CB(request_skb).sk);
struct task_struct *tsk;
struct audit_netlink_list *dest;
int err = 0;
@@ -1086,7 +1089,7 @@ int audit_list_rules_send(__u32 portid, int seq)
dest = kmalloc(sizeof(struct audit_netlink_list), GFP_KERNEL);
if (!dest)
return -ENOMEM;
- dest->net = get_net(current->nsproxy->net_ns);
+ dest->net = get_net(net);
dest->portid = portid;
skb_queue_head_init(&dest->q);