unzip: fix thinko with le/be conv and size (closes bug 129)
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 26 Feb 2009 11:21:04 +0000 (11:21 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 26 Feb 2009 11:21:04 +0000 (11:21 -0000)
awk: make "struct global" hack more robust wrt alignment (closes bug 131)

archival/unzip.c
editors/awk.c

index e468ff451db4dca764600812bcf156ab1f1ccbbf..7b47a8ab8cbfa8f358cc58476864c8002e404b5c 100644 (file)
@@ -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 };
index bac580497fa747cf0d92636d7e29def76f000048..3f8368c8f75f59d9461a8209d18a3f337e36f4f4 100644 (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
- * 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      )