]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: use proper sockaddr size in kernel_rtm
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Thu, 17 Jan 2019 13:09:09 +0000 (11:09 -0200)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Tue, 22 Jan 2019 11:33:37 +0000 (09:33 -0200)
`sockaddr` `len` field is the address type size and not the mask length.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit a6c000318226b9c3e5c3010ea31c6941ac1dff43)

zebra/rt_socket.c

index 8012498e80893f1379e65c1a91f5a1ca38681d49..b27171a00f43d447a0241fc3a180875d3655a291 100644 (file)
@@ -155,23 +155,21 @@ static int kernel_rtm(int cmd, const struct prefix *p,
        switch (p->family) {
        case AF_INET:
                sin_dest.sin.sin_family = AF_INET;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-               sin_dest.sin.sin_len = sizeof(sin_dest);
-               sin_gate.sin.sin_len = sizeof(sin_gate);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
                sin_dest.sin.sin_addr = p->u.prefix4;
                sin_gate.sin.sin_family = AF_INET;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+               sin_dest.sin.sin_len = sizeof(struct sockaddr_in);
+               sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                break;
        case AF_INET6:
                sin_dest.sin6.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
-               sin_dest.sin6.sin6_len = sizeof(sin_dest);
-#endif /* SIN6_LEN */
                sin_dest.sin6.sin6_addr = p->u.prefix6;
                sin_gate.sin6.sin6_family = AF_INET6;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-               sin_gate.sin6.sin6_len = sizeof(sin_gate);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+               sin_dest.sin6.sin6_len = sizeof(struct sockaddr_in6);
+               sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                break;
        }
 
@@ -193,6 +191,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
                case NEXTHOP_TYPE_IPV4_IFINDEX:
                        sin_gate.sin.sin_addr = nexthop->gate.ipv4;
                        sin_gate.sin.sin_family = AF_INET;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+                       sin_gate.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                        ifindex = nexthop->ifindex;
                        gate = true;
                        break;
@@ -200,6 +201,9 @@ static int kernel_rtm(int cmd, const struct prefix *p,
                case NEXTHOP_TYPE_IPV6_IFINDEX:
                        sin_gate.sin6.sin6_addr = nexthop->gate.ipv6;
                        sin_gate.sin6.sin6_family = AF_INET6;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+                       sin_gate.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                        ifindex = nexthop->ifindex;
 /* Under kame set interface index to link local address */
 #ifdef KAME
@@ -228,6 +232,10 @@ static int kernel_rtm(int cmd, const struct prefix *p,
                                struct in_addr loopback;
                                loopback.s_addr = htonl(INADDR_LOOPBACK);
                                sin_gate.sin.sin_addr = loopback;
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+                               sin_gate.sin.sin_len =
+                                       sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                                gate = true;
                        }
                                break;
@@ -240,18 +248,16 @@ static int kernel_rtm(int cmd, const struct prefix *p,
                case AF_INET:
                        masklen2ip(p->prefixlen, &sin_mask.sin.sin_addr);
                        sin_mask.sin.sin_family = AF_INET;
-#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
-                       sin_mask.sin.sin_len = sin_masklen(
-                               sin_mask.sin.sin_addr);
-#endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+                       sin_mask.sin.sin_len = sizeof(struct sockaddr_in);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                        break;
                case AF_INET6:
                        masklen2ip6(p->prefixlen, &sin_mask.sin6.sin6_addr);
                        sin_mask.sin6.sin6_family = AF_INET6;
-#ifdef SIN6_LEN
-                       sin_mask.sin6.sin6_len = sin6_masklen(
-                               sin_mask.sin6.sin6_addr);
-#endif /* SIN6_LEN */
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+                       sin_mask.sin6.sin6_len = sizeof(struct sockaddr_in6);
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
                        break;
                }