diff options
author | Insun Kang <insun@google.com> | 2016-05-09 01:40:05 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-05-09 01:40:05 +0000 |
commit | fa25efff717631d9728d482e4d4a504ab07f39b6 (patch) | |
tree | 6d079911bbef02a446ade5543f29be88fa835401 | |
parent | 2cbe01bf1d96c5770329ed1eaee7251400e44a36 (diff) | |
parent | dd71aecc726f9d8b5534d0902406d41bfaa487b8 (diff) | |
download | jhead-fa25efff717631d9728d482e4d4a504ab07f39b6.tar.gz |
Merge "Fixes the crash issues caused by exif corruption in jhead." am: e7dac1df82
am: dd71aecc72
* commit 'dd71aecc726f9d8b5534d0902406d41bfaa487b8':
Fixes the crash issues caused by exif corruption in jhead.
Change-Id: Ic45a855d8f2c03c9ee2361da8640a553cd720c41
-rw-r--r-- | exif.c | 54 | ||||
-rw-r--r-- | jhead.h | 1 |
2 files changed, 50 insertions, 5 deletions
@@ -383,6 +383,51 @@ unsigned Get32u(void * Long) } //-------------------------------------------------------------------------- +// Convert a 64 bit signed value from file's native byte order +//-------------------------------------------------------------------------- +long long Get64s(void * LLong) +{ + uchar * ValuePtr = (uchar *)LLong; + if (MotorolaOrder){ + return (((long long)ValuePtr[0]) << 56) | (((ullong)ValuePtr[1]) << 48) + | ((( ullong)ValuePtr[2]) << 40) | (((ullong)ValuePtr[3]) << 32) + | ((( ullong)ValuePtr[4]) << 24) | (((ullong)ValuePtr[5]) << 16) + | ((( ullong)ValuePtr[6]) << 8 ) | (((ullong)ValuePtr[7]) << 0 ); + }else{ + return (((long long)ValuePtr[7]) << 56) | (((ullong)ValuePtr[6]) << 48) + | ((( ullong)ValuePtr[5]) << 40) | (((ullong)ValuePtr[4]) << 32) + | ((( ullong)ValuePtr[3]) << 24) | (((ullong)ValuePtr[2]) << 16) + | ((( ullong)ValuePtr[1]) << 8 ) | (((ullong)ValuePtr[0]) << 0 ); + } +} + +//-------------------------------------------------------------------------- +// Convert a 64 bit double value from signed long long value +//-------------------------------------------------------------------------- +double Get64d(void * Double) +{ + union { + double ret; + long long var; + }data; + data.var = Get64s(Double); + return data.ret; +} + +//-------------------------------------------------------------------------- +// Convert a 32 bit float value from signed int value +//-------------------------------------------------------------------------- +float Get32f(void * Float) +{ + union { + float ret; + int var; + }data; + data.var = Get32s(Float); + return data.ret; +} + +//-------------------------------------------------------------------------- // Display a number as one of its many formats //-------------------------------------------------------------------------- void PrintFormatNumber(void * ValuePtr, int Format, int ByteCount) @@ -403,8 +448,8 @@ void PrintFormatNumber(void * ValuePtr, int Format, int ByteCount) s = 8; break; - case FMT_SINGLE: printf("%f",(double)*(float *)ValuePtr); s=8; break; - case FMT_DOUBLE: printf("%f",*(double *)ValuePtr); s=8; break; + case FMT_SINGLE: printf("%f",Get32f(ValuePtr)); s=4; break; + case FMT_DOUBLE: printf("%f",Get64d(ValuePtr)); s=8; break; default: printf("Unknown format %d:", Format); return; @@ -451,9 +496,8 @@ double ConvertAnyFormat(void * ValuePtr, int Format) case FMT_SSHORT: Value = (signed short)Get16u(ValuePtr); break; case FMT_SLONG: Value = Get32s(ValuePtr); break; - // Not sure if this is correct (never seen float used in Exif format) - case FMT_SINGLE: Value = (double)*(float *)ValuePtr; break; - case FMT_DOUBLE: Value = *(double *)ValuePtr; break; + case FMT_SINGLE: Value = Get32f(ValuePtr); break; + case FMT_DOUBLE: Value = Get64d(ValuePtr); break; default: ErrNonfatal("Illegal format code %d",Format,0); @@ -30,6 +30,7 @@ typedef unsigned char uchar; +typedef unsigned long long ullong; #ifndef TRUE #define TRUE 1 |