|
@@ -297,6 +297,31 @@ nfqnl_put_packet_info(struct sk_buff *nlskb, struct sk_buff *packet,
|
|
return flags ? nla_put_be32(nlskb, NFQA_SKB_INFO, htonl(flags)) : 0;
|
|
return flags ? nla_put_be32(nlskb, NFQA_SKB_INFO, htonl(flags)) : 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int nfqnl_put_sk_uidgid(struct sk_buff *skb, struct sock *sk)
|
|
|
|
+{
|
|
|
|
+ const struct cred *cred;
|
|
|
|
+
|
|
|
|
+ if (sk->sk_state == TCP_TIME_WAIT)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ read_lock_bh(&sk->sk_callback_lock);
|
|
|
|
+ if (sk->sk_socket && sk->sk_socket->file) {
|
|
|
|
+ cred = sk->sk_socket->file->f_cred;
|
|
|
|
+ if (nla_put_be32(skb, NFQA_UID,
|
|
|
|
+ htonl(from_kuid_munged(&init_user_ns, cred->fsuid))))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+ if (nla_put_be32(skb, NFQA_GID,
|
|
|
|
+ htonl(from_kgid_munged(&init_user_ns, cred->fsgid))))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+ }
|
|
|
|
+ read_unlock_bh(&sk->sk_callback_lock);
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+nla_put_failure:
|
|
|
|
+ read_unlock_bh(&sk->sk_callback_lock);
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
static struct sk_buff *
|
|
static struct sk_buff *
|
|
nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
|
|
nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
|
|
struct nf_queue_entry *entry,
|
|
struct nf_queue_entry *entry,
|
|
@@ -372,6 +397,11 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
|
|
if (queue->flags & NFQA_CFG_F_CONNTRACK)
|
|
if (queue->flags & NFQA_CFG_F_CONNTRACK)
|
|
ct = nfqnl_ct_get(entskb, &size, &ctinfo);
|
|
ct = nfqnl_ct_get(entskb, &size, &ctinfo);
|
|
|
|
|
|
|
|
+ if (queue->flags & NFQA_CFG_F_UID_GID) {
|
|
|
|
+ size += (nla_total_size(sizeof(u_int32_t)) /* uid */
|
|
|
|
+ + nla_total_size(sizeof(u_int32_t))); /* gid */
|
|
|
|
+ }
|
|
|
|
+
|
|
skb = nfnetlink_alloc_skb(net, size, queue->peer_portid,
|
|
skb = nfnetlink_alloc_skb(net, size, queue->peer_portid,
|
|
GFP_ATOMIC);
|
|
GFP_ATOMIC);
|
|
if (!skb)
|
|
if (!skb)
|
|
@@ -484,6 +514,10 @@ nfqnl_build_packet_message(struct net *net, struct nfqnl_instance *queue,
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if ((queue->flags & NFQA_CFG_F_UID_GID) && entskb->sk &&
|
|
|
|
+ nfqnl_put_sk_uidgid(skb, entskb->sk) < 0)
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
if (ct && nfqnl_ct_put(skb, ct, ctinfo) < 0)
|
|
if (ct && nfqnl_ct_put(skb, ct, ctinfo) < 0)
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|