Parsing fixes.
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index 6ad521c..03cf3cd 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -288,7 +288,8 @@
uint16_t checksum;
int i;
- group_addr = *(struct in_addr *)(igmp_msg + 4);
+ //group_addr = *(struct in_addr *)(igmp_msg + 4);
+ memcpy(&group_addr, igmp_msg + 4, sizeof(struct in_addr));
ifp = igmp->interface;
pim_ifp = ifp->info;
@@ -421,8 +422,12 @@
/* Scan sources in query and lower their timers to LMQT */
struct in_addr *sources = (struct in_addr *)(igmp_msg + IGMP_V3_SOURCES_OFFSET);
for (i = 0; i < recv_num_sources; ++i) {
- struct in_addr src_addr = sources[i];
- struct igmp_source *src = igmp_find_source_by_addr(group, src_addr);
+ //struct in_addr src_addr = sources[i];
+ //struct igmp_source *src = igmp_find_source_by_addr(group, src_addr);
+ struct in_addr src_addr;
+ struct igmp_source *src;
+ memcpy(&src_addr, sources + i, sizeof(struct in_addr));
+ src = igmp_find_source_by_addr(group, src_addr);
if (src) {
igmp_source_timer_lower_to_lmqt(src);
}
@@ -506,7 +511,8 @@
rec_auxdatalen = group_record[IGMP_V3_GROUP_RECORD_AUXDATALEN_OFFSET];
rec_num_sources = ntohs(* (uint16_t *) (group_record + IGMP_V3_GROUP_RECORD_NUMSOURCES_OFFSET));
- rec_group = *(struct in_addr *)(group_record + IGMP_V3_GROUP_RECORD_GROUP_OFFSET);
+ //rec_group = *(struct in_addr *)(group_record + IGMP_V3_GROUP_RECORD_GROUP_OFFSET);
+ memcpy(&rec_group, group_record + IGMP_V3_GROUP_RECORD_GROUP_OFFSET, sizeof(struct in_addr));
if (PIM_DEBUG_IGMP_PACKETS) {
zlog_debug("Recv IGMP report v3 from %s on %s: record=%d type=%d auxdatalen=%d sources=%d group=%s",
@@ -599,7 +605,8 @@
__FILE__, __PRETTY_FUNCTION__);
}
- group_addr = *(struct in_addr *)(igmp_msg + 4);
+ //group_addr = *(struct in_addr *)(igmp_msg + 4);
+ memcpy(&group_addr, igmp_msg + 4, sizeof(struct in_addr));
/* non-existant group is created as INCLUDE {empty} */
group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);
@@ -655,7 +662,8 @@
__FILE__, __PRETTY_FUNCTION__);
}
- group_addr = *(struct in_addr *)(igmp_msg + 4);
+ //group_addr = *(struct in_addr *)(igmp_msg + 4);
+ memcpy(&group_addr, igmp_msg + 4, sizeof(struct in_addr));
/* non-existant group is created as INCLUDE {empty} */
group = igmp_add_group_by_addr(igmp, group_addr, ifp->name);