diff options
-rw-r--r-- | init/Kconfig | 1 | ||||
-rw-r--r-- | net/netfilter/nfnetlink_log.c | 14 |
2 files changed, 10 insertions, 5 deletions
diff --git a/init/Kconfig b/init/Kconfig index 07435e0c3a4b..2660b312ae9d 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -947,7 +947,6 @@ config UIDGID_CONVERTED | |||
947 | depends on NETFILTER_XT_MATCH_OWNER = n | 947 | depends on NETFILTER_XT_MATCH_OWNER = n |
948 | depends on NETFILTER_XT_MATCH_RECENT = n | 948 | depends on NETFILTER_XT_MATCH_RECENT = n |
949 | depends on NETFILTER_XT_TARGET_LOG = n | 949 | depends on NETFILTER_XT_TARGET_LOG = n |
950 | depends on NETFILTER_NETLINK_LOG = n | ||
951 | depends on AF_RXRPC = n | 950 | depends on AF_RXRPC = n |
952 | depends on NET_KEY = n | 951 | depends on NET_KEY = n |
953 | depends on DNS_RESOLVER = n | 952 | depends on DNS_RESOLVER = n |
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 169ab59ed9d4..4142aac17c3c 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
@@ -55,6 +55,7 @@ struct nfulnl_instance { | |||
55 | unsigned int qlen; /* number of nlmsgs in skb */ | 55 | unsigned int qlen; /* number of nlmsgs in skb */ |
56 | struct sk_buff *skb; /* pre-allocatd skb */ | 56 | struct sk_buff *skb; /* pre-allocatd skb */ |
57 | struct timer_list timer; | 57 | struct timer_list timer; |
58 | struct user_namespace *peer_user_ns; /* User namespace of the peer process */ | ||
58 | int peer_pid; /* PID of the peer process */ | 59 | int peer_pid; /* PID of the peer process */ |
59 | 60 | ||
60 | /* configurable parameters */ | 61 | /* configurable parameters */ |
@@ -132,7 +133,7 @@ instance_put(struct nfulnl_instance *inst) | |||
132 | static void nfulnl_timer(unsigned long data); | 133 | static void nfulnl_timer(unsigned long data); |
133 | 134 | ||
134 | static struct nfulnl_instance * | 135 | static struct nfulnl_instance * |
135 | instance_create(u_int16_t group_num, int pid) | 136 | instance_create(u_int16_t group_num, int pid, struct user_namespace *user_ns) |
136 | { | 137 | { |
137 | struct nfulnl_instance *inst; | 138 | struct nfulnl_instance *inst; |
138 | int err; | 139 | int err; |
@@ -162,6 +163,7 @@ instance_create(u_int16_t group_num, int pid) | |||
162 | 163 | ||
163 | setup_timer(&inst->timer, nfulnl_timer, (unsigned long)inst); | 164 | setup_timer(&inst->timer, nfulnl_timer, (unsigned long)inst); |
164 | 165 | ||
166 | inst->peer_user_ns = user_ns; | ||
165 | inst->peer_pid = pid; | 167 | inst->peer_pid = pid; |
166 | inst->group_num = group_num; | 168 | inst->group_num = group_num; |
167 | 169 | ||
@@ -503,8 +505,11 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
503 | read_lock_bh(&skb->sk->sk_callback_lock); | 505 | read_lock_bh(&skb->sk->sk_callback_lock); |
504 | if (skb->sk->sk_socket && skb->sk->sk_socket->file) { | 506 | if (skb->sk->sk_socket && skb->sk->sk_socket->file) { |
505 | struct file *file = skb->sk->sk_socket->file; | 507 | struct file *file = skb->sk->sk_socket->file; |
506 | __be32 uid = htonl(file->f_cred->fsuid); | 508 | __be32 uid = htonl(from_kuid_munged(inst->peer_user_ns, |
507 | __be32 gid = htonl(file->f_cred->fsgid); | 509 | file->f_cred->fsuid)); |
510 | __be32 gid = htonl(from_kgid_munged(inst->peer_user_ns, | ||
511 | file->f_cred->fsgid)); | ||
512 | /* need to unlock here since NLA_PUT may goto */ | ||
508 | read_unlock_bh(&skb->sk->sk_callback_lock); | 513 | read_unlock_bh(&skb->sk->sk_callback_lock); |
509 | if (nla_put_be32(inst->skb, NFULA_UID, uid) || | 514 | if (nla_put_be32(inst->skb, NFULA_UID, uid) || |
510 | nla_put_be32(inst->skb, NFULA_GID, gid)) | 515 | nla_put_be32(inst->skb, NFULA_GID, gid)) |
@@ -783,7 +788,8 @@ nfulnl_recv_config(struct sock *ctnl, struct sk_buff *skb, | |||
783 | } | 788 | } |
784 | 789 | ||
785 | inst = instance_create(group_num, | 790 | inst = instance_create(group_num, |
786 | NETLINK_CB(skb).pid); | 791 | NETLINK_CB(skb).pid, |
792 | sk_user_ns(NETLINK_CB(skb).ssk)); | ||
787 | if (IS_ERR(inst)) { | 793 | if (IS_ERR(inst)) { |
788 | ret = PTR_ERR(inst); | 794 | ret = PTR_ERR(inst); |
789 | goto out; | 795 | goto out; |