diff options
author | Insun Kang <insun@google.com> | 2016-05-09 01:31:15 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-05-09 01:31:15 +0000 |
commit | e7dac1df82813884eeacb48953638c7e9a438977 (patch) | |
tree | 7befb937ba84dafd00fa498d623f6ab9cc682b3a | |
parent | c2702fcd385410b17a0448cbf047ae6d2b75e892 (diff) | |
parent | 8385cc7c72694079c13f0135b0deee97ab5ee66d (diff) | |
download | jhead-nougat-mr1-wear-release.tar.gz |
Merge "Fixes the crash issues caused by exif corruption in jhead."android-wear-n-preview-3android-wear-n-preview-2android-wear-n-preview-1android-wear-7.1.1_r1android-n-preview-5android-n-preview-4android-n-preview-3android-n-iot-preview-2nougat-mr1-wear-releasen-iot-preview-2
-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 |