lsm,selinux: pass flowi_common instead of flowi to the LSM hooks
[ Upstream commit 3df98d79215ace13d1e91ddfc5a67a0f5acbd83f ] As pointed out by Herbert in a recent related patch, the LSM hooks do not have the necessary address family information to use the flowi struct safely. As none of the LSMs currently use any of the protocol specific flowi information, replace the flowi pointers with pointers to the address family independent flowi_common struct. Reported-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: James Morris <jamorris@linux.microsoft.com> Signed-off-by: Paul Moore <paul@paul-moore.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committato da
Greg Kroah-Hartman

parent
a67a1661cf
commit
6950ee32c1
@@ -819,7 +819,7 @@ int inet6_sk_rebuild_header(struct sock *sk)
|
||||
fl6.fl6_dport = inet->inet_dport;
|
||||
fl6.fl6_sport = inet->inet_sport;
|
||||
fl6.flowi6_uid = sk->sk_uid;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt),
|
||||
|
@@ -60,7 +60,7 @@ static void ip6_datagram_flow_key_init(struct flowi6 *fl6, struct sock *sk)
|
||||
if (!fl6->flowi6_oif && ipv6_addr_is_multicast(&fl6->daddr))
|
||||
fl6->flowi6_oif = np->mcast_oif;
|
||||
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6));
|
||||
}
|
||||
|
||||
int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr)
|
||||
|
@@ -573,7 +573,7 @@ void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
|
||||
fl6.fl6_icmp_code = code;
|
||||
fl6.flowi6_uid = sock_net_uid(net, NULL);
|
||||
fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, NULL);
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
np = inet6_sk(sk);
|
||||
|
||||
@@ -755,7 +755,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
|
||||
fl6.fl6_icmp_type = ICMPV6_ECHO_REPLY;
|
||||
fl6.flowi6_mark = mark;
|
||||
fl6.flowi6_uid = sock_net_uid(net, NULL);
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
local_bh_disable();
|
||||
sk = icmpv6_xmit_lock(net);
|
||||
@@ -1008,7 +1008,7 @@ void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6,
|
||||
fl6->fl6_icmp_type = type;
|
||||
fl6->fl6_icmp_code = 0;
|
||||
fl6->flowi6_oif = oif;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6));
|
||||
}
|
||||
|
||||
static void __net_exit icmpv6_sk_exit(struct net *net)
|
||||
|
@@ -46,7 +46,7 @@ struct dst_entry *inet6_csk_route_req(const struct sock *sk,
|
||||
fl6->fl6_dport = ireq->ir_rmt_port;
|
||||
fl6->fl6_sport = htons(ireq->ir_num);
|
||||
fl6->flowi6_uid = sk->sk_uid;
|
||||
security_req_classify_flow(req, flowi6_to_flowi(fl6));
|
||||
security_req_classify_flow(req, flowi6_to_flowi_common(fl6));
|
||||
|
||||
dst = ip6_dst_lookup_flow(sock_net(sk), sk, fl6, final_p);
|
||||
if (IS_ERR(dst))
|
||||
@@ -95,7 +95,7 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
|
||||
fl6->fl6_sport = inet->inet_sport;
|
||||
fl6->fl6_dport = inet->inet_dport;
|
||||
fl6->flowi6_uid = sk->sk_uid;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6));
|
||||
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final);
|
||||
|
@@ -179,7 +179,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook)
|
||||
|
||||
fl6.flowi6_oif = l3mdev_master_ifindex(skb_dst(oldskb)->dev);
|
||||
fl6.flowi6_mark = IP6_REPLY_MARK(net, oldskb->mark);
|
||||
security_skb_classify_flow(oldskb, flowi6_to_flowi(&fl6));
|
||||
security_skb_classify_flow(oldskb, flowi6_to_flowi_common(&fl6));
|
||||
dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (dst->error) {
|
||||
dst_release(dst);
|
||||
|
@@ -111,7 +111,7 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
||||
fl6.flowi6_uid = sk->sk_uid;
|
||||
fl6.fl6_icmp_type = user_icmph.icmp6_type;
|
||||
fl6.fl6_icmp_code = user_icmph.icmp6_code;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
ipcm6_init_sk(&ipc6, np);
|
||||
ipc6.sockc.mark = sk->sk_mark;
|
||||
|
@@ -915,7 +915,7 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
||||
fl6.flowi6_oif = np->mcast_oif;
|
||||
else if (!fl6.flowi6_oif)
|
||||
fl6.flowi6_oif = np->ucast_oif;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
if (hdrincl)
|
||||
fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH;
|
||||
|
@@ -234,7 +234,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)
|
||||
fl6.fl6_dport = ireq->ir_rmt_port;
|
||||
fl6.fl6_sport = inet_sk(sk)->inet_sport;
|
||||
fl6.flowi6_uid = sk->sk_uid;
|
||||
security_req_classify_flow(req, flowi6_to_flowi(&fl6));
|
||||
security_req_classify_flow(req, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
|
||||
if (IS_ERR(dst))
|
||||
|
@@ -278,7 +278,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
||||
opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));
|
||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
|
||||
if (IS_ERR(dst)) {
|
||||
@@ -975,7 +975,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
|
||||
fl6.fl6_dport = t1->dest;
|
||||
fl6.fl6_sport = t1->source;
|
||||
fl6.flowi6_uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));
|
||||
security_skb_classify_flow(skb, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
/* Pass a socket to ip6_dst_lookup either it is for RST
|
||||
* Underlying function will use this to retrieve the network
|
||||
|
@@ -1497,7 +1497,7 @@ do_udp_sendmsg:
|
||||
} else if (!fl6.flowi6_oif)
|
||||
fl6.flowi6_oif = np->ucast_oif;
|
||||
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
|
||||
|
||||
if (ipc6.tclass < 0)
|
||||
ipc6.tclass = np->tclass;
|
||||
|
Fai riferimento in un nuovo problema
Block a user