unzip: fix thinko with le/be conv and size (closes bug 129) awk: make "struct global" hack more robust wrt alignment (closes bug 131)
No binary (build failed)
—
(log yok)
| @@ -140,7 +140,7 @@ struct BUG_cde_header_must_be_16_bytes { | |
| }; | |
| #define FIX_ENDIANNESS_CDE(cde_header) do { \ | |
| - | (cde_header).formatted.cds_offset = SWAP_LE16((cde_header).formatted.cds_offset); \ |
| + | (cde_header).formatted.cds_offset = SWAP_LE32((cde_header).formatted.cds_offset); \ |
| } while (0) | |
| enum { zip_fd = 3 }; | |
| @@ -389,8 +389,12 @@ static const uint16_t PRIMES[] ALIGN2 = { 251, 1021, 4093, 16381, 65521 }; | |
| /* Globals. Split in two parts so that first one is addressed | |
| - | * with (mostly short) negative offsets */ |
| + | * with (mostly short) negative offsets. |
| + | * NB: it's unsafe to put members of type "double" |
| + | * into globals2 (gcc may fail to align them). |
| + | */ |
| struct globals { | |
| + | double t_double; |
| chain beginseq, mainseq, endseq; | |
| chain *seq; | |
| node *break_ptr, *continue_ptr; | |
| @@ -439,16 +443,16 @@ struct globals2 { | |
| tsplitter exec_builtin__tspl; | |
| /* biggest and least used members go last */ | |
| - | double t_double; |
| tsplitter fsplitter, rsplitter; | |
| }; | |
| #define G1 (ptr_to_globals[-1]) | |
| #define G (*(struct globals2 *)ptr_to_globals) | |
| /* For debug. nm --size-sort awk.o | grep -vi ' [tr] ' */ | |
| - | /* char G1size[sizeof(G1)]; - 0x6c */ |
| - | /* char Gsize[sizeof(G)]; - 0x1cc */ |
| + | /*char G1size[sizeof(G1)]; - 0x74 */ |
| + | /*char Gsize[sizeof(G)]; - 0x1c4 */ |
| /* Trying to keep most of members accessible with short offsets: */ | |
| - | /* char Gofs_seed[offsetof(struct globals2, evaluate__seed)]; - 0x90 */ |
| + | /*char Gofs_seed[offsetof(struct globals2, evaluate__seed)]; - 0x90 */ |
| + | #define t_double (G1.t_double ) |
| #define beginseq (G1.beginseq ) | |
| #define mainseq (G1.mainseq ) | |
| #define endseq (G1.endseq ) | |
| @@ -476,7 +480,6 @@ struct globals2 { | |
| #define t_info (G.t_info ) | |
| #define t_tclass (G.t_tclass ) | |
| #define t_string (G.t_string ) | |
| - | #define t_double (G.t_double ) |
| #define t_lineno (G.t_lineno ) | |
| #define t_rollback (G.t_rollback ) | |
| #define intvar (G.intvar ) | |