]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: ping6: Fix ping -6 with interface name
authorAya Levin <ayal@nvidia.com>
Tue, 31 May 2022 08:45:44 +0000 (11:45 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Wed, 1 Jun 2022 10:44:42 +0000 (12:44 +0200)
When passing interface parameter to ping -6:
$ ping -6 ::11:141:84:9 -I eth2
Results in:
PING ::11:141:84:10(::11:141:84:10) from ::11:141:84:9 eth2: 56 data bytes
ping: sendmsg: Invalid argument
ping: sendmsg: Invalid argument

Initialize the fl6's outgoing interface (OIF) before triggering
ip6_datagram_send_ctl. Don't wipe fl6 after ip6_datagram_send_ctl() as
changes in fl6 that may happen in the function are overwritten explicitly.
Update comment accordingly.

Fixes: 94a2073fbf88 ("net: ping6: support setting basic SOL_IPV6 options via cmsg")
Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://lore.kernel.org/r/20220531084544.15126-1-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv6/ping.c

index ff033d16549e93ff824fae73db840bd0f0bbbf0c..ecf3a553a0dc46f361cc0429e816412efde7ee25 100644 (file)
@@ -101,6 +101,9 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        ipc6.sockc.tsflags = sk->sk_tsflags;
        ipc6.sockc.mark = sk->sk_mark;
 
+       memset(&fl6, 0, sizeof(fl6));
+       fl6.flowi6_oif = oif;
+
        if (msg->msg_controllen) {
                struct ipv6_txoptions opt = {};
 
@@ -112,17 +115,14 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                        return err;
 
                /* Changes to txoptions and flow info are not implemented, yet.
-                * Drop the options, fl6 is wiped below.
+                * Drop the options.
                 */
                ipc6.opt = NULL;
        }
 
-       memset(&fl6, 0, sizeof(fl6));
-
        fl6.flowi6_proto = IPPROTO_ICMPV6;
        fl6.saddr = np->saddr;
        fl6.daddr = *daddr;
-       fl6.flowi6_oif = oif;
        fl6.flowi6_mark = ipc6.sockc.mark;
        fl6.flowi6_uid = sk->sk_uid;
        fl6.fl6_icmp_type = user_icmph.icmp6_type;