|
@@ -361,13 +361,20 @@ struct sock *inet_diag_find_one_icsk(struct net *net,
|
|
|
req->id.idiag_dport, req->id.idiag_src[0],
|
|
|
req->id.idiag_sport, req->id.idiag_if);
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
- else if (req->sdiag_family == AF_INET6)
|
|
|
- sk = inet6_lookup(net, hashinfo,
|
|
|
- (struct in6_addr *)req->id.idiag_dst,
|
|
|
- req->id.idiag_dport,
|
|
|
- (struct in6_addr *)req->id.idiag_src,
|
|
|
- req->id.idiag_sport,
|
|
|
- req->id.idiag_if);
|
|
|
+ else if (req->sdiag_family == AF_INET6) {
|
|
|
+ if (ipv6_addr_v4mapped((struct in6_addr *)req->id.idiag_dst) &&
|
|
|
+ ipv6_addr_v4mapped((struct in6_addr *)req->id.idiag_src))
|
|
|
+ sk = inet_lookup(net, hashinfo, req->id.idiag_dst[3],
|
|
|
+ req->id.idiag_dport, req->id.idiag_src[3],
|
|
|
+ req->id.idiag_sport, req->id.idiag_if);
|
|
|
+ else
|
|
|
+ sk = inet6_lookup(net, hashinfo,
|
|
|
+ (struct in6_addr *)req->id.idiag_dst,
|
|
|
+ req->id.idiag_dport,
|
|
|
+ (struct in6_addr *)req->id.idiag_src,
|
|
|
+ req->id.idiag_sport,
|
|
|
+ req->id.idiag_if);
|
|
|
+ }
|
|
|
#endif
|
|
|
else
|
|
|
return ERR_PTR(-EINVAL);
|