[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULLv2 02/32] slirp: Avoid marking naturally packed struct
From: |
Samuel Thibault |
Subject: |
[Qemu-devel] [PULLv2 02/32] slirp: Avoid marking naturally packed structs as QEMU_PACKED |
Date: |
Tue, 5 Feb 2019 18:58:57 +0200 |
From: Peter Maydell <address@hidden>
Various ipv6 structs in the slirp headers are marked QEMU_PACKED,
but they are actually naturally aligned and will have no padding
in them. Instead of marking them with the 'packed' attribute,
assert at compile time that they are the size we expect. This
allows us to take the address of fields within the structs
without risking undefined behaviour, and suppresses clang
-Waddress-of-packed-member warnings.
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>
---
slirp/ip6.h | 12 ++++++++++--
slirp/ip6_icmp.h | 20 +++++++++++++++-----
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/slirp/ip6.h b/slirp/ip6.h
index 14e9c78735..1e3e329ce6 100644
--- a/slirp/ip6.h
+++ b/slirp/ip6.h
@@ -133,7 +133,7 @@ struct ip6 {
uint8_t ip_nh; /* next header */
uint8_t ip_hl; /* hop limit */
struct in6_addr ip_src, ip_dst; /* source and dest address */
-} QEMU_PACKED;
+};
/*
* IPv6 pseudo-header used by upper-layer protocols
@@ -145,7 +145,15 @@ struct ip6_pseudohdr {
uint16_t ih_zero_hi; /* zero */
uint8_t ih_zero_lo; /* zero */
uint8_t ih_nh; /* next header */
-} QEMU_PACKED;
+};
+/*
+ * We don't want to mark these ip6 structs as packed as they are naturally
+ * correctly aligned; instead assert that there is no stray padding.
+ * If we marked the struct as packed then we would be unable to take
+ * the address of any of the fields in it.
+ */
+QEMU_BUILD_BUG_ON(sizeof(struct ip6) != 40);
+QEMU_BUILD_BUG_ON(sizeof(struct ip6_pseudohdr) != 40);
#endif
diff --git a/slirp/ip6_icmp.h b/slirp/ip6_icmp.h
index 32b0914055..2ad2b75e67 100644
--- a/slirp/ip6_icmp.h
+++ b/slirp/ip6_icmp.h
@@ -48,12 +48,16 @@ struct ndp_ra { /* Router Advertisement Message */
uint16_t lifetime; /* Router Lifetime */
uint32_t reach_time; /* Reachable Time */
uint32_t retrans_time; /* Retrans Timer */
-} QEMU_PACKED;
+};
+
+QEMU_BUILD_BUG_ON(sizeof(struct ndp_ra) != 12);
struct ndp_ns { /* Neighbor Solicitation Message */
uint32_t reserved;
struct in6_addr target; /* Target Address */
-} QEMU_PACKED;
+};
+
+QEMU_BUILD_BUG_ON(sizeof(struct ndp_ns) != 20);
struct ndp_na { /* Neighbor Advertisement Message */
#if G_BYTE_ORDER == G_BIG_ENDIAN
@@ -72,13 +76,17 @@ struct ndp_na { /* Neighbor Advertisement Message */
reserved_lo:24;
#endif
struct in6_addr target; /* Target Address */
-} QEMU_PACKED;
+};
+
+QEMU_BUILD_BUG_ON(sizeof(struct ndp_na) != 20);
struct ndp_redirect {
uint32_t reserved;
struct in6_addr target; /* Target Address */
struct in6_addr dest; /* Destination Address */
-} QEMU_PACKED;
+};
+
+QEMU_BUILD_BUG_ON(sizeof(struct ndp_redirect) != 36);
/*
* Structure of an icmpv6 header.
@@ -103,7 +111,9 @@ struct icmp6 {
#define icmp6_nns icmp6_body.ndp_ns
#define icmp6_nna icmp6_body.ndp_na
#define icmp6_redirect icmp6_body.ndp_redirect
-} QEMU_PACKED;
+};
+
+QEMU_BUILD_BUG_ON(sizeof(struct icmp6) != 40);
#define ICMP6_MINLEN 4
#define ICMP6_ERROR_MINLEN 8
--
2.20.1
- [Qemu-devel] [PULLv2 00/32] More work towards libslirp, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 03/32] slirp: Don't mark struct ipq or struct ipasfrag as packed, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 07/32] net/slirp: fix leaks on forwarding rule registration error, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 02/32] slirp: Avoid marking naturally packed structs as QEMU_PACKED,
Samuel Thibault <=
- [Qemu-devel] [PULLv2 01/32] slirp: Avoid unaligned 16bit memory access, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 13/32] slirp: add unregister_poll_fd() callback, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 12/32] slirp: replace qemu_set_nonblock(), Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 05/32] net/slirp: simplify checking for cmd: prefix, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 06/32] net/slirp: free forwarding rules on cleanup, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 16/32] slirp: do not include qemu headers in libslirp.h public API header, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 17/32] slirp: improve windows headers inclusion, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 09/32] slirp: replace trace functions with DEBUG calls, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 10/32] slirp: replace QEMU_PACKED with SLIRP_PACKED, Samuel Thibault, 2019/02/05
- [Qemu-devel] [PULLv2 21/32] slirp: replace net/eth.h inclusion with own defines, Samuel Thibault, 2019/02/05