Merge pull request #77 from Farkal/read_ascii_in_offset

Read ascii encoded in offset
This commit is contained in:
HeroicKatora authored and GitHub committed 2020-07-24 02:25:17 +02:00
commit a471591f06
2 files changed
+17 -7

No files matched your search

+11 -3
View File
@@ -198,9 +198,17 @@ impl Entry {
if n > limits.decoding_buffer_size { if n > limits.decoding_buffer_size {
return Err(TiffError::LimitsExceeded); return Err(TiffError::LimitsExceeded);
} }
decoder.goto_offset(self.r(bo).read_u32()?)?; if n <= 4 {
let string = decoder.read_string(n)?; let mut buf = vec![0; n];
Ok(Ascii(string)) self.r(bo).read_exact(&mut buf )?;
let v = String::from_utf8(buf)?;
let v = v.trim_matches(char::from(0));
Ok(Ascii(v.into()))
} else {
decoder.goto_offset(self.r(bo).read_u32()?)?;
let string = decoder.read_string(n)?;
Ok(Ascii(string))
}
} }
_ => Err(TiffError::UnsupportedError( _ => Err(TiffError::UnsupportedError(
TiffUnsupportedError::UnsupportedDataType, TiffUnsupportedError::UnsupportedDataType,
+6 -4
View File
@@ -424,11 +424,13 @@ impl<R: Read + Seek> Decoder<R> {
/// Reads a string /// Reads a string
#[inline] #[inline]
pub fn read_string(&mut self, length: usize) -> TiffResult<String> { pub fn read_string(&mut self, length: usize) -> TiffResult<String> {
let mut out = String::with_capacity(length); let mut out = vec![0; length];
self.reader.read_to_string(&mut out)?; self.reader.read_exact(&mut out)?;
// Strings may be null-terminated, so we trim anything downstream of the null byte // Strings may be null-terminated, so we trim anything downstream of the null byte
let trimmed = out.bytes().take_while(|&n| n != 0).collect::<Vec<u8>>(); if let Some(first) = out.iter().position(|&b| b == 0) {
Ok(String::from_utf8(trimmed)?) out.truncate(first);
}
Ok(String::from_utf8(out)?)
} }
/// Reads a TIFF IFA offset/value field /// Reads a TIFF IFA offset/value field