Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Panic in vcard4::parser::VcardParser::parse_property_value: "byte index ... is not a char boundary" #14

Closed
tniessen opened this issue Jun 26, 2024 · 7 comments

Comments

@tniessen
Copy link
Contributor

Hi, and thanks for providing this crate! I am using vcard4 on semi-trusted inputs and unfortunately, some input files result in panics:

thread 'tokio-runtime-worker' panicked at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:1041:43:
byte index 450946 is not a char boundary; it is inside 'ö' (bytes 450945..450947) of `BEGIN:VCARD
VERSION:4.0
FN:(Redacted)
ORG:(Redacted)
PHOTO:data:image/png;base64\,iVBORw0KGgoAAAANSUhEUgAAAYAAAAHgCAIAAAAjUS2yAA
 CAAElEQVR4Xry955LsuJImeDKCWsvQOlLn0XXqlL413bdvm23vj/kx7/8u`[...]
stack backtrace:
   0:     0x55a1bfe546d5 - std::backtrace_rs::backtrace::libunwind::trace::h1a07e5dba0da0cd2
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/../../backtrace/src/backtrace/libunwind.rs:105:5
   1:     0x55a1bfe546d5 - std::backtrace_rs::backtrace::trace_unsynchronized::h61b9b8394328c0bc
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x55a1bfe546d5 - std::sys_common::backtrace::_print_fmt::h1c5e18b460934cff
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:68:5
   3:     0x55a1bfe546d5 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h1e1a1972118942ad
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:44:22
   4:     0x55a1bfe7f04b - core::fmt::rt::Argument::fmt::h07af2b4071d536cd
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/fmt/rt.rs:165:63
   5:     0x55a1bfe7f04b - core::fmt::write::hc090a2ffd6b28c4a
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/fmt/mod.rs:1157:21
   6:     0x55a1bfe50f9f - std::io::Write::write_fmt::h8898bac6ff039a23
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/io/mod.rs:1832:15
   7:     0x55a1bfe544ae - std::sys_common::backtrace::_print::h4e80c5803d4ee35b
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:47:5
   8:     0x55a1bfe544ae - std::sys_common::backtrace::print::ha96650907276675e
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:34:9
   9:     0x55a1bfe55769 - std::panicking::default_hook::{{closure}}::h215c2a0a8346e0e0
  10:     0x55a1bfe554ad - std::panicking::default_hook::h207342be97478370
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:298:9
  11:     0x55a1bfe55c03 - std::panicking::rust_panic_with_hook::hac8bdceee1e4fe2c
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:795:13
  12:     0x55a1bfe55ae4 - std::panicking::begin_panic_handler::{{closure}}::h00d785e82757ce3c
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:664:13
  13:     0x55a1bfe54b99 - std::sys_common::backtrace::__rust_end_short_backtrace::h1628d957bcd06996
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:171:18
  14:     0x55a1bfe55817 - rust_begin_unwind
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:652:5
  15:     0x55a1bebffa63 - core::panicking::panic_fmt::hdc63834ffaaefae5
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panicking.rs:72:14
  16:     0x55a1bfe82d8a - core::str::slice_error_fail_rt::h34c257796faf67ed
  17:     0x55a1bec0016a - core::str::slice_error_fail::h11278fc6a58fee91
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/str/mod.rs:89:5
  18:     0x55a1bf10dcf4 - core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index::h2efa129ce60804c5
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/str/traits.rs:244:21
  19:     0x55a1bf10dea7 - core::str::traits::<impl core::ops::index::Index<I> for str>::index::h2285fb80c979ce78
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/str/traits.rs:62:9
  20:     0x55a1bf0886d2 - vcard4::parser::VcardParser::parse_property_value::h5075dd2c47de1d28
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:1041:43
  21:     0x55a1bf07fc71 - vcard4::parser::VcardParser::parse_property_by_name::hfe6eb2c95b3ef449
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:501:21
  22:     0x55a1bf07c28a - vcard4::parser::VcardParser::parse_property::h3843d19d50cf5044
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:214:17
  23:     0x55a1bf07bc53 - vcard4::parser::VcardParser::parse_properties::h9450d1c8f45856ee
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:174:29
  24:     0x55a1bf07b8d7 - vcard4::parser::VcardParser::parse_one::h17a8b9b8e260402d
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:144:9
  25:     0x55a1bf07b294 - vcard4::parser::VcardParser::parse::h704fc324cb6275fd
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/parser.rs:113:29
  26:     0x55a1bf049d5e - vcard4::parse::ha9959c1db0463645
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/vcard4-0.5.0/src/lib.rs:123:5

