diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-02-12 21:22:20 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-05-17 00:27:08 +0000 |
| commit | fa211f1c51abbeb5e99b10ded520b15a5f2727b8 (patch) | |
| tree | 704ad6310b9ce66b6a903c5cd0d71ad50eeea855 /vrrpd/vrrp_packet.c | |
| parent | 9e006c64eb4c687cfd15a2d0765943b7ea624142 (diff) | |
vrrpd: properly retrieve pkt src address
* Fix null dereference when retrieving IPv6 source address
* Change IPv4 code path to use system-specified source address instead
of the one delivered in the IPv4 raw header
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'vrrpd/vrrp_packet.c')
| -rw-r--r-- | vrrpd/vrrp_packet.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/vrrpd/vrrp_packet.c b/vrrpd/vrrp_packet.c index 16613226dd..db31d163bc 100644 --- a/vrrpd/vrrp_packet.c +++ b/vrrpd/vrrp_packet.c @@ -226,8 +226,9 @@ ssize_t vrrp_pkt_parse_datagram(int family, int version, struct msghdr *m, VRRP_PKT_VCHECK(pktsize > 0, "IPv4 packet has no payload"); /* Extract source address */ + struct sockaddr_in *sa = m->msg_name; src->ipa_type = IPADDR_V4; - src->ipaddr_v4 = ip->ip_src; + src->ipaddr_v4 = sa->sin_addr; } else if (family == AF_INET6) { struct cmsghdr *c; for (c = CMSG_FIRSTHDR(m); c != NULL; CMSG_NXTHDR(m, c)) { @@ -247,8 +248,8 @@ ssize_t vrrp_pkt_parse_datagram(int family, int version, struct msghdr *m, pktsize = read; /* Extract source address */ - src->ipa_type = IPADDR_V6; struct sockaddr_in6 *sa = m->msg_name; + src->ipa_type = IPADDR_V6; memcpy(&src->ipaddr_v6, &sa->sin6_addr, sizeof(struct in6_addr)); } else { |
