From f2f5726d7b8ca121b9e64f4cfd07e7f86dd3b83d Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 16 Mar 2026 19:17:51 -0700 Subject: [PATCH] FLAC error edits --- crates/pile-flac/src/reader/reader.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) 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) {