(...)

  31:     0x55a1beec98e8 - tokio::runtime::task::core::Core<T,S>::poll::{{closure}}::hda2a96f3e4f50a75
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/core.rs:328:17
  32:     0x55a1beec8478 - tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut::hc59cb9d53aea7fd9
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/loom/std/unsafe_cell.rs:16:9
  33:     0x55a1beec8478 - tokio::runtime::task::core::Core<T,S>::poll::haf838a1c49942530
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/core.rs:317:13
  34:     0x55a1beed21db - tokio::runtime::task::harness::poll_future::{{closure}}::hf37f545f13c96e2a
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:485:19
  35:     0x55a1bf04866c - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::h1452edee880abebb
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panic/unwind_safe.rs:272:9
  36:     0x55a1bed81d7d - std::panicking::try::do_call::hd23e59f1563194a9
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:559:40
  37:     0x55a1bed8485b - __rust_try
  38:     0x55a1bed7e059 - std::panicking::try::h230c3235bb475f41
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:523:19
  39:     0x55a1bef21ffd - std::panic::catch_unwind::h1553cf9918cf3c17
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panic.rs:149:14
  40:     0x55a1beecf951 - tokio::runtime::task::harness::poll_future::h658f9d654ddad4f2
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:473:18
  41:     0x55a1beed31c7 - tokio::runtime::task::harness::Harness<T,S>::poll_inner::ha7d1ca6ad46c3f07
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:208:27
  42:     0x55a1beed5ec3 - tokio::runtime::task::harness::Harness<T,S>::poll::hc9bee1b93fc2d41c
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:153:15
  43:     0x55a1bf0125eb - tokio::runtime::task::raw::poll::hb6410d0070f3b851
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/raw.rs:271:5
  44:     0x55a1bfae2737 - tokio::runtime::task::raw::RawTask::poll::hfb7aa8ec0be652e1
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/raw.rs:201:18
  45:     0x55a1bfa98582 - tokio::runtime::task::LocalNotified<S>::run::h569c5f37ede8db73
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/mod.rs:427:9
  46:     0x55a1bfac4aed - tokio::runtime::scheduler::multi_thread::worker::Context::run_task::{{closure}}::hb4737cb8f083aef3
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:585:13
  47:     0x55a1bfac4944 - tokio::runtime::coop::with_budget::h60441badba8aa480
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/coop.rs:107:5
  48:     0x55a1bfac4944 - tokio::runtime::coop::budget::h14ea07688e0fb413
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/coop.rs:73:5
  49:     0x55a1bfac4944 - tokio::runtime::scheduler::multi_thread::worker::Context::run_task::h1f9dcdc7fba4f2fc
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:584:9
  50:     0x55a1bfac41bd - tokio::runtime::scheduler::multi_thread::worker::Context::run::hbee63a56282a0b08
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:547:24
  51:     0x55a1bfac3c39 - tokio::runtime::scheduler::multi_thread::worker::run::{{closure}}::{{closure}}::h2da7fe3c4a7a7033
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:500:21
  52:     0x55a1bfae0d10 - tokio::runtime::context::scoped::Scoped<T>::set::h6826e72ccffc535c
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context/scoped.rs:40:9
  53:     0x55a1bfa7a8eb - tokio::runtime::context::set_scheduler::{{closure}}::h23c24ab9942eb714
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context.rs:180:26
  54:     0x55a1bfa68b00 - std::thread::local::LocalKey<T>::try_with::h27221b88b1274a39
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/thread/local.rs:286:12
  55:     0x55a1bfa6863b - std::thread::local::LocalKey<T>::with::h103ad1f1272a077f
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/thread/local.rs:262:9
  56:     0x55a1bfa7a8b4 - tokio::runtime::context::set_scheduler::h2cb5da6d7b12da78
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context.rs:180:9
  57:     0x55a1bfac3b41 - tokio::runtime::scheduler::multi_thread::worker::run::{{closure}}::h96779c9485ad4f21
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:495:9
  58:     0x55a1bfae0738 - tokio::runtime::context::runtime::enter_runtime::h29fc7a4a2869b82d
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/context/runtime.rs:65:16
  59:     0x55a1bfac38dc - tokio::runtime::scheduler::multi_thread::worker::run::h6eace7c28ac2b922
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:487:5
  60:     0x55a1bfac374b - tokio::runtime::scheduler::multi_thread::worker::Launch::launch::{{closure}}::he6b4d14c28a0883b
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/scheduler/multi_thread/worker.rs:455:45
  61:     0x55a1bfa6f90e - <tokio::runtime::blocking::task::BlockingTask<T> as core::future::future::Future>::poll::he6e3431f8825cf28
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/blocking/task.rs:42:21
  62:     0x55a1bfa84ddc - tokio::runtime::task::core::Core<T,S>::poll::{{closure}}::h4633c23cbb8cc266
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/core.rs:328:17
  63:     0x55a1bfa84b85 - tokio::loom::std::unsafe_cell::UnsafeCell<T>::with_mut::h187d7b8b502b7a49
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/loom/std/unsafe_cell.rs:16:9
  64:     0x55a1bfa84b85 - tokio::runtime::task::core::Core<T,S>::poll::h7e382c074f20a987
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/core.rs:317:13
  65:     0x55a1bfa5f51e - tokio::runtime::task::harness::poll_future::{{closure}}::h412be6f0182257d6
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:485:19
  66:     0x55a1bfa682b1 - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::h6f379f30f65594a0
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panic/unwind_safe.rs:272:9
  67:     0x55a1bfae3d0a - std::panicking::try::do_call::h34eb780b8285a7a8
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:559:40
  68:     0x55a1bfae490b - __rust_try
  69:     0x55a1bfae3a66 - std::panicking::try::hc9c39c24e49cc91a
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:523:19
  70:     0x55a1bfa90bfe - std::panic::catch_unwind::h0dfe85f9fa1b2b92
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panic.rs:149:14
  71:     0x55a1bfa5f060 - tokio::runtime::task::harness::poll_future::h041347f64bbe5702
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:473:18
  72:     0x55a1bfa5de8e - tokio::runtime::task::harness::Harness<T,S>::poll_inner::hc621d68fd720b1bd
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:208:27
  73:     0x55a1bfa5dd67 - tokio::runtime::task::harness::Harness<T,S>::poll::hbba7ee30f9891180
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/harness.rs:153:15
  74:     0x55a1bfae29dd - tokio::runtime::task::raw::poll::h500721c404efd4fb
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/raw.rs:271:5
  75:     0x55a1bfae2737 - tokio::runtime::task::raw::RawTask::poll::hfb7aa8ec0be652e1
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/raw.rs:201:18
  76:     0x55a1bfa98647 - tokio::runtime::task::UnownedTask<S>::run::hc39b1d699f277fbd
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/task/mod.rs:464:9
  77:     0x55a1bfa7ec57 - tokio::runtime::blocking::pool::Task::run::hc9dec42bbc255328
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/blocking/pool.rs:159:9
  78:     0x55a1bfa8126e - tokio::runtime::blocking::pool::Inner::run::he35afccea2d107a2
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/blocking/pool.rs:513:17
  79:     0x55a1bfa80f84 - tokio::runtime::blocking::pool::Spawner::spawn_thread::{{closure}}::h01162752c1eb0e76
                               at /home/tniessen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.38.0/src/runtime/blocking/pool.rs:471:13
  80:     0x55a1bfa782f6 - std::sys_common::backtrace::__rust_begin_short_backtrace::h99653254ba3d5ba9
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys_common/backtrace.rs:155:18
  81:     0x55a1bfa61ab2 - std::thread::Builder::spawn_unchecked_::{{closure}}::{{closure}}::h558e7af04d8e0c3d
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/thread/mod.rs:542:17
  82:     0x55a1bfa683f2 - <core::panic::unwind_safe::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once::he493946607d4038e
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panic/unwind_safe.rs:272:9
  83:     0x55a1bfae3ff3 - std::panicking::try::do_call::hc8719f7b42faef67
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:559:40
  84:     0x55a1bfae490b - __rust_try
  85:     0x55a1bfae3501 - std::panicking::try::h335bfbcfc5a42ed2
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:523:19
  86:     0x55a1bfa6187b - std::panic::catch_unwind::h501ee1d6e19a5e35
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panic.rs:149:14
  87:     0x55a1bfa6187b - std::thread::Builder::spawn_unchecked_::{{closure}}::h7c5901974bf7264e
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/thread/mod.rs:541:30
  88:     0x55a1bfaa78af - core::ops::function::FnOnce::call_once{{vtable.shim}}::h8fb647ee55bf93a7
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/ops/function.rs:250:5
  89:     0x55a1bfe59ffb - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h09e5a4c541afa800
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/alloc/src/boxed.rs:2022:9
  90:     0x55a1bfe59ffb - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h9c8b03c22f4e7026
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/alloc/src/boxed.rs:2022:9
  91:     0x55a1bfe59ffb - std::sys::pal::unix::thread::Thread::new::thread_start::h522bc89a54da820a
                               at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/sys/pal/unix/thread.rs:108:17
  92:     0x7f92a9f4455a - <unknown>
  93:     0x7f92a9fc1a3c - <unknown>
  94:                0x0 - <unknown>

