Factor our function to read PNG Chunk info

v0.27.3
Luis Díaz Más 6 years ago
parent 914a8c5585
commit d1097fab59

@ -389,6 +389,17 @@ namespace Exiv2 {
} }
} }
void readChunk(DataBuf& buffer, BasicIo& io)
{
long bufRead = io.read(buffer.pData_, buffer.size_);
if (io.error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != buffer.size_) {
throw Error(kerInputDataReadFailed);
}
}
void PngImage::readMetadata() void PngImage::readMetadata()
{ {
#ifdef DEBUG #ifdef DEBUG
@ -405,23 +416,15 @@ namespace Exiv2 {
clearMetadata(); clearMetadata();
const long imgSize = (long) io_->size(); const long imgSize = (long) io_->size();
DataBuf cheaderBuf(8); // Chunk header size : 4 bytes (data size) + 4 bytes (chunk type). DataBuf cheaderBuf(8); // Chunk header: 4 bytes (data size) + 4 bytes (chunk type).
while(!io_->eof()) while(!io_->eof())
{ {
// Read chunk header.
#ifdef DEBUG #ifdef DEBUG
std::cout << "Exiv2::PngImage::readMetadata: Position: " << io_->tell() << std::endl; std::cout << "Exiv2::PngImage::readMetadata: Position: " << io_->tell() << std::endl;
#endif #endif
std::memset(cheaderBuf.pData_, 0x0, cheaderBuf.size_); std::memset(cheaderBuf.pData_, 0x0, cheaderBuf.size_);
long bufRead = io_->read(cheaderBuf.pData_, cheaderBuf.size_); readChunk(cheaderBuf, *io_); // Read chunk header.
if (io_->error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != cheaderBuf.size_) {
throw Error(kerInputDataReadFailed);
}
// Decode chunk data length. // Decode chunk data length.
uint32_t dataOffset = Exiv2::getULong(cheaderBuf.pData_, Exiv2::bigEndian); uint32_t dataOffset = Exiv2::getULong(cheaderBuf.pData_, Exiv2::bigEndian);
@ -445,16 +448,8 @@ namespace Exiv2 {
!memcmp(cheaderBuf.pData_ + 4, "iTXt", 4) || !memcmp(cheaderBuf.pData_ + 4, "iTXt", 4) ||
!memcmp(cheaderBuf.pData_ + 4, "iCCP", 4)) !memcmp(cheaderBuf.pData_ + 4, "iCCP", 4))
{ {
// Extract chunk data.
DataBuf cdataBuf(dataOffset); DataBuf cdataBuf(dataOffset);
bufRead = io_->read(cdataBuf.pData_, dataOffset); readChunk(cdataBuf, *io_); // Extract chunk data.
if (io_->error()) {
throw Error(kerFailedToReadImageData);
}
if (bufRead != (long)dataOffset) {
throw Error(kerInputDataReadFailed);
}
if (!memcmp(cheaderBuf.pData_ + 4, "IEND", 4)) if (!memcmp(cheaderBuf.pData_ + 4, "IEND", 4))
{ {

Loading…
Cancel
Save