diff options
| author | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2019-01-17 11:09:09 -0200 | 
|---|---|---|
| committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2019-01-22 09:33:37 -0200 | 
| commit | 0413dd7573f917fec9faa0886247d15555c98c7b (patch) | |
| tree | 16eaff8fdf668c18cf191e2dfe150bdb3bc89517 /zebra/rt_socket.c | |
| parent | 62b6a7e149fa35d0edbece65bf21c7d13e0c78cd (diff) | |
zebra: use proper sockaddr size in kernel_rtm
`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)
Diffstat (limited to 'zebra/rt_socket.c')
| -rw-r--r-- | zebra/rt_socket.c | 42 | 
1 files changed, 24 insertions, 18 deletions
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c index 8012498e80..b27171a00f 100644 --- a/zebra/rt_socket.c +++ b/zebra/rt_socket.c @@ -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;  		}  | 
