Subject: Re: [PATCH v2] IPv6: fix bug when specifying the non-exist outgoing interface

From: Shan Wei <[email-masked]>
Date: Mon, 02 Jun 2008 16:59:08 +0800

When specifying the outgoing interface with sendmsg, if the ipi6_addr is 
the unspecified address and the ipi6_ifindex is the not-exist interface, 
it should be fail and the errno should be set ENODEV.
  Actually, it does well(sendmsg returns on success ), because the kernel 
don't check the interface。

 The patch is against 2.6.26-rc4.

Signed-off-by: Shan Wei<[email-masked]>

---
 net/ipv6/datagram.c |   24 +++++++++++++++---------
 1 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index 94fa6ae..47b85cc 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -534,20 +534,26 @@ int datagram_send_ctl(struct msghdr *msg, struct
flowi *fl,
                     return -EINVAL;
                 fl->oif = src_info->ipi6_ifindex;
             }
+           
+            if (fl->oif) {
+                dev = dev_get_by_index(&init_net, fl->oif);
+                if (!dev)
+                    return -ENODEV;
+            }
 
             addr_type = ipv6_addr_type(&src_info->ipi6_addr);
 
-            if (addr_type == IPV6_ADDR_ANY)
+            if (addr_type == IPV6_ADDR_ANY) {
+                if (dev)
+                    dev_put(dev);
                 break;
+            }
 
-            if (addr_type & IPV6_ADDR_LINKLOCAL) {
-                if (!src_info->ipi6_ifindex)
-                    return -EINVAL;
-                else {
-                    dev = dev_get_by_index(&init_net,
src_info->ipi6_ifindex);
-                    if (!dev)
-                        return -ENODEV;
-                }
+            if ((addr_type & IPV6_ADDR_LINKLOCAL) &&
+                !src_info->ipi6_ifindex) {
+                if (dev)
+                    dev_put(dev);
+                return -EINVAL;
             }
             if (!ipv6_chk_addr(&init_net, &src_info->ipi6_addr,
                        dev, 0)) {
-- 
1.5.4.4