image-rs / deflate-rs

An implementation of a DEFLATE encoder in rust
Apache License 2.0
53 stars 14 forks source link

Panic in `ChainedHashTable::add_hash_value` when encoding #26

Closed koute closed 5 years ago

koute commented 6 years ago

This code panics when compiled in debug mode:

extern crate deflate;

use std::io::Write;
use deflate::CompressionOptions;
use deflate::write::GzEncoder;

fn main() {
    let fp = Vec::new();
    let mut fp = GzEncoder::new( fp, CompressionOptions::default() );

    fp.write( &[0] ).unwrap();
    fp.flush().unwrap();
    fp.write( &[0] ).unwrap();
    fp.write( &[0, 0] ).unwrap();
}
thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `1`,
 right: `0`', /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/chained_hash_table.rs:141:9
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
             at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::print
             at libstd/sys_common/backtrace.rs:71
             at libstd/sys_common/backtrace.rs:59
   2: std::panicking::default_hook::{{closure}}
             at libstd/panicking.rs:211
   3: std::panicking::default_hook
             at libstd/panicking.rs:227
   4: std::panicking::rust_panic_with_hook
             at libstd/panicking.rs:475
   5: std::panicking::continue_panic_fmt
             at libstd/panicking.rs:390
   6: std::panicking::begin_panic_fmt
             at libstd/panicking.rs:345
   7: deflate::chained_hash_table::ChainedHashTable::add_hash_value
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/chained_hash_table.rs:141
   8: deflate::lz77::process_chunk_lazy
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/lz77.rs:346
   9: deflate::lz77::process_chunk
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/lz77.rs:217
  10: deflate::lz77::lz77_compress_block
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/lz77.rs:655
  11: deflate::compress::compress_data_dynamic_n
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/compress.rs:130
  12: deflate::writer::compress_until_done
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/writer.rs:25
  13: <deflate::writer::DeflateEncoder<W> as std::io::Write>::flush
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/writer.rs:137
  14: <deflate::writer::gzip::GzEncoder<W> as std::io::Write>::flush
             at /home/kou/.cargo/registry/src/github.com-1ecc6299db9ec823/deflate-0.7.18/src/writer.rs:454
  15: repro::main
             at src/main.rs:15
  16: std::rt::lang_start::{{closure}}
             at /checkout/src/libstd/rt.rs:74
  17: std::panicking::try::do_call
             at libstd/rt.rs:59
             at libstd/panicking.rs:310
  18: __rust_maybe_catch_panic
             at libpanic_unwind/lib.rs:106
  19: std::rt::lang_start_internal
             at libstd/panicking.rs:289
             at libstd/panic.rs:392
             at libstd/rt.rs:58
  20: std::rt::lang_start
             at /checkout/src/libstd/rt.rs:74
  21: main
  22: __libc_start_main
  23: _start

rustc 1.29.0-nightly (6a1c0637c 2018-07-23) x86_64-unknown-linux-gnu deflate 0.7.18

oyvindln commented 6 years ago

The panic is on a debug counter that's there to check that bytes aren't skipped, it's possible that the error is simply that it's not reset properly when flushing. I will investigate.

oyvindln commented 5 years ago

Sorry for taking some time, just going to disable the debug check for now, it was mostly stuff used when developing anyhow.