From f5754159cb2c47ef373b2a6c928fbd5b4783ad21 Mon Sep 17 00:00:00 2001 From: Emmanuel Antony Date: Sat, 20 Mar 2021 08:47:47 +0530 Subject: [PATCH] Modified the validation for ascii tag type --- src/decoder/ifd.rs | 11 ++++++++--- src/error.rs | 7 +++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 383792d..5ef71d5 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -4,6 +4,7 @@ use std::collections::HashMap; use std::convert::{TryFrom, TryInto}; use std::io::{self, Read, Seek}; use std::mem; +use std::str; use super::stream::{ByteOrder, EndianReader, SmartReader}; use crate::tags::{Tag, Type}; @@ -420,9 +421,13 @@ impl Entry { Type::ASCII => { let mut buf = vec![0; self.count as usize]; self.r(bo).read_exact(&mut buf)?; - let v = String::from_utf8(buf)?; - let v = v.trim_matches(char::from(0)); - return Ok(Ascii(v.into())); + if buf.is_ascii() && buf.ends_with(&[0]) { + let v = str::from_utf8(&buf)?; + let v = v.trim_matches(char::from(0)); + return Ok(Ascii(v.into())); + } else { + return Err(TiffError::FormatError(TiffFormatError::InvalidTag)); + } } Type::UNDEFINED => { return Ok(List( diff --git a/src/error.rs b/src/error.rs index 30a2635..67e0e7e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,6 +1,7 @@ use std::error::Error; use std::fmt; use std::io; +use std::str; use std::string; use crate::decoder::ifd::Value; @@ -246,6 +247,12 @@ impl From for TiffError { } } +impl From for TiffError { + fn from(_err: str::Utf8Error) -> TiffError { + TiffError::FormatError(TiffFormatError::InvalidTag) + } +} + impl From for TiffError { fn from(_err: string::FromUtf8Error) -> TiffError { TiffError::FormatError(TiffFormatError::InvalidTag)