summaryrefslogtreecommitdiffstats
path: root/src/file_bpg.c
diff options
context:
space:
mode:
authorDmitry Brant <dbrant@wikimedia.org>2016-01-30 15:48:41 -0500
committerDmitry Brant <dbrant@wikimedia.org>2016-01-30 15:48:41 -0500
commita33133ff12313bf415adb7f0432b12d9238ae5b7 (patch)
treed9e1f8f2eea836ccd2e84d126fbfe1d917e3c6f9 /src/file_bpg.c
parentadbca173664d3839cf8d5217a1c8ac43a288b1b8 (diff)
Improve BPG detection.
Diffstat (limited to 'src/file_bpg.c')
-rw-r--r--src/file_bpg.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/src/file_bpg.c b/src/file_bpg.c
index eb7bd9c..a74e303 100644
--- a/src/file_bpg.c
+++ b/src/file_bpg.c
@@ -3,7 +3,7 @@
File: file_bpg.c
Copyright (C) 1998-2007 Christophe GRENIER <grenier@cgsecurity.org>
- Contribution by Dmitry Brant <me@dmitrybrant.com>
+ Copyright (C) 2016 Dmitry Brant <me@dmitrybrant.com>
This software is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -30,27 +30,18 @@
#include <stdio.h>
#include "types.h"
#include "filegen.h"
-#include "common.h"
static void register_header_check_bpg(file_stat_t *file_stat);
-static int header_check_bpg(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);
const file_hint_t file_hint_bpg= {
.extension="bpg",
- .description="Better Portable Graphics (BPG) image",
+ .description="Better Portable Graphics image",
.max_filesize=PHOTOREC_MAX_FILE_SIZE,
.recover=1,
.enable_by_default=1,
.register_header_check=&register_header_check_bpg
};
-static const unsigned char bpg_header[4]= {'B','P','G',0xFB};
-
-static void register_header_check_bpg(file_stat_t *file_stat)
-{
- register_header_check(0, bpg_header, sizeof(bpg_header), &header_check_bpg, file_stat);
-}
-
static int getue32(const unsigned char *buffer, const unsigned int buffer_size, unsigned int *buf_ptr)
{
unsigned int value = 0;
@@ -58,7 +49,8 @@ static int getue32(const unsigned char *buffer, const unsigned int buffer_size,
int bitsRead = 0;
while (*buf_ptr < buffer_size)
{
- b = buffer[*buf_ptr++];
+ b = buffer[*buf_ptr];
+ *buf_ptr = *buf_ptr + 1;
value <<= 7;
value |= (b & 0x7F);
if ((b & 0x80) == 0)
@@ -72,20 +64,26 @@ static int getue32(const unsigned char *buffer, const unsigned int buffer_size,
static int header_check_bpg(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)
{
- if(buffer[0]=='B' && buffer[1]=='P' && buffer[2]=='G' && buffer[3]==0xFB)
- {
- unsigned int buf_ptr = 6;
- reset_file_recovery(file_recovery_new);
- file_recovery_new->extension=file_hint_bpg.extension;
- file_recovery_new->min_filesize=100;
- // get image width, and throw it away
- getue32(buffer, buffer_size, &buf_ptr);
- // get image height, and throw it away
- getue32(buffer, buffer_size, &buf_ptr);
- file_recovery_new->calculated_file_size=(uint64_t)getue32(buffer, buffer_size, &buf_ptr);
- file_recovery_new->data_check=&data_check_size;
- file_recovery_new->file_check=&file_check_size;
- return 1;
- }
- return 0;
+ unsigned int buf_ptr = 6;
+ // get image width, and throw it away
+ int width = getue32(buffer, buffer_size, &buf_ptr);
+ printf(">>>> width...%d\n", width);
+ // get image height, and throw it away
+ int height = getue32(buffer, buffer_size, &buf_ptr);
+ printf(">>>> height...%d\n", height);
+ int size = getue32(buffer, buffer_size, &buf_ptr);
+ printf(">>>> size...%d\n", size);
+
+ reset_file_recovery(file_recovery_new);
+ file_recovery_new->calculated_file_size=size;
+ file_recovery_new->data_check=&data_check_size;
+ file_recovery_new->file_check=&file_check_size;
+ file_recovery_new->extension=file_hint_bpg.extension;
+ return 1;
+}
+
+static void register_header_check_bpg(file_stat_t *file_stat)
+{
+ static const unsigned char bpg_header[4]= {'B','P','G',0xFB};
+ register_header_check(0, bpg_header,sizeof(bpg_header), &header_check_bpg, file_stat);
}