diff options
author | Maciej Żenczykowski <maze@google.com> | 2023-03-16 11:34:22 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-03-16 11:34:22 +0000 |
commit | ba3124b4f21f4fae5087dc3797a4de9177d4e2dc (patch) | |
tree | de211cd44671cec8efbc6db83ee6fdb8f505f7cd | |
parent | ac6e5d6c4200ea961f33c8af100e5c8cd3cd0a41 (diff) | |
parent | 1688830b72e56f2d6db968d9f44c7c87be5456cd (diff) | |
download | android-clat-ba3124b4f21f4fae5087dc3797a4de9177d4e2dc.tar.gz |
Merge "clatd: use offsetof" am: b8c834410e am: 1688830b72
Original change: https://android-review.googlesource.com/c/platform/external/android-clat/+/2491938
Change-Id: I01399c72db0105396c32d408e96f1ee2e1ed05b1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | clatd.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -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: |