Narigo / keepass-diff

A CLI-tool to diff Keepass (.kdbx) files. Useful, if syncing with Dropbox or NextCloud and getting multiple files due to conflicts.
https://keepass-diff.narigo.dev/
MIT License
297 stars 27 forks source link

Crash on Linux #60

Open aivanovski opened 1 year ago

aivanovski commented 1 year ago

Checked with many files, always crashes. Files are valid, KeepasXC opens them.

I'm not looking for a solution for this issue. I use my own app for diffing, I created it when faced with this issue ~6 months ago. So, this issue is quite old, and nothing changed.

Details: build from master (compiled with RUSTFLAGS="-C target-cpu=native" cargo install keepass-diff) Arch Linux, x86_64

Stacktrace:

Password for both files: 
thread 'main' panicked at 'range end index 8 out of range for slice of length 0', /home/aleksey/.cargo/registry/src/github.com-1ecc6299db9ec823/keepass-0.4.10/src/xml_parse.rs:32:32
stack backtrace:
   0:     0x5574c9ee221c - std::backtrace_rs::backtrace::libunwind::trace::h09f7e4e089375279
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x5574c9ee221c - std::backtrace_rs::backtrace::trace_unsynchronized::h1ec96f1c7087094e
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x5574c9ee221c - std::sys_common::backtrace::_print_fmt::h317b71fc9a5cf964
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:67:5
   3:     0x5574c9ee221c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::he3555b48e7dfe7f0
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:46:22
   4:     0x5574c9eff95c - core::fmt::write::h513b07ca38f4fb1b
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/fmt/mod.rs:1149:17
   5:     0x5574c9edf225 - std::io::Write::write_fmt::haf8c932b52111354
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/io/mod.rs:1697:15
   6:     0x5574c9ee3df0 - std::sys_common::backtrace::_print::h195c38364780a303
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:49:5
   7:     0x5574c9ee3df0 - std::sys_common::backtrace::print::hc09dfdea923b6730
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:36:9
   8:     0x5574c9ee3df0 - std::panicking::default_hook::{{closure}}::hb2e38ec0d91046a3
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:211:50
   9:     0x5574c9ee39a5 - std::panicking::default_hook::h60284635b0ad54a8
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:228:9
  10:     0x5574c9ee44a4 - std::panicking::rust_panic_with_hook::ha677a669fb275654
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:606:17
  11:     0x5574c9ee3f80 - std::panicking::begin_panic_handler::{{closure}}::h976246fb95d93c31
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:502:13
  12:     0x5574c9ee26c4 - std::sys_common::backtrace::__rust_end_short_backtrace::h38077ee5b7b9f99a
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:139:18
  13:     0x5574c9ee3ee9 - rust_begin_unwind
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:498:5
  14:     0x5574c9b58111 - core::panicking::panic_fmt::h35f3a62252ba0fd2
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/panicking.rs:107:14
  15:     0x5574c9b582a2 - core::slice::index::slice_end_index_len_fail::h735e748f7023a8c4
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/slice/index.rs:41:5
  16:     0x5574c9cb192e - <core::ops::range::Range<usize> as core::slice::index::SliceIndex<[T]>>::index::h6e4fbd32dea6032d
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/slice/index.rs:240:13
  17:     0x5574c9c6c5e8 - core::slice::index::<impl core::ops::index::Index<I> for [T]>::index::hc0027a9856577b05
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/slice/index.rs:15:9
  18:     0x5574c9bab658 - <alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index::ha76f9baaaf8aa8f7
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/alloc/src/vec/mod.rs:2528:9
  19:     0x5574c9bcf5bf - keepass::xml_parse::parse_xml_timestamp::hc0cfca25d9ab36e1
                               at /home/aleksey/.cargo/registry/src/github.com-1ecc6299db9ec823/keepass-0.4.10/src/xml_parse.rs:32:32
  20:     0x5574c9bd1672 - keepass::xml_parse::parse_xml_block::h7254e887919d082b
                               at /home/aleksey/.cargo/registry/src/github.com-1ecc6299db9ec823/keepass-0.4.10/src/xml_parse.rs:175:39
  21:     0x5574c9bc5de6 - keepass::parse::kdbx3::parse::he5db14e97e738b9d
                               at /home/aleksey/.cargo/registry/src/github.com-1ecc6299db9ec823/keepass-0.4.10/src/parse/kdbx3.rs:183:27
  22:     0x5574c9bd83d6 - keepass::db::Database::open::h732c8b10d8c0621e
                               at /home/aleksey/.cargo/registry/src/github.com-1ecc6299db9ec823/keepass-0.4.10/src/db.rs:71:17
  23:     0x5574c9b64a19 - keepass_diff::kdbx_to_group::{{closure}}::h5ce501cd3deec7a2
                               at /home/aleksey/tmp/keepass-diff/src/main.rs:154:22
  24:     0x5574c9b7eca0 - core::result::Result<T,E>::and_then::h9a4c0422c4cfd937
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/result.rs:966:22
  25:     0x5574c9b618d6 - keepass_diff::kdbx_to_group::ha3618eaa6b54780a
                               at /home/aleksey/tmp/keepass-diff/src/main.rs:151:5
  26:     0x5574c9b61356 - keepass_diff::main::h5de6d794e6735a44
                               at /home/aleksey/tmp/keepass-diff/src/main.rs:118:24
  27:     0x5574c9b88782 - core::ops::function::FnOnce::call_once::ha33f9c23999d5d3d
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops/function.rs:227:5
  28:     0x5574c9b7094a - std::sys_common::backtrace::__rust_begin_short_backtrace::h4a35e03ccebcbf39
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/sys_common/backtrace.rs:123:18
  29:     0x5574c9b7d026 - std::rt::lang_start::{{closure}}::ha969a574c650967d
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/rt.rs:145:18
  30:     0x5574c9ee1eab - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h7e688d7cdfeb7e00
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/core/src/ops/function.rs:259:13
  31:     0x5574c9ee1eab - std::panicking::try::do_call::h4be824d2350b44c9
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:406:40
  32:     0x5574c9ee1eab - std::panicking::try::h0a6fc7affbe5088d
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:370:19
  33:     0x5574c9ee1eab - std::panic::catch_unwind::h22c320f732ec805e
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panic.rs:133:14
  34:     0x5574c9ee1eab - std::rt::lang_start_internal::{{closure}}::hd38309c108fe679d
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/rt.rs:128:48
  35:     0x5574c9ee1eab - std::panicking::try::do_call::h8fcaf501f097a28e
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:406:40
  36:     0x5574c9ee1eab - std::panicking::try::h20e906825f98acc1
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panicking.rs:370:19
  37:     0x5574c9ee1eab - std::panic::catch_unwind::h8c5234dc632124ef
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/panic.rs:133:14
  38:     0x5574c9ee1eab - std::rt::lang_start_internal::hc4dd8cd3ec4518c2
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/rt.rs:128:20
  39:     0x5574c9b7cff0 - std::rt::lang_start::h7359dd7065cd00d9
                               at /rustc/db9d1b20bba1968c1ec1fc49616d4742c1725b4b/library/std/src/rt.rs:144:17
  40:     0x5574c9b6448c - main
  41:     0x7fc774b4d850 - <unknown>
  42:     0x7fc774b4d90a - __libc_start_main
  43:     0x5574c9b58875 - _start
  44:                0x0 - <unknown>
Narigo commented 1 year ago

Hi @aivanovski, thanks for the report - do you have a test file for me to be able to reproduce this?

While upgrading to the most recent keepass-rs version (0.6.1), I added two test files that contain empty group names. Those fail in the latest version, maybe empty group names fail in the version currently used here as well (0.4.10)?

aivanovski commented 1 year ago

Hi @Narigo, I'm not sure the stacktrace above was produced from this file, but at least it produces crash. Password: abc123 test.kdbx.zip

It should produce this error:

thread 'main' panicked at 'Error opening database A: IO { e: Custom { kind: InvalidInput, error: "corrupt deflate stream" } }', src/main.rs:117:18

I also have database with my personal password, that I can't share. It also produces crash, but it differs:

thread 'main' panicked at 'Error opening database A: DatabaseIntegrity { e: InvalidOuterHeaderEntry { entry_type: 12 } }', src/main.rs:117:18