From 6010fe104ef2a3e91335fdb7e686939d6af82a46 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 15 Nov 2019 20:20:45 +0100 Subject: [PATCH] rewrite nonsensical struct packing magic this couldn't have possibly worked - the alignment also determines the sizeof, thus defeating the intent of the packing. --- src/common.h | 24 +++++++++++++----------- src/util.c | 3 ++- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/common.h b/src/common.h index c834cb1..c00495f 100644 --- a/src/common.h +++ b/src/common.h @@ -47,12 +47,10 @@ typedef unsigned long ulong; # define ATTR_UNUSED __attribute__((unused)) # define ATTR_NORETURN __attribute__((noreturn)) # define ATTR_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) -# define ATTR_PACKED(ref) __attribute__((packed,aligned(sizeof(ref)))) #else # define ATTR_UNUSED # define ATTR_NORETURN # define ATTR_PRINTFLIKE(fmt,var) -# define ATTR_PACKED(ref) #endif #if defined(__clang__) @@ -137,7 +135,7 @@ void flushn( void ); typedef struct string_list { struct string_list *next; char string[1]; -} ATTR_PACKED(void *) string_list_t; +} string_list_t; void add_string_list_n( string_list_t **list, const char *str, uint len ); void add_string_list( string_list_t **list, const char *str ); @@ -176,22 +174,26 @@ int map_name( const char *arg, char **result, uint reserve, const char *in, cons typedef struct { \ T *data; \ uint size; \ - } ATTR_PACKED(T *) T##_array_t; \ - typedef struct { \ + } T##_array_t; \ + typedef union { \ T##_array_t array; \ - uint alloc; \ - } ATTR_PACKED(T *) T##_array_alloc_t; \ + struct { \ + T *dummy_data; \ + uint dummy_size; \ + uint alloc; \ + } extra; \ + } T##_array_alloc_t; \ static INLINE T *T##_array_append( T##_array_alloc_t *arr ) \ { \ - if (arr->array.size == arr->alloc) { \ - arr->alloc = arr->alloc * 2 + 100; \ - arr->array.data = nfrealloc( arr->array.data, arr->alloc * sizeof(T) ); \ + if (arr->array.size == arr->extra.alloc) { \ + arr->extra.alloc = arr->extra.alloc * 2 + 100; \ + arr->array.data = nfrealloc( arr->array.data, arr->extra.alloc * sizeof(T) ); \ } \ return &arr->array.data[arr->array.size++]; \ } #define ARRAY_INIT(arr) \ - do { (arr)->array.data = NULL; (arr)->array.size = (arr)->alloc = 0; } while (0) + do { (arr)->array.data = NULL; (arr)->array.size = (arr)->extra.alloc = 0; } while (0) #define ARRAY_SQUEEZE(arr) \ do { \ diff --git a/src/util.c b/src/util.c index 08443de..c6c597c 100644 --- a/src/util.c +++ b/src/util.c @@ -23,6 +23,7 @@ #include "common.h" #include +#include #include #include #include @@ -174,7 +175,7 @@ add_string_list_n( string_list_t **list, const char *str, uint len ) { string_list_t *elem; - elem = nfmalloc( sizeof(*elem) + len ); + elem = nfmalloc( offsetof(string_list_t, string) + len + 1 ); elem->next = *list; *list = elem; memcpy( elem->string, str, len );