summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Grenier <grenier@cgsecurity.org>2019-11-16 17:30:27 +0100
committerChristophe Grenier <grenier@cgsecurity.org>2019-11-16 17:30:27 +0100
commit7f8425d8398ea96a9d5e9a99f3c4ed58c2485215 (patch)
tree81e5ba5349b0b093ea54b74069281c70e46d0d7d
parente474cb0c6e01f195176d69a82ea2c97f021142b1 (diff)
New prototype for find_tag_from_tiff_header()
-rw-r--r--src/file_jpg.c17
-rw-r--r--src/file_tiff.c39
-rw-r--r--src/file_tiff.h8
3 files changed, 36 insertions, 28 deletions
diff --git a/src/file_jpg.c b/src/file_jpg.c
index e7dd47f..cb25828 100644
--- a/src/file_jpg.c
+++ b/src/file_jpg.c
@@ -1493,20 +1493,18 @@ static uint64_t jpg_check_structure(file_recovery_t *file_recovery, const unsign
if(i+0x0A < nbytes && 2+size > 0x0A)
{
const char *potential_error=NULL;
- const TIFFHeader *tiff=(const TIFFHeader*)&buffer[i+0x0A];
const unsigned char *tiff_buffer=&buffer[i+0x0A];
unsigned int tiff_size=2+size-0x0A;
- const char *thumb_data=NULL;
- const char *ifbytecount=NULL;
+ unsigned int thumb_size=0;
if(nbytes - (i+0x0A) < tiff_size)
tiff_size=nbytes - (i+0x0A);
if(file_recovery->time==0)
file_recovery->time=get_date_from_tiff_header(tiff_buffer, tiff_size);
- thumb_data=find_tag_from_tiff_header(tiff, tiff_size, TIFFTAG_JPEGIFOFFSET, &potential_error);
- if(thumb_data!=NULL)
+ thumb_offset=find_tag_from_tiff_header(tiff_buffer, tiff_size, TIFFTAG_JPEGIFOFFSET, &potential_error);
+ if(thumb_offset!=0)
{
- thumb_offset=thumb_data-(const char*)buffer;
- ifbytecount=find_tag_from_tiff_header(tiff, tiff_size, TIFFTAG_JPEGIFBYTECOUNT, &potential_error);
+ thumb_offset+=i+0x0A;
+ thumb_size=find_tag_from_tiff_header(tiff_buffer, tiff_size, TIFFTAG_JPEGIFBYTECOUNT, &potential_error);
}
if(potential_error!=NULL)
{
@@ -1515,9 +1513,8 @@ static uint64_t jpg_check_structure(file_recovery_t *file_recovery, const unsign
}
if(file_recovery->offset_ok<i)
file_recovery->offset_ok=i;
- if(thumb_data!=NULL && ifbytecount!=NULL)
+ if(thumb_offset!=0 && thumb_size!=0)
{
- const unsigned int thumb_size=ifbytecount-(const char*)tiff;
if(thumb_offset < nbytes - 1)
{
unsigned int j=thumb_offset+2;
@@ -1606,7 +1603,7 @@ static uint64_t jpg_check_structure(file_recovery_t *file_recovery, const unsign
*(sep+1)='t';
if((out=fopen(thumbname,"wb"))!=NULL)
{
- if(fwrite(thumb_data, thumb_size, 1, out) < 1)
+ if(fwrite(&buffer[thumb_offset], thumb_size, 1, out) < 1)
{
log_error("Can't write to %s: %s\n", thumbname, strerror(errno));
}
diff --git a/src/file_tiff.c b/src/file_tiff.c
index 33c7786..346dc08 100644
--- a/src/file_tiff.c
+++ b/src/file_tiff.c
@@ -137,38 +137,49 @@ const char *tag_name(unsigned int tag)
}
#endif
-const char *find_tag_from_tiff_header(const TIFFHeader *tiff, const unsigned int tiff_size, const unsigned int tag, const char **potential_error)
+unsigned int find_tag_from_tiff_header(const unsigned char*buffer, const unsigned int buffer_size, const unsigned int tag, const char **potential_error)
{
- if(tiff_size < sizeof(TIFFHeader))
- return NULL;
+ const TIFFHeader *tiff=(const TIFFHeader *)buffer;
+ if(buffer_size < sizeof(TIFFHeader))
+ return 0;
#ifndef MAIN_tiff_le
if(tiff->tiff_magic==TIFF_BIGENDIAN)
- return find_tag_from_tiff_header_be(tiff, tiff_size, tag, potential_error);
+ {
+ const unsigned char *tmp=(const unsigned char *)find_tag_from_tiff_header_be(tiff, buffer_size, tag, potential_error);
+ if(tmp==NULL)
+ return 0;
+ return tmp-buffer;
+ }
#endif
#ifndef MAIN_tiff_be
if(tiff->tiff_magic==TIFF_LITTLEENDIAN)
- return find_tag_from_tiff_header_le(tiff, tiff_size, tag, potential_error);
+ {
+ const unsigned char *tmp=(const unsigned char *)find_tag_from_tiff_header_le(tiff, buffer_size, tag, potential_error);
+ if(tmp==NULL)
+ return 0;
+ return tmp-buffer;
+ }
#endif
- return NULL;
+ return 0;
}
time_t get_date_from_tiff_header(const unsigned char *buffer, const unsigned int buffer_size)
{
const char *potential_error=NULL;
- const unsigned char *date_asc;
+ unsigned int date_asc;
if(buffer_size < sizeof(TIFFHeader) || buffer_size < 19)
return (time_t)0;
/*@ assert buffer_size >= sizeof(TIFFHeader); */
/* DateTimeOriginal */
- date_asc=(const unsigned char *)find_tag_from_tiff_header((const TIFFHeader *)buffer, buffer_size, 0x9003, &potential_error);
+ date_asc=find_tag_from_tiff_header(buffer, buffer_size, 0x9003, &potential_error);
/* DateTimeDigitalized*/
- if(date_asc==NULL || date_asc < buffer || &date_asc[18] >= buffer + buffer_size)
- date_asc=(const unsigned char *)find_tag_from_tiff_header((const TIFFHeader *)buffer, buffer_size, 0x9004, &potential_error);
- if(date_asc==NULL || date_asc < buffer || &date_asc[18] >= buffer + buffer_size)
- date_asc=(const unsigned char *)find_tag_from_tiff_header((const TIFFHeader *)buffer, buffer_size, 0x132, &potential_error);
- if(date_asc==NULL || date_asc < buffer || &date_asc[18] >= buffer + buffer_size)
+ if(date_asc==0 || date_asc >= buffer_size - 19)
+ date_asc=find_tag_from_tiff_header(buffer, buffer_size, 0x9004, &potential_error);
+ if(date_asc==0 || date_asc >= buffer_size - 19)
+ date_asc=find_tag_from_tiff_header(buffer, buffer_size, 0x132, &potential_error);
+ if(date_asc==0 || date_asc >= buffer_size - 19)
return (time_t)0;
- return get_time_from_YYYY_MM_DD_HH_MM_SS(date_asc);
+ return get_time_from_YYYY_MM_DD_HH_MM_SS(&buffer[date_asc]);
}
static void register_header_check_tiff(file_stat_t *file_stat)
diff --git a/src/file_tiff.h b/src/file_tiff.h
index 1882b6a..3cd6a63 100644
--- a/src/file_tiff.h
+++ b/src/file_tiff.h
@@ -69,16 +69,16 @@ struct ifd_header {
} __attribute__ ((gcc_struct, __packed__));
/*@
- @ requires tiff_size >= sizeof(TIFFHeader);
+ @ requires buffer_size >= sizeof(TIFFHeader);
@ requires \valid_read(buffer+(0..buffer_size-1));
@*/
time_t get_date_from_tiff_header(const unsigned char*buffer, const unsigned int buffer_size);
/*@
- @ requires \valid_read((const unsigned char *)tiff+(0..tiff_size-1));
- @ requires \separated(potential_error, tiff);
+ @ requires \valid_read(buffer+(0..buffer_size-1));
+ @ requires \separated(potential_error, buffer);
@*/
-const char *find_tag_from_tiff_header(const TIFFHeader *tiff, const unsigned int tiff_size, const unsigned int tag, const char **potential_error);
+unsigned int find_tag_from_tiff_header(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int tag, const char **potential_error);
#ifndef MAIN_tiff_be
/*@