[IPV6] ROUTE: Make sure we do not exceed args in fib6_lookup_1().
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Thu, 24 Aug 2006 00:21:29 +0000 (17:21 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Fri, 22 Sep 2006 21:55:49 +0000 (14:55 -0700)
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Acked-by: Ville Nuorvala <vnuorval@tcs.hut.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6_fib.c

index 5408b64f3b5fa8c799ddea68080f713cee0fd6a3..19ee7375daa9dfa212f91290d86e558fa9b602dc 100644 (file)
@@ -829,6 +829,9 @@ static struct fib6_node * fib6_lookup_1(struct fib6_node *root,
        struct fib6_node *fn;
        int dir;
 
+       if (unlikely(args->offset == 0))
+               return NULL;
+
        /*
         *      Descend on a tree
         */
@@ -879,16 +882,22 @@ static struct fib6_node * fib6_lookup_1(struct fib6_node *root,
 struct fib6_node * fib6_lookup(struct fib6_node *root, struct in6_addr *daddr,
                               struct in6_addr *saddr)
 {
-       struct lookup_args args[2];
        struct fib6_node *fn;
-
-       args[0].offset = offsetof(struct rt6_info, rt6i_dst);
-       args[0].addr = daddr;
-
+       struct lookup_args args[] = {
+               {
+                       .offset = offsetof(struct rt6_info, rt6i_dst),
+                       .addr = daddr,
+               },
 #ifdef CONFIG_IPV6_SUBTREES
-       args[1].offset = offsetof(struct rt6_info, rt6i_src);
-       args[1].addr = saddr;
+               {
+                       .offset = offsetof(struct rt6_info, rt6i_src),
+                       .addr = saddr,
+               },
 #endif
+               {
+                       .offset = 0,    /* sentinel */
+               }
+       };
 
        fn = fib6_lookup_1(root, args);