]> wimlib.net Git - wimlib/blobdiff - src/lzms_decompress.c
decompress_common: move temp space for building decode table to heap
[wimlib] / src / lzms_decompress.c
index 4791054a7f468202d21e97d60fe830cc0667ee03..2ef2debd220b9337d3af7b04162fb719d002c2f1 100644 (file)
@@ -348,7 +348,12 @@ struct lzms_decompressor {
        u32 delta_power_freqs[LZMS_NUM_DELTA_POWER_SYMS];
        struct lzms_huffman_rebuild_info delta_power_rebuild_info;
 
-       u32 codewords[LZMS_MAX_NUM_SYMS];
+       /* Temporary space for lzms_build_huffman_code() */
+       union {
+               u32 codewords[LZMS_MAX_NUM_SYMS];
+               DECODE_TABLE_WORKING_SPACE(working_space, LZMS_MAX_NUM_SYMS,
+                                          LZMS_MAX_CODEWORD_LENGTH);
+       };
 
        }; // struct
 
@@ -517,7 +522,8 @@ lzms_build_huffman_code(struct lzms_huffman_rebuild_info *rebuild_info)
                                  rebuild_info->num_syms,
                                  rebuild_info->table_bits,
                                  (u8 *)rebuild_info->decode_table,
-                                 LZMS_MAX_CODEWORD_LENGTH);
+                                 LZMS_MAX_CODEWORD_LENGTH,
+                                 (u16 *)rebuild_info->codewords);
 
        rebuild_info->num_syms_until_rebuild = rebuild_info->rebuild_freq;
 }
@@ -822,12 +828,10 @@ lzms_decompress(const void * const restrict in, const size_t in_nbytes,
 
                        length = lzms_decode_length(d, &is);
 
-                       if (unlikely(length > out_end - out_next))
-                               return -1;
-                       if (unlikely(offset > out_next - (u8 *)out))
+                       if (unlikely(lz_copy(length, offset, out, out_next, out_end,
+                                            LZMS_MIN_MATCH_LENGTH)))
                                return -1;
 
-                       lz_copy(out_next, length, offset, out_end, LZMS_MIN_MATCH_LENGTH);
                        out_next += length;
                } else {
                        /* Delta match  */