The returned packet can have less strict alignment (u_char) than the struct
(ether_header) we are casting it to, so to avoid alignment issues just copy the
header into the struct on the stack.
Signed-off-by: Martin Kletzander <mkletzan(a)redhat.com>
---
src/nwfilter/nwfilter_learnipaddr.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c
index fb552bd1e60e..99bffdc4fbdb 100644
--- a/src/nwfilter/nwfilter_learnipaddr.c
+++ b/src/nwfilter/nwfilter_learnipaddr.c
@@ -384,7 +384,7 @@ learnIPAddressThread(void *arg)
struct bpf_program fp;
struct pcap_pkthdr header;
const u_char *packet;
- struct ether_header *ether_hdr;
+ struct ether_header ether_hdr;
struct ether_vlan_header *vlan_hdr;
virNWFilterIPAddrLearnReq *req = arg;
uint32_t vmaddr = 0, bcastaddr = 0;
@@ -506,13 +506,14 @@ learnIPAddressThread(void *arg)
}
if (header.len >= sizeof(struct ether_header)) {
- ether_hdr = (struct ether_header*)packet;
+ /* Avoid alignment issues */
+ memcpy(ðer_hdr, packet, sizeof(struct ether_header));
- switch (ntohs(ether_hdr->ether_type)) {
+ switch (ntohs(ether_hdr.ether_type)) {
case ETHERTYPE_IP:
ethHdrSize = sizeof(struct ether_header);
- etherType = ntohs(ether_hdr->ether_type);
+ etherType = ntohs(ether_hdr.ether_type);
break;
case ETHERTYPE_VLAN:
@@ -528,7 +529,7 @@ learnIPAddressThread(void *arg)
continue;
}
- if (virMacAddrCmpRaw(&req->binding->mac, ether_hdr->ether_shost)
== 0) {
+ if (virMacAddrCmpRaw(&req->binding->mac, ether_hdr.ether_shost) ==
0) {
/* packets from the VM */
if (etherType == ETHERTYPE_IP &&
@@ -568,9 +569,9 @@ learnIPAddressThread(void *arg)
}
}
} else if (virMacAddrCmpRaw(&req->binding->mac,
- ether_hdr->ether_dhost) == 0 ||
+ ether_hdr.ether_dhost) == 0 ||
/* allow Broadcast replies from DHCP server */
- virMacAddrIsBroadcastRaw(ether_hdr->ether_dhost)) {
+ virMacAddrIsBroadcastRaw(ether_hdr.ether_dhost)) {
/* packets to the VM */
if (etherType == ETHERTYPE_IP &&
(header.len >= ethHdrSize +
--
2.35.1