From 10502ad59f918072057139a315e4cec84e17629f Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 21 Feb 2021 12:07:38 +0200 Subject: [PATCH] radiotap: Fix compiler issues with packed structures Replace the Radiotap parser platform.h file with use of helper functions from utils/common.h to avoid compiler issues with the updated design and getting pointers to members of packet structs. Silence the warning about _next_bitmap assignment. This pointer is dereferenced only with operations that are safe for unaligned access, so the compiler warning is not helpful here. __packed might not be defined in this context, so use STRUCT_PACKED from utils/common.h. Fixes: e6ac269433a3 ("radiotap: Update radiotap parser") Signed-off-by: Jouni Malinen --- src/utils/platform.h | 23 ++++++++++------------- src/utils/radiotap.c | 2 +- src/utils/radiotap.h | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/utils/platform.h b/src/utils/platform.h index 813987eb6..b2ad856b9 100644 --- a/src/utils/platform.h +++ b/src/utils/platform.h @@ -1,21 +1,18 @@ +/* + * Platform definitions for Radiotap parser + * Copyright (c) 2021, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + #ifndef PLATFORM_H #define PLATFORM_H #include "includes.h" #include "common.h" -#define le16_to_cpu le_to_host16 -#define le32_to_cpu le_to_host32 - -#define get_unaligned(p) \ -({ \ - struct packed_dummy_struct { \ - typeof(*(p)) __val; \ - } __attribute__((packed)) *__ptr = (void *) (p); \ - \ - __ptr->__val; \ -}) -#define get_unaligned_le16(p) le16_to_cpu(get_unaligned((le16 *)(p))) -#define get_unaligned_le32(p) le32_to_cpu(get_unaligned((le32 *)(p))) +#define get_unaligned_le16(p) WPA_GET_LE16((void *) (p)) +#define get_unaligned_le32(p) WPA_GET_LE32((void *) (p)) #endif /* PLATFORM_H */ diff --git a/src/utils/radiotap.c b/src/utils/radiotap.c index 6dfe3053e..6dfe29818 100644 --- a/src/utils/radiotap.c +++ b/src/utils/radiotap.c @@ -111,7 +111,7 @@ int ieee80211_radiotap_iterator_init( iterator->_arg = (uint8_t *)radiotap_header + sizeof(*radiotap_header); iterator->_next_ns_data = NULL; iterator->_reset_on_ext = 0; - iterator->_next_bitmap = &radiotap_header->it_present; + iterator->_next_bitmap = (le32 *) (((u8 *) radiotap_header) + offsetof(struct ieee80211_radiotap_header, it_present)); iterator->_next_bitmap++; iterator->_vns = vns; iterator->current_namespace = &radiotap_ns; diff --git a/src/utils/radiotap.h b/src/utils/radiotap.h index 17bb6330d..488d5a3b4 100644 --- a/src/utils/radiotap.h +++ b/src/utils/radiotap.h @@ -39,7 +39,7 @@ struct ieee80211_radiotap_header { * @it_present: (first) present word */ le32 it_present; -} __packed; +} STRUCT_PACKED; /* version is always 0 */ #define PKTHDR_RADIOTAP_VERSION 0