unzip: fix thinko with le/be conv and size (closes bug 129)

awk: make "struct global" hack more robust wrt alignment (closes bug 131)
This commit is contained in:
Denis Vlasenko 2009-02-26 11:21:04 +00:00
parent 8e5de2aab7
commit 9aa5c652e9
2 changed files with 10 additions and 7 deletions

View File

@ -140,7 +140,7 @@ struct BUG_cde_header_must_be_16_bytes {
}; };
#define FIX_ENDIANNESS_CDE(cde_header) do { \ #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) } while (0)
enum { zip_fd = 3 }; enum { zip_fd = 3 };

View File

@ -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 /* 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 { struct globals {
double t_double;
chain beginseq, mainseq, endseq; chain beginseq, mainseq, endseq;
chain *seq; chain *seq;
node *break_ptr, *continue_ptr; node *break_ptr, *continue_ptr;
@ -439,16 +443,16 @@ struct globals2 {
tsplitter exec_builtin__tspl; tsplitter exec_builtin__tspl;
/* biggest and least used members go last */ /* biggest and least used members go last */
double t_double;
tsplitter fsplitter, rsplitter; tsplitter fsplitter, rsplitter;
}; };
#define G1 (ptr_to_globals[-1]) #define G1 (ptr_to_globals[-1])
#define G (*(struct globals2 *)ptr_to_globals) #define G (*(struct globals2 *)ptr_to_globals)
/* For debug. nm --size-sort awk.o | grep -vi ' [tr] ' */ /* For debug. nm --size-sort awk.o | grep -vi ' [tr] ' */
/* char G1size[sizeof(G1)]; - 0x6c */ /*char G1size[sizeof(G1)]; - 0x74 */
/* char Gsize[sizeof(G)]; - 0x1cc */ /*char Gsize[sizeof(G)]; - 0x1c4 */
/* Trying to keep most of members accessible with short offsets: */ /* 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 beginseq (G1.beginseq )
#define mainseq (G1.mainseq ) #define mainseq (G1.mainseq )
#define endseq (G1.endseq ) #define endseq (G1.endseq )
@ -476,7 +480,6 @@ struct globals2 {
#define t_info (G.t_info ) #define t_info (G.t_info )
#define t_tclass (G.t_tclass ) #define t_tclass (G.t_tclass )
#define t_string (G.t_string ) #define t_string (G.t_string )
#define t_double (G.t_double )
#define t_lineno (G.t_lineno ) #define t_lineno (G.t_lineno )
#define t_rollback (G.t_rollback ) #define t_rollback (G.t_rollback )
#define intvar (G.intvar ) #define intvar (G.intvar )