summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Grenier <grenier@cgsecurity.org>2014-07-24 23:43:29 +0200
committerChristophe Grenier <grenier@cgsecurity.org>2014-07-24 23:43:29 +0200
commit1af19422ebcd82a6165599e71082a18c2d0813ca (patch)
tree0c2f721ba09d928a6679b10872ac039a7590f8c9
parent6b1e0e58d21df8700274de3c44da827449a918a4 (diff)
PhotoRec: stricter checl for .dss
-rw-r--r--src/file_dss.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/file_dss.c b/src/file_dss.c
index 5769837..afaa1f8 100644
--- a/src/file_dss.c
+++ b/src/file_dss.c
@@ -29,6 +29,7 @@
#include <time.h>
#endif
#include <stdio.h>
+#include <ctype.h>
#include "types.h"
#include "filegen.h"
@@ -45,7 +46,6 @@ const file_hint_t file_hint_dss= {
.register_header_check=&register_header_check_dss
};
-static const unsigned char dss_header[4]= { 0x02, 'd','s','s'};
/*
Digital Speech Standard (.dss) is a digital speech recording standard
which was jointly developed and introduced by Olympus, Grundig and
@@ -59,33 +59,35 @@ static const unsigned char dss_header[4]= { 0x02, 'd','s','s'};
Filesize is always a multiple of 512
*/
-static void register_header_check_dss(file_stat_t *file_stat)
+
+static int header_check_dss(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new)
{
- register_header_check(0, dss_header,sizeof(dss_header), &header_check_dss, file_stat);
+ struct tm tm_time;
+ const unsigned char *date_asc=&buffer[0x26];
+ unsigned int i;
+ for(i=0; i<24; i++)
+ if(!isdigit(date_asc[i]))
+ return 0;
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->extension=file_hint_dss.extension;
+ /* File should be big enough to hold the comments */
+ file_recovery_new->min_filesize=100+0x31E;
+ memset(&tm_time, 0, sizeof(tm_time));
+ tm_time.tm_sec=(date_asc[10]-'0')*10+(date_asc[11]-'0'); /* seconds 0-59 */
+ tm_time.tm_min=(date_asc[8]-'0')*10+(date_asc[9]-'0'); /* minutes 0-59 */
+ tm_time.tm_hour=(date_asc[6]-'0')*10+(date_asc[7]-'0'); /* hours 0-23*/
+ tm_time.tm_mday=(date_asc[4]-'0')*10+(date_asc[5]-'0'); /* day of the month 1-31 */
+ tm_time.tm_mon=(date_asc[2]-'0')*10+(date_asc[3]-'0')-1; /* month 1-12 */
+ tm_time.tm_year=(date_asc[0]-'0')*10+(date_asc[1]-'0'); /* year */
+ if(tm_time.tm_year<80)
+ tm_time.tm_year+=100; /* year 2000 - 2079 */
+ tm_time.tm_isdst = -1; /* unknown daylight saving time */
+ file_recovery_new->time=mktime(&tm_time);
+ return 1;
}
-static int header_check_dss(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new)
+static void register_header_check_dss(file_stat_t *file_stat)
{
- if(memcmp(buffer,dss_header,sizeof(dss_header))==0)
- {
- struct tm tm_time;
- const unsigned char *date_asc=&buffer[0x26];
- reset_file_recovery(file_recovery_new);
- file_recovery_new->extension=file_hint_dss.extension;
- /* File should be big enough to hold the comments */
- file_recovery_new->min_filesize=100+0x31E;
- memset(&tm_time, 0, sizeof(tm_time));
- tm_time.tm_sec=(date_asc[10]-'0')*10+(date_asc[11]-'0'); /* seconds 0-59 */
- tm_time.tm_min=(date_asc[8]-'0')*10+(date_asc[9]-'0'); /* minutes 0-59 */
- tm_time.tm_hour=(date_asc[6]-'0')*10+(date_asc[7]-'0'); /* hours 0-23*/
- tm_time.tm_mday=(date_asc[4]-'0')*10+(date_asc[5]-'0'); /* day of the month 1-31 */
- tm_time.tm_mon=(date_asc[2]-'0')*10+(date_asc[3]-'0')-1; /* month 1-12 */
- tm_time.tm_year=(date_asc[0]-'0')*10+(date_asc[1]-'0'); /* year */
- if(tm_time.tm_year<80)
- tm_time.tm_year+=100; /* year 2000 - 2079 */
- tm_time.tm_isdst = -1; /* unknown daylight saving time */
- file_recovery_new->time=mktime(&tm_time);
- return 1;
- }
- return 0;
+ static const unsigned char dss_header[4]= { 0x02, 'd','s','s'};
+ register_header_check(0, dss_header,sizeof(dss_header), &header_check_dss, file_stat);
}