diff --git a/crates/pile-flac/src/reader/reader.rs b/crates/pile-flac/src/reader/reader.rs index 46cd4e0..ec10853 100644 --- a/crates/pile-flac/src/reader/reader.rs +++ b/crates/pile-flac/src/reader/reader.rs @@ -1,10 +1,20 @@ -use std::io::{Read, Seek, SeekFrom}; +use std::io::{ErrorKind, Read, Seek, SeekFrom}; use crate::{ FlacBlock, FlacDecodeError, blocks::{FlacAudioFrame, FlacMetablockHeader, FlacMetablockType}, }; +fn read_exact_flac(reader: &mut R, buf: &mut [u8]) -> Result<(), FlacDecodeError> { + reader.read_exact(buf).map_err(|e| { + if e.kind() == ErrorKind::UnexpectedEof { + FlacDecodeError::MalformedBlock + } else { + e.into() + } + }) +} + // TODO: quickly skip blocks we do not need /// The next block we expect to read @@ -42,9 +52,9 @@ impl Iterator for FlacReader { ReaderState::MagicBits => { let mut data = [0u8; 4]; - if let Err(e) = self.inner.read_exact(&mut data[..4]) { + if let Err(e) = read_exact_flac(&mut self.inner, &mut data[..4]) { self.state = ReaderState::Done; - return Some(Err(e.into())); + return Some(Err(e)); } if data != [0x66, 0x4C, 0x61, 0x43] { @@ -57,9 +67,9 @@ impl Iterator for FlacReader { ReaderState::MetablockHeader { is_first } => { let mut data = [0u8; 4]; - if let Err(e) = self.inner.read_exact(&mut data[..]) { + if let Err(e) = read_exact_flac(&mut self.inner, &mut data[..]) { self.state = ReaderState::Done; - return Some(Err(e.into())); + return Some(Err(e)); } let header = match FlacMetablockHeader::decode(&data) { @@ -80,9 +90,9 @@ impl Iterator for FlacReader { ReaderState::MetaBlock { header } => { let mut data = vec![0u8; header.length as usize]; - if let Err(e) = self.inner.read_exact(&mut data) { + if let Err(e) = read_exact_flac(&mut self.inner, &mut data) { self.state = ReaderState::Done; - return Some(Err(e.into())); + return Some(Err(e)); } let block = match FlacBlock::decode(header.block_type, &data) {