Skip to content

Panic is not a char boundary in src/id3/v2/read.rs #477

@qarmin

Description

@qarmin

Reproducer

I tried this code:

#![no_main]

use libfuzzer_sys::{fuzz_target, Corpus};
use lofty::file::AudioFile;
use lofty::file::{FileType, TaggedFileExt};
use lofty::probe::Probe;

const ALL_FILE_TYPES: &[FileType] = &[
    FileType::Aac,
    FileType::Aiff,
    FileType::Ape,
    FileType::Flac,
    FileType::Mpeg,
    FileType::Mp4,
    FileType::Mpc,
    FileType::Opus,
    FileType::Vorbis,
    FileType::Speex,
    FileType::Wav,
    FileType::WavPack,
];

fuzz_target!(|data: &[u8]| -> Corpus {
    let mut corpus = Corpus::Reject;
    for i in ALL_FILE_TYPES {
        let s = std::io::Cursor::new(data);
        let tagged_file = match Probe::with_file_type(s, *i).read() {
            Ok(t) => t,
            Err(_e) => {
                continue;
            }
        };
        corpus = Corpus::Keep;
        tagged_file.properties();
        tagged_file.tags();
        tagged_file.primary_tag();
    }

    corpus
});

Summary

thread 'main' panicked at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/id3/v2/read.rs:90:45:
byte index 2 is not a char boundary; it is inside 'à' (bytes 1..3) of `3àL`
stack backtrace:
   0: rust_begin_unwind
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:662:5
   1: core::panicking::panic_fmt
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/panicking.rs:74:14
   2: core::str::slice_error_fail_rt
   3: core::str::slice_error_fail
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/str/mod.rs:68:5
   4: core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::RangeTo<usize>>::index
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/str/traits.rs:470:21
   5: core::str::traits::<impl core::ops::index::Index<I> for str>::index
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/str/traits.rs:60:15
   6: lofty::id3::v2::read::construct_tdrc_from_v3
             at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/id3/v2/read.rs:90:36
   7: lofty::id3::v2::read::parse_id3v2
             at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/id3/v2/read.rs:46:3
   8: lofty::mpeg::read::read_from
             at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/mpeg/read.rs:47:18
   9: <lofty::mpeg::MpegFile as lofty::file::audio_file::AudioFile>::read_from
             at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/mpeg/mod.rs:17:10
  10: lofty::probe::Probe<R>::read
             at /home/rafal/.cargo/git/checkouts/lofty-rs-f5e48f8219b271cf/4a2bcf5/lofty/src/probe.rs:472:23
  11: lofty::check_file
             at /home/rafal/Projekty/Rust/run_command_for_every_file/src/crates/lofty/src/main.rs:42:33
  12: lofty::main
             at /home/rafal/Projekty/Rust/run_command_for_every_file/src/crates/lofty/src/main.rs:26:9
  13: core::ops::function::FnOnce::call_once
             at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Aborted (core dumped)

Expected behavior

No response

Assets

crash-b8f2fc10e2ab6c4e60c371aea3949871fc61a39b_minimized.zip

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions