summaryrefslogtreecommitdiff
path: root/vrrpd/vrrp_packet.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2019-02-12 21:22:20 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-05-17 00:27:08 +0000
commitfa211f1c51abbeb5e99b10ded520b15a5f2727b8 (patch)
tree704ad6310b9ce66b6a903c5cd0d71ad50eeea855 /vrrpd/vrrp_packet.c
parent9e006c64eb4c687cfd15a2d0765943b7ea624142 (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.c5
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 {