Fix more issues in PngChunk::readRawProfile

v0.27.3
Luis Díaz Más 7 years ago
parent 847da051c0
commit f5b40f3e82

@ -606,11 +606,6 @@ namespace Exiv2 {
DataBuf PngChunk::readRawProfile(const DataBuf& text,bool iTXt) DataBuf PngChunk::readRawProfile(const DataBuf& text,bool iTXt)
{ {
DataBuf info; DataBuf info;
register long i;
register unsigned char *dp;
const char *sp;
unsigned int nibbles;
long length;
unsigned char unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, unsigned char unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0, 0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0,
@ -627,8 +622,7 @@ namespace Exiv2 {
return info; return info;
} }
const char *sp = (char*)text.pData_+1;
sp = (char*)text.pData_+1;
int pointerPos = 1; int pointerPos = 1;
// Look for newline // Look for newline
@ -638,20 +632,30 @@ namespace Exiv2 {
pointerPos++; pointerPos++;
} }
// Look for length
while ((*sp == '\0' || *sp == ' ' || *sp == '\n') && pointerPos < (text.size_ - 1))
{
sp++;
pointerPos++;
}
if (pointerPos == (text.size_ - 1)) if (pointerPos == (text.size_ - 1))
{ {
return DataBuf(); return DataBuf();
} }
// Look for length long length = (long) atol(sp);
while (*sp == '\0' || *sp == ' ' || *sp == '\n') while (*sp != ' ' && *sp != '\n' && pointerPos < (text.size_ - 1))
{
sp++; sp++;
pointerPos++;
}
length = (long) atol(sp); if (pointerPos == (text.size_ - 1))
{
while (*sp != ' ' && *sp != '\n') return DataBuf();
sp++; }
// Allocate space // Allocate space
@ -674,10 +678,10 @@ namespace Exiv2 {
// Copy profile, skipping white space and column 1 "=" signs // Copy profile, skipping white space and column 1 "=" signs
dp = (unsigned char*)info.pData_; unsigned char *dp = (unsigned char*)info.pData_;
nibbles = length * 2; unsigned int nibbles = length * 2;
for (i = 0; i < (long) nibbles; i++) for (long i = 0; i < (long) nibbles; i++)
{ {
while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f')
{ {

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

@ -9,15 +9,17 @@ class PngReadRawProfile(metaclass=system_tests.CaseMeta):
filenames = [ filenames = [
system_tests.path("$data_path/issue_428_poc1.png"), system_tests.path("$data_path/issue_428_poc1.png"),
system_tests.path("$data_path/issue_428_poc2.png") system_tests.path("$data_path/issue_428_poc2.png"),
system_tests.path("$data_path/issue_428_poc3.png"),
system_tests.path("$data_path/issue_428_poc4.png"),
] ]
commands = ["$exiv2 " + fname for fname in filenames] commands = ["$exiv2 " + fname for fname in filenames]
stdout = [""] * 2 stdout = [""] * len(filenames)
stderr = [ stderr = [
"""$exiv2_exception_message """ + fname + """: """$exiv2_exception_message """ + fname + """:
$kerFailedToReadImageData $kerFailedToReadImageData
""" """
for fname in filenames for fname in filenames
] ]
retval = [1] * 2 retval = [1] * len(filenames)

Loading…
Cancel
Save