rewrite nonsensical struct packing magic

this couldn't have possibly worked - the alignment also determines the
sizeof, thus defeating the intent of the packing.
This commit is contained in:
Oswald Buddenhagen 2019-11-15 20:20:45 +01:00
parent a6bb26091a
commit 6010fe104e
2 changed files with 15 additions and 12 deletions

View File

@ -47,12 +47,10 @@ typedef unsigned long ulong;
# define ATTR_UNUSED __attribute__((unused)) # define ATTR_UNUSED __attribute__((unused))
# define ATTR_NORETURN __attribute__((noreturn)) # define ATTR_NORETURN __attribute__((noreturn))
# define ATTR_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) # define ATTR_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
# define ATTR_PACKED(ref) __attribute__((packed,aligned(sizeof(ref))))
#else #else
# define ATTR_UNUSED # define ATTR_UNUSED
# define ATTR_NORETURN # define ATTR_NORETURN
# define ATTR_PRINTFLIKE(fmt,var) # define ATTR_PRINTFLIKE(fmt,var)
# define ATTR_PACKED(ref)
#endif #endif
#if defined(__clang__) #if defined(__clang__)
@ -137,7 +135,7 @@ void flushn( void );
typedef struct string_list { typedef struct string_list {
struct string_list *next; struct string_list *next;
char string[1]; 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_n( string_list_t **list, const char *str, uint len );
void add_string_list( string_list_t **list, const char *str ); 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 { \ typedef struct { \
T *data; \ T *data; \
uint size; \ uint size; \
} ATTR_PACKED(T *) T##_array_t; \ } T##_array_t; \
typedef struct { \ typedef union { \
T##_array_t array; \ T##_array_t array; \
struct { \
T *dummy_data; \
uint dummy_size; \
uint alloc; \ uint alloc; \
} ATTR_PACKED(T *) T##_array_alloc_t; \ } extra; \
} T##_array_alloc_t; \
static INLINE T *T##_array_append( T##_array_alloc_t *arr ) \ static INLINE T *T##_array_append( T##_array_alloc_t *arr ) \
{ \ { \
if (arr->array.size == arr->alloc) { \ if (arr->array.size == arr->extra.alloc) { \
arr->alloc = arr->alloc * 2 + 100; \ arr->extra.alloc = arr->extra.alloc * 2 + 100; \
arr->array.data = nfrealloc( arr->array.data, arr->alloc * sizeof(T) ); \ arr->array.data = nfrealloc( arr->array.data, arr->extra.alloc * sizeof(T) ); \
} \ } \
return &arr->array.data[arr->array.size++]; \ return &arr->array.data[arr->array.size++]; \
} }
#define ARRAY_INIT(arr) \ #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) \ #define ARRAY_SQUEEZE(arr) \
do { \ do { \

View File

@ -23,6 +23,7 @@
#include "common.h" #include "common.h"
#include <assert.h> #include <assert.h>
#include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
@ -174,7 +175,7 @@ add_string_list_n( string_list_t **list, const char *str, uint len )
{ {
string_list_t *elem; string_list_t *elem;
elem = nfmalloc( sizeof(*elem) + len ); elem = nfmalloc( offsetof(string_list_t, string) + len + 1 );
elem->next = *list; elem->next = *list;
*list = elem; *list = elem;
memcpy( elem->string, str, len ); memcpy( elem->string, str, len );