#1199 Spit'n'polish on the loops in printStructure(), metadataRead() and doWriteMetadata(). Added tests with even byte count for ICCP and XMP Chunks.

v0.27.3
Robin Mills 9 years ago
parent ed7b20a20e
commit 027b3917ec

@ -182,7 +182,7 @@ namespace Exiv2 {
/* Verify for a VP8X Chunk First before writing in
case we have any exif or xmp data, also check
for any chunks with alpha frame/layer set */
while (!io_->eof()) {
while ( !io_->eof() && (uint64_t) io_->tell() < filesize) {
io_->read(chunkId.pData_, WEBP_TAG_SIZE);
io_->read(size_buff, WEBP_TAG_SIZE);
long size = Exiv2::getULong(size_buff, littleEndian);
@ -306,13 +306,7 @@ namespace Exiv2 {
}
io_->seek(12, BasicIo::beg);
while (!io_->eof()) {
uint64_t offset = io_->tell();
if (offset >= filesize) {
break;
}
while ( !io_->eof() && (uint64_t) io_->tell() < filesize) {
io_->read(chunkId.pData_, 4);
io_->read(size_buff, 4);
@ -375,19 +369,10 @@ namespace Exiv2 {
throw Error(21);
}
if (outIo.tell() % 2) { // pad
if (outIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(21);
}
offset = io_->tell();
// Encoder required to pad odd sized data with a null byte
if (outIo.tell() % 2) {
if (outIo.write(&WEBP_PAD_ODD, 1) != 1) throw Error(21);
}
if (offset >= filesize) {
break;
}
}
if (has_exif) {
@ -456,13 +441,13 @@ namespace Exiv2 {
}
io_->seek(0,BasicIo::beg); // rewind
uint64_t offset = (uint64_t) io_->tell();
while (!io_->eof() && offset < filesize ) {
while ( !io_->eof() && (uint64_t) io_->tell() < filesize) {
uint64_t offset = (uint64_t) io_->tell();
byte size_buff[WEBP_TAG_SIZE];
io_->read(chunkId.pData_, WEBP_TAG_SIZE);
io_->read(size_buff, WEBP_TAG_SIZE);
long size = Exiv2::getULong(size_buff, littleEndian);
DataBuf payload(offset?size:WEBP_TAG_SIZE); // header is a bit of a dummy! (different from other chunks)
DataBuf payload(offset?size:WEBP_TAG_SIZE); // header is different from chunks
io_->read(payload.pData_, payload.size_);
if ( bPrint ) {
@ -485,8 +470,7 @@ namespace Exiv2 {
out.write((const char*) payload.pData_,payload.size_);
}
if ( offset && (payload.size_ % 2)) io_->read(size_buff,1); // skip padding byte on sub-chunks
offset = (uint64_t) io_->tell();
if ( offset && io_->tell() % 2 ) io_->seek(+1, BasicIo::cur); // skip padding byte on sub-chunks
}
}
}
@ -518,18 +502,14 @@ namespace Exiv2 {
{
DataBuf chunkId(5);
byte size_buff[WEBP_TAG_SIZE];
bool has_canvas_data = false;
bool has_canvas_data = false;
#ifdef DEBUG
std::cout << "Reading metadata" << std::endl;
#endif
chunkId.pData_[4] = '\0' ;
while ((uint64_t)io_->tell() < filesize) {
if ((uint64_t)(io_->tell() + 2) >= (uint64_t) io_->size()){
break;
}
while ( !io_->eof() && (uint64_t) io_->tell() < filesize) {
io_->read(chunkId.pData_, WEBP_TAG_SIZE);
io_->read(size_buff, WEBP_TAG_SIZE);
long size = Exiv2::getULong(size_buff, littleEndian);

@ -297,6 +297,22 @@ STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
XMP | 2864 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP
VP8X | 10 | 12 | ,........
ICCP | 560 | 30 | ...0ADBE....mntrRGB XYZ ........
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
XMP | 2864 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 187526 | 0 | WEBP
VP8X | 10 | 12 | ,........
ICCP | 560 | 30 | ...0ADBE....mntrRGB XYZ ........
VP8 | 172008 | 598 | .G...*.. .>1..B.!..o.. ......]..
EXIF | 12040 | 172614 | II*........................... .
XMP | 2864 | 184662 | <?xpacket begin="..." id="W5M0Mp
STRUCTURE OF WEBP FILE: exiv2-bug1199.webp
Chunk | Length | Offset | Payload
RIFF | 189580 | 0 | WEBP

@ -35,6 +35,17 @@ source ./functions.source
exiv2 -pS $filename
printf "XMP " >&3
# copy the XMP from the test file
copyTestFile $filename
exiv2 -pX $filename > $xmp_name;
exiv2 -ea --force $filename
copyTestFile $filename
exiv2 -pS $filename
exiv2 -iX $filename
exiv2 -pS $filename
exiv2 -ix $filename
# copy the XMP from Reagan.tiff to test file
copyTestFile Reagan.tiff
exiv2 -pX Reagan.tiff > $xmp_name;
@ -61,12 +72,12 @@ source ./functions.source
exiv2 -pS $filename
printf "EXIF " >&3
copyTestFile exiv2-bug937.jpg $filename
exiv2 --force -ea $filename
copyTestFile $filename
exiv2 -pS $filename
exiv2 -ie $filename
exiv2 -pS $filename
copyTestFile exiv2-bug937.jpg $filename
exiv2 --force -ea $filename
copyTestFile $filename
exiv2 -pS $filename
exiv2 -ie $filename
exiv2 -pS $filename
) 3>&1 > $results 2>&1

Loading…
Cancel
Save