Skip to content

Commit

Permalink
Fixed wrong brackets: size*count + pad can overflow before the cast
Browse files Browse the repository at this point in the history
=> Should fix #76 (most of the work has been done by Robin Mills in
   6e3855a)

The problem with #76 is the contents of the 26th IFD, with the
following contents:
tag: 0x8649
type: 0x1
count: 0xffff ffff
offset: 0x4974

The issue is the size of count (uint32_t), as adding anything to it
causes an overflow. Especially the expression:
(size*count + pad+20)
results in an overflow and gives 20 as a result instead of
0x100000014, thus the condition in the if in the next line is false
and the program continues to run (until it crashes at io.read).

To properly account for the overflow, the brackets have to be removed,
as then the result is saved in the correctly sized type and not cast
after being calculated in the smaller type.
  • Loading branch information
D4N committed Oct 15, 2017
1 parent 7f5b077 commit 1e07c98
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/image.cpp
Expand Up @@ -401,7 +401,7 @@ namespace Exiv2 {
// if ( offset > io.size() ) offset = 0; // Denial of service?

// #55 memory allocation crash test/data/POC8
long long allocate = (long long) (size*count + pad+20);
long long allocate = (long long) size*count + pad+20;
if ( allocate > (long long) io.size() ) {
throw Error(57);
}
Expand Down

0 comments on commit 1e07c98

Please sign in to comment.