To get vcard4 to work, I had to use this workaround in the first place:

let content: &[u8] = ...;
let text = String::from_utf8_lossy(content).replace(";CHARSET=UTF-8", "");
let vcards = vcard4::parse(text)?;

I unfortunately cannot share the input files, but I hope that the stack trace might be helpful. My assumption is that the PHOTO value is decoded but treated as text instead of binary data, but I honestly don't have much insight into the file format.

@tmpfs
Copy link
Owner

tmpfs commented Jun 26, 2024

Thanks for the bug report @tniessen , I would like to figure out what's going wrong here, it's either going to be the character encoding or multibyte UTF-8 characters not being handled properly.

Can you please first check if the input is valid UTF8 (I think it is but let's check), something like this:

let buf = std::fs::read(path).unwrap();
let str = std::str::from_utf8(&buf).unwrap();

Thanks 👍

@tmpfs
Copy link
Owner

tmpfs commented Jun 26, 2024

IIRC I don't parse PHOTO but expect people to call this function https://docs.rs/vcard4/latest/vcard4/struct.Vcard.html#method.parse_photo_jpeg

Will take another look though.

@tmpfs
Copy link
Owner

tmpfs commented Jun 26, 2024

Oh I just saw the ö in the error, can you find that character in the input and see where it is please, it shouldn't be in PHOTO as that is base64 encoded, it's probably in the property afterwards.

@tmpfs
Copy link
Owner

tmpfs commented Jun 27, 2024

Hey @tniessen, it looks like the issue was using . in the catch-all Text token which matches bytes rather than unicode code points.

Can you try your input against the code in the issue-14 branch and makes sure it fixes the issue for you, if so I will merge the PR and publish a new version to crates.io.

I added a test so I think we are good but let's just check first please 👍

Also can you raise a separate issue for your CHARSET replace hack as that shouldn't be necessary, thanks!

@tniessen
Copy link
Contributor Author

@tmpfs Thank you for the amazing and fast work on this! The input files are indeed valid UTF-8, but you are right, this is not because of the PHOTO but because of non-ASCII code points in some fields.

The issue-14 branch indeed does not appear to panic for these input files that panic in version 0.5.0!

@tmpfs
Copy link
Owner

tmpfs commented Jun 27, 2024

Cool @tniessen, that's merged and the v0.5.1 patch is up on crates.io 👍

@tmpfs tmpfs closed this as completed Jun 27, 2024
@tniessen
Copy link
Contributor Author

Thank you @tmpfs!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants