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:
		
							parent
							
								
									a6bb26091a
								
							
						
					
					
						commit
						6010fe104e
					
				
					 2 changed files with 15 additions and 12 deletions
				
			
		
							
								
								
									
										24
									
								
								src/common.h
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								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 { \ | ||||
|  |  | |||
|  | @ -23,6 +23,7 @@ | |||
| #include "common.h" | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <stddef.h> | ||||
| #include <stdlib.h> | ||||
| #include <unistd.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; | ||||
| 
 | ||||
| 	elem = nfmalloc( sizeof(*elem) + len ); | ||||
| 	elem = nfmalloc( offsetof(string_list_t, string) + len + 1 ); | ||||
| 	elem->next = *list; | ||||
| 	*list = elem; | ||||
| 	memcpy( elem->string, str, len ); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue