summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2023-03-16 10:57:26 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-03-16 10:57:26 +0000
commit1688830b72e56f2d6db968d9f44c7c87be5456cd (patch)
treede211cd44671cec8efbc6db83ee6fdb8f505f7cd
parentd661ac68c857abfa676ce034be8001d4e6696f56 (diff)
parentb8c834410e39b68410c2a03863ed47be27d6327a (diff)
downloadandroid-clat-1688830b72e56f2d6db968d9f44c7c87be5456cd.tar.gz
Merge "clatd: use offsetof" am: b8c834410e
Original change: https://android-review.googlesource.com/c/platform/external/android-clat/+/2491938 Change-Id: I0932a11dbd451aacc5096e9b175c6c79e157f341 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--clatd.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/clatd.c b/clatd.c
index 15fbc4b..f8973f9 100644
--- a/clatd.c
+++ b/clatd.c
@@ -124,13 +124,14 @@ void process_packet_6_to_4(struct tun_data *tunnel) {
}
}
- if (readlen < sizeof(struct virtio_net_hdr) + tp_net) {
- logmsg(ANDROID_LOG_WARN, "%s: ignoring %zd byte pkt shorter than %zu+%u L2 header",
- __func__, readlen, sizeof(struct virtio_net_hdr), tp_net);
+ const int payload_offset = offsetof(typeof(buf), payload);
+ if (readlen < payload_offset + tp_net) {
+ logmsg(ANDROID_LOG_WARN, "%s: ignoring %zd byte pkt shorter than %d+%u L2 header",
+ __func__, readlen, payload_offset, tp_net);
return;
}
- const int pkt_len = readlen - sizeof(struct virtio_net_hdr);
+ const int pkt_len = readlen - payload_offset;
// This will detect a skb->ip_summed == CHECKSUM_PARTIAL packet with non-final L4 checksum
if (tp_status & TP_STATUS_CSUMNOTREADY) {
@@ -183,11 +184,15 @@ void process_packet_4_to_6(struct tun_data *tunnel) {
return;
}
- if (readlen < (ssize_t)sizeof(buf.pi)) {
+ const int payload_offset = offsetof(typeof(buf), payload);
+
+ if (readlen < payload_offset) {
logmsg(ANDROID_LOG_WARN, "%s: short read: got %ld bytes", __func__, readlen);
return;
}
+ const int pkt_len = readlen - payload_offset;
+
uint16_t proto = ntohs(buf.pi.proto);
if (proto != ETH_P_IP) {
logmsg(ANDROID_LOG_WARN, "%s: unknown packet type = 0x%x", __func__, proto);
@@ -198,8 +203,7 @@ void process_packet_4_to_6(struct tun_data *tunnel) {
logmsg(ANDROID_LOG_WARN, "%s: unexpected flags = %d", __func__, buf.pi.flags);
}
- readlen -= sizeof(buf.pi);
- translate_packet(tunnel->write_fd6, 1 /* to_ipv6 */, buf.payload, readlen);
+ translate_packet(tunnel->write_fd6, 1 /* to_ipv6 */, buf.payload, pkt_len);
}
// IPv6 DAD packet format: