summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobi <robi>2010-09-26 19:20:05 +0000
committerrobi <robi>2010-09-26 19:20:05 +0000
commita0b8d23015f04caa8b4fb456f9c2a2bf6a64c82f (patch)
treed795d404b1a6d68b3602200e67cd72bfafafc520
parent2761a6bac18b775c6ddd5dcdc83ade0ce6e4944c (diff)
stabilize magic
-rw-r--r--src/ext4magic.c2
-rw-r--r--src/file_type.c198
-rw-r--r--src/inode.c10
-rw-r--r--src/magic_block_scan.c62
-rw-r--r--src/util.c46
-rw-r--r--src/util.h5
6 files changed, 186 insertions, 137 deletions
diff --git a/src/ext4magic.c b/src/ext4magic.c
index 50029c0..c6918f1 100644
--- a/src/ext4magic.c
+++ b/src/ext4magic.c
@@ -207,7 +207,7 @@ static void open_filesystem(char *device, int open_flags, blk_t superblock,
fprintf(stderr,"%s %d while reading block bitmap\n",device, retval);
goto errout;
}
-//FIXME
+
if (magicscan){
// switch on magic scan function
if( ext2fs_copy_bitmap(current_fs->inode_map, &imap) || ext2fs_copy_bitmap(current_fs->block_map, &bmap)){
diff --git a/src/file_type.c b/src/file_type.c
index 1e02cb9..e0e2e80 100644
--- a/src/file_type.c
+++ b/src/file_type.c
@@ -45,14 +45,14 @@ int ident_file(struct found_data_t *new, __u32 *scan, char *magic_buf, char *buf
//Please do not modify the following lines.
//they are used for indices to the filestypes
char typestr[] ="application/ audio/ image/ message/ model/ text/ video/ ";
- char imagestr[] ="gif jp2 jpeg png svg+xml tiff vnd.adobe.photoshop vnd.djvu x-coreldraw x-cpi x-ico x-ms-bmp x-niff x-portable-bitmap x-portable-greymap x-portable-pixmap x-psion-sketch x-quicktime x-unknown x-xcursor x-xpmi x-tga";
+ char imagestr[] ="gif jp2 jpeg png svg+xml tiff vnd.adobe.photoshop vnd.djvu x-coreldraw x-cpi x-ico x-ms-bmp x-niff x-portable-bitmap x-portable-greymap x-portable-pixmap x-psion-sketch x-quicktime x-unknown x-xcursor x-xpmi x-tga ";
char videostr[] ="3gpp h264 mp2p mp2t mp4 mp4v-es mpeg mpv quicktime x-flc x-fli x-flv x-jng x-mng x-msvideo x-sgi-movie x-unknown ";
char audiostr[] ="basic midi mp4 mpeg x-adpcm x-aiff x-dec-basic x-flac x-hx-aac-adif x-hx-aac-adts x-mod x-mp4a-latm x-pn-realaudio x-unknown x-wav ";
char messagestr[] ="news rfc822 ";
char modelstr[] ="vrml x3d ";
char applistr[] ="dicom mac-binhex40 msword octet-stream ogg pdf pgp pgp-encrypted pgp-keys pgp-signature postscript unknown+zip vnd.google-earth.kml+xml vnd.google-earth.kmz vnd.lotus-wordpro vnd.ms-cab-compressed vnd.ms-excel vnd.ms-tnef vnd.oasis.opendocument.text vnd.rn-realmedia vnd.symbian.install x-123 x-adrift x-archive x-arc x-arj x-bittorrent x-bzip2 x-compress x-coredump x-cpio x-dbf x-dbm x-debian-package x-dosexec x-dvi x-eet x-elc x-executable x-gdbm x-gnucash x-gnumeric x-gnupg-keyring x-gzip x-hdf x-hwp x-ichitaro4 x-ichitaro5 x-ichitaro6 x-iso9660-image x-java-applet x-java-jce-keystore x-java-keystore x-java-pack200 x-kdelnk x-lha x-lharc x-lzip x-mif xml xml-sitemap x-msaccess x-ms-reader x-object x-pgp-keyring x-quark-xpress-3 x-quicktime-player x-rar x-rpm x-sc x-setupscript x-sharedlib x-shockwave-flash x-stuffit x-svr4-package x-tar x-tex-tfm x-tokyocabinet-btree x-tokyocabinet-fixed x-tokyocabinet-hash x-tokyocabinet-table x-xz x-zoo zip ";
- char textstr[] = "html PGP rtf texmacs troff vnd.graphviz x-awk x-diff x-fortran x-gawk x-info x-lisp x-lua x-msdos-batch x-nawk x-perl x-php x-shellscript x-texinfo x-tex x-vcard x-xmcd plain x-pascal x-c++ x-c x-mail x-makefile x-asm text";
- char undefstr[] ="MPEG Targa 7-zip cpio CD-ROM DVD 9660 Kernel boot Linux filesystem x86 Image CDF SQLite ";
+ char textstr[] = "html PGP rtf texmacs troff vnd.graphviz x-awk x-diff x-fortran x-gawk x-info x-lisp x-lua x-msdos-batch x-nawk x-perl x-php x-shellscript x-texinfo x-tex x-vcard x-xmcd plain x-pascal x-c++ x-c x-mail x-makefile x-asm text ";
+ char undefstr[] ="MPEG Targa 7-zip cpio CD-ROM DVD 9660 Kernel boot Linux filesystem x86 Image CDF SQLite OpenOffice.org Microsoft";
//-----------------------------------------------------------------------------------
char* p_search;
char token[30];
@@ -134,7 +134,7 @@ return 1;
//default
-int file_default(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_default(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
@@ -166,7 +166,7 @@ int file_default(char *buf, int *size, __u32 scan , int flag, struct found_data_
//Textfiles
-int file_txt(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_txt(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
switch (flag){
case 0 :
return (buf[(*size)-1] == (char)0x0a);
@@ -180,7 +180,7 @@ int file_txt(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//Textfiles binary
-int file_bin_txt(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_bin_txt(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
switch (flag){
case 0 :
return (*size < current_fs->blocksize);
@@ -193,7 +193,7 @@ int file_bin_txt(char *buf, int *size, __u32 scan , int flag, struct found_data_
//gzip
-int file_gzip(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_gzip(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
@@ -212,10 +212,10 @@ int file_gzip(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
//zip ???????????
-int file_zip(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_zip(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
int j,i;
- char token[5];
+ unsigned char token[5];
sprintf(token,"%c%c%c%c",0x50,0x4b,0x05,0x06);
@@ -248,22 +248,30 @@ int file_zip(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//iso9660 CD-ROM
-int file_iso9660(char *buf, int *size, __u32 scan , int flag , struct found_data_t* f_data){
+int file_iso9660(unsigned char *buf, int *size, __u32 scan , int flag , struct found_data_t* f_data){
__u64 lsize;
__u32 *p_32;
__u16 *p_16;
int ssize;
int ret = 0;
- char cd_str[] = "CD001";
+ unsigned char cd_str[] = "CD001";
switch (flag){
- case 0 :if ((f_data->size)&&(f_data->size <= (__u64)f_data->inode->i_size | ((__u64)f_data->inode->i_size_high<<32))){
- ssize = (f_data->size % current_fs->blocksize);
- *size = (ssize)? ssize : current_fs->blocksize;
- ret = 1;
+ case 0 :
+ if (f_data->size || f_data->h_size) {
+ if (f_data->h_size != f_data->inode->i_size_high)
+ ret = 0;
+ else{
+ if (f_data->inode->i_size < f_data->size)
+ ret = 0;
+ else{
+ ssize = (f_data->size % current_fs->blocksize);
+ *size = (ssize)? ssize : current_fs->blocksize;
+ ret = 1;
+ }
+ }
}
else {
- // *size = current_fs->blocksize;
ret =0;
}
break;
@@ -275,7 +283,8 @@ int file_iso9660(char *buf, int *size, __u32 scan , int flag , struct found_data
p_16 = (__u16*)(buf + 0x8080);
if ((!strncmp((buf+0x8001),cd_str,5)) && (ext2fs_le32_to_cpu(*(p_32 +1)) == ext2fs_be32_to_cpu(*p_32))){
lsize = (__u64)(ext2fs_le32_to_cpu(*p_32)) * ext2fs_le16_to_cpu(*p_16);
- f_data->size = lsize;
+ f_data->size = lsize & 0xFFFFFFFF;
+ f_data->h_size = lsize >> 32;
ret =1;
}
break;
@@ -285,13 +294,34 @@ int file_iso9660(char *buf, int *size, __u32 scan , int flag , struct found_data
// 7-zip
-int file_7z(char *buf, int *size, __u32 scan , int flag , struct found_data_t* f_data){
+int file_7z(unsigned char *buf, int *size, __u32 scan , int flag , struct found_data_t* f_data){
__u64 lsize,*p;
__u32 ssize;
int ret = 0;
switch (flag){
case 0 :
- if ((f_data->size) && (f_data->size <= (__u64)f_data->inode->i_size | ((__u64)f_data->inode->i_size_high<<32))){
+ if (f_data->size || f_data->h_size) {
+ if (f_data->h_size != f_data->inode->i_size_high)
+ ret = 0;
+ else{
+ if (f_data->inode->i_size < f_data->size)
+ ret = 0;
+ else{
+ ssize = (f_data->size % current_fs->blocksize);
+ if (*size < ssize)
+ *size = ssize;
+ ret = 1;
+ }
+ }
+ }
+ else {
+ ret =3;
+ *size += 7;
+ }
+ break;
+
+
+/* if ((f_data->size) && (f_data->size <= (__u64)f_data->inode->i_size | ((__u64)f_data->inode->i_size_high<<32))){
ssize = (f_data->size % current_fs->blocksize);
if (*size < ssize)
*size = ssize;
@@ -301,16 +331,17 @@ int ret = 0;
// *size +=7;
ret = 0;
}
- break;
+ break;*/
case 1 :
return ( scan & (M_IS_META | M_IS_FILE | M_TXT | M_BLANK)) ? 0 :1 ;
break;
case 2 :
p = (__u64*)(buf+12);
- lsize = ext2fs_le64_to_cpu(*p) + 32;
+ lsize = ext2fs_le64_to_cpu(*p) + (__u64)32;
p++;
- lsize += (ext2fs_le64_to_cpu(*p));
- f_data->size = lsize ;
+ lsize = lsize + (ext2fs_le64_to_cpu(*p));
+ f_data->size = lsize & 0xFFFFFFFF ;
+ f_data->h_size = lsize >> 32;
ret = 1;
break;
}
@@ -320,10 +351,10 @@ int ret = 0;
//cpio
-int file_cpio(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_cpio(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int i,j;
int ret = 0;
- char token[]="TRAILER!!!";
+ unsigned char token[]="TRAILER!!!";
switch (flag){
case 0 :
@@ -356,10 +387,10 @@ int file_cpio(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
//pdf
-int file_pdf(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_pdf(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int i,j;
int ret = 0;
- char token[6];
+ unsigned char token[6];
sprintf(token,"%c%c%c%c%c",0x25,0x45,0x4f,0x46,0x0a);
switch (flag){
@@ -391,10 +422,9 @@ int file_pdf(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//tar
-int file_tar(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_tar(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
-
switch (flag){
case 0 :
if ((((__u64)f_data->inode->i_size |((__u64)f_data->inode->i_size_high<<32)) >= (__u64)0x2800 ) &&
@@ -422,17 +452,17 @@ int file_tar(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//binary
-int file_binary(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_binary(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
- if (*size && ((*size) < current_fs->blocksize - 7)&&(buf[(*size)-1] == (char)0x01)){
+ if (*size && ((*size) < current_fs->blocksize - 7)&&(buf[(*size)-1] == 0x01)){
*size +=7;
ret = 1;
}
else {
- if ((*size < current_fs->blocksize) && ((*size) > current_fs->blocksize - 7) && (buf[(*size)-1] == (char)0x01)){
+ if ((*size < current_fs->blocksize) && ((*size) > current_fs->blocksize - 7) && (buf[(*size)-1] == 0x01)){
*size = current_fs->blocksize;
ret = 2;
}
@@ -442,7 +472,7 @@ int file_binary(char *buf, int *size, __u32 scan , int flag, struct found_data_t
ret = 1;
}
else{
- if ((buf[(*size)-1] != (char)0x01)&&(*size < current_fs->blocksize - 128)){
+ if ((buf[(*size)-1] != 0x01)&&(*size < current_fs->blocksize - 128)){
*size +=1;
ret = 2;
}
@@ -459,14 +489,14 @@ int file_binary(char *buf, int *size, __u32 scan , int flag, struct found_data_t
//object
-int file_object(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_object(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
__u32 len;
__u32 *p_help;
int ret = 0;
switch (flag){
case 0 :
- if ((buf[(*size)-1] == (char)0x0a)){
+ if ((buf[(*size)-1] == 0x0a)){
ret=1;
}
else{
@@ -487,15 +517,15 @@ int file_object(char *buf, int *size, __u32 scan , int flag, struct found_data_t
//jpeg
-int file_jpeg(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_jpeg(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
- if ((*size>1) && (buf[(*size)-1] == (char)0xd9) && (buf[(*size)-2] == (char)0xff))
+ if ((*size>1) && (buf[(*size)-1] == (unsigned char)0xd9) && (buf[(*size)-2] == (unsigned char)0xff))
ret = 1;
else
- if ((*size == 1) && (buf[(*size)-1] == (char)0xd9))
+ if ((*size == 1) && (buf[(*size)-1] == (unsigned char)0xd9))
ret = 1;
break;
@@ -509,12 +539,12 @@ int file_jpeg(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
//gif
-int file_gif(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_gif(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
- if ((*size) && (*size < current_fs->blocksize) && (buf[(*size)-1] == (char)0x3b))
+ if ((*size) && (*size < current_fs->blocksize) && (buf[(*size)-1] == 0x3b))
ret = 1;
break;
case 1 :
@@ -527,8 +557,8 @@ int file_gif(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//bmp
-int file_bmp(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
- __u32 *p_32;
+int file_bmp(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+ //__u32 *p_32;
int ret = 0;
switch (flag){
@@ -543,8 +573,9 @@ int file_bmp(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
break;
case 2 :
- p_32 = (__u32*)(buf+2);
- f_data->size = (__u64)ext2fs_le32_to_cpu(*p_32);
+ // p_32 = (__u32*)(buf+2);
+ // f_data->size = ext2fs_le32_to_cpu(*p_32);
+ f_data->size = ((__u32)*(buf+2)) | ((__u32)*(buf+3))<<8 | ((__u32)*(buf+4))<<16 | ((__u32)*(buf+5))<<24 ;
ret =1;
}
return ret;
@@ -552,7 +583,7 @@ int file_bmp(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//png
-int file_png(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_png(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
@@ -572,15 +603,15 @@ int file_png(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//mng
-int file_mng(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_mng(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
- if ((*size>1) && (buf[(*size)-1] == (char)0xd5) && (buf[(*size)-2] == (char)0xf7))
+ if ((*size>1) && (buf[(*size)-1] == (unsigned char)0xd5) && (buf[(*size)-2] == (unsigned char)0xf7))
ret = 1;
else
- if ((*size == 1) && (buf[(*size)-1] == (char)0xd5))
+ if ((*size == 1) && (buf[(*size)-1] == (unsigned char)0xd5))
ret = 1;
break;
case 1 :
@@ -592,10 +623,10 @@ int file_mng(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//tga
-int file_tga(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_tga(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int i,j;
int ret = 0;
- char token[]="-XFILE.";
+ unsigned char token[]="-XFILE.";
switch (flag){
case 0 :
@@ -619,10 +650,10 @@ int file_tga(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//mpeg
-int file_mpeg(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_mpeg(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int i,j;
int ret = 0;
- char token[5];
+ unsigned char token[5];
sprintf(token,"%c%c%c%c",0x00,0x00,0x01,0xb9);
switch (flag){
case 0 :
@@ -646,9 +677,8 @@ int file_mpeg(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
//riff
-int file_riff(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_riff(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
__u32 *p_32 ;
- __u64 lsize ;
__u32 ssize ;
int ret = 0;
@@ -671,15 +701,15 @@ int file_riff(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
p_32++;
switch (buf[3]){
case 'F' :
- lsize = (__u64) ext2fs_le32_to_cpu(*p_32) + 8 ;
+ ssize = ext2fs_le32_to_cpu(*p_32) + 8 ;
break;
case 'X' :
- lsize = (__u64) ext2fs_be32_to_cpu(*p_32) + 8 ;
+ ssize = ext2fs_be32_to_cpu(*p_32) + 8 ;
break;
default :
- lsize = 0;
+ ssize = 0;
}
- f_data->size = lsize;
+ f_data->size = ssize;
ret=1;
break;
}
@@ -687,25 +717,24 @@ int file_riff(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
}
// tiff
-int file_tiff(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_tiff(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
__u32 *p_32 ;
- __u64 lsize = 0;
- __u32 ssize ;
+ __u32 ssize = 0;
int ret = 0;
switch (flag){
case 0 :
if (f_data->size ){
- lsize = (((unsigned long long)f_data->inode->i_size_high << 32)| f_data->inode->i_size);
- if (lsize > f_data->size){ //FIXME
+ if (f_data->inode->i_size > f_data->size){ //FIXME
*size +=1;
ret =1;
}
}
- else
- if (f_data->inode->i_block[12]) //FIXME for ext4
+ else{
+ if (f_data->inode->i_block[12]){ //FIXME for ext4
ret = 2;
-
+ }
+ }
break;
case 1 :
return (scan & (M_IS_META | M_IS_FILE | M_TXT)) ? 0 :1 ;
@@ -713,12 +742,12 @@ int file_tiff(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
case 2 :
p_32 = (__u32*)buf;
p_32++;
- if ((*buf == (char) 0x49) && (*(buf+1) == (char) 0x49))
- lsize = (__u64)ext2fs_le32_to_cpu(*p_32);
- if ((*buf == (char) 0x4d) && (*(buf+1) == (char) 0x4d))
- lsize = (__u64)ext2fs_be32_to_cpu(*p_32);
+ if ((*buf == 0x49) && (*(buf+1) == 0x49))
+ ssize = ext2fs_le32_to_cpu(*p_32);
+ if ((*buf == 0x4d) && (*(buf+1) == 0x4d))
+ ssize = ext2fs_be32_to_cpu(*p_32);
- f_data->size = lsize;
+ f_data->size = ssize;
ret = 1;
break;
@@ -729,7 +758,7 @@ int file_tiff(char *buf, int *size, __u32 scan , int flag, struct found_data_t*
//mod
-int file_mod(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_mod(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
@@ -748,12 +777,12 @@ int file_mod(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//CDF FIXME ????????????????
-int file_CDF(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_CDF(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
switch (flag){
case 0 :
- if (*size < (current_fs->blocksize -7) && ((*size ) && buf[(*size)-1] == (char)0xff )){
+ if (*size < (current_fs->blocksize -7) && ((*size ) && buf[(*size)-1] == (unsigned char)0xff )){
*size = ((*size) +8) ;
ret = 3;
}
@@ -768,16 +797,15 @@ int file_CDF(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f
//SQLite FIXME ????????????????
-int file_SQLite(char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
+int file_SQLite(unsigned char *buf, int *size, __u32 scan , int flag, struct found_data_t* f_data){
int ret = 0;
__u16 *p_16;
- __u64 lsize;
- int ssize;
+ __u32 ssize;
switch (flag){
case 0 :
if (f_data->size ) {
- ssize = (int) f_data->size;
+ ssize = f_data->size;
if (ssize < current_fs->blocksize){
*size += ssize -1;
*size &= (~(ssize-1));
@@ -795,8 +823,8 @@ int file_SQLite(char *buf, int *size, __u32 scan , int flag, struct found_data_t
case 2:
p_16 = (__u16*)(buf+16);
- lsize = (__u64)ext2fs_be16_to_cpu(*p_16);
- f_data->size = lsize;
+ ssize = (__u32)ext2fs_be16_to_cpu(*p_16);
+ f_data->size = ssize;
ret = 1;
break;
}
@@ -1767,6 +1795,16 @@ void get_file_property(struct found_data_t* this){
strncat(this->name,".sql",7);
break;
+ case 0x0810 : //OpenOffice.org
+ this->func = file_zip ;
+ strncat(this->name,".sxw",7);
+ break;
+
+ case 0x0811 : //Microsoft
+ this->func = file_CDF ;
+ // strncat(this->name,".doc",7);
+ break;
+
//----------------------------------------------------------------
default:
this->func = file_default ;
diff --git a/src/inode.c b/src/inode.c
index bd098aa..d1f2571 100644
--- a/src/inode.c
+++ b/src/inode.c
@@ -954,7 +954,7 @@ blk_t inode_add_meta_block(struct ext2_inode_large* inode , blk_t blk, blk_t *la
blk_t b_blk,block_count, next;
blk_t count=0;
int i;
- unsigned long long i_size = 0;
+ __u64 i_size = 0;
i = 0;
block_count = 0;
@@ -966,13 +966,13 @@ blk_t inode_add_meta_block(struct ext2_inode_large* inode , blk_t blk, blk_t *la
switch (i){
case EXT2_IND_BLOCK :
- i_size = get_ind_block_len(buf, &block_count, last, &next);
+ get_ind_block_len(buf, &block_count, last, &next, &i_size);
break;
case EXT2_DIND_BLOCK :
- i_size = get_dind_block_len(buf, &block_count, last, &next);
+ get_dind_block_len(buf, &block_count, last, &next, &i_size);
break;
case EXT2_TIND_BLOCK :
- i_size = get_tind_block_len(buf, &block_count, last, &next);
+ get_tind_block_len(buf, &block_count, last, &next, &i_size);
break;
default:
// printf("faulty Block %u as indirekter_block %d \n", i,blk);
@@ -981,7 +981,7 @@ blk_t inode_add_meta_block(struct ext2_inode_large* inode , blk_t blk, blk_t *la
}
if (i_size){
- i_size += (((unsigned long long)inode->i_size_high << 32)| inode->i_size);
+ i_size += (((__u64)inode->i_size_high << 32)| inode->i_size);
inode->i_size = i_size & 0xffffffff ;
inode->i_size_high = i_size >> 32 ;
inode->i_blocks += (block_count * (current_fs->blocksize / 512));
diff --git a/src/magic_block_scan.c b/src/magic_block_scan.c
index b1e6599..97f38e3 100644
--- a/src/magic_block_scan.c
+++ b/src/magic_block_scan.c
@@ -39,7 +39,7 @@ extern ext2_filsys current_fs ;
ext2fs_block_bitmap d_bmap = NULL ;
-static __u32 get_block_len(char *buf){
+static __u32 get_block_len(unsigned char *buf){
int len = current_fs->blocksize -1;
while ((len >= 0) && (!(*(buf + len))))
@@ -60,12 +60,13 @@ static struct found_data_t* free_file_data(struct found_data_t* old){
-static struct found_data_t* new_file_data(blk_t blk,__u32 scan,char *magic_buf, char* buf, __u32 *f){
+static struct found_data_t* new_file_data(blk_t blk,__u32 scan,char *magic_buf, unsigned char* buf, __u32 *f){
struct found_data_t *new;
int str_len;
__u32 name_len;
char *c;
int def_len = 20;
+ char name_str[20];
new = malloc(sizeof(struct found_data_t));
if (!new) return NULL;
@@ -75,13 +76,16 @@ static struct found_data_t* new_file_data(blk_t blk,__u32 scan,char *magic_buf,
new->leng = 0;
new->scan = scan;
new->size = 0;
+ new->h_size = 0;
new->func = NULL;
if ( ident_file(new,&scan,magic_buf,buf)){
new->type = scan;
str_len = strlen(magic_buf) + 1;
c = strpbrk(magic_buf,";:, ");
- if (c)
- name_len = c - magic_buf + def_len;
+ if (c){
+ *c = 0;
+ name_len = c - magic_buf + def_len;
+ }
else
name_len = str_len + def_len;
@@ -94,8 +98,9 @@ static struct found_data_t* new_file_data(blk_t blk,__u32 scan,char *magic_buf,
}
else{
strcpy(new->scan_result,magic_buf);
- strncpy(new->name, magic_buf , name_len - 20);
- sprintf(new->name + name_len - 20,"/%010u",blk);
+ strncpy(new->name, magic_buf , name_len - def_len+1);
+ sprintf(name_str,"/%010lu",blk);
+ strcat(new->name,name_str);
get_file_property(new);
new->func(buf,&name_len,scan,2,new);
}
@@ -120,6 +125,7 @@ static struct found_data_t* recover_file_data(char *des_dir, struct found_data_t
static struct found_data_t* forget_file_data(struct found_data_t* this, __u32 *p_follow){
#ifdef DEBUG_MAGIC_SCAN
printf("TRASH : %s : leng %lu : begin %lu\n", this->name, this->inode->i_size , this->first);
+// dump_inode(stdout, "",0, (struct ext2_inode *)this->inode, 1);
#endif
free_file_data(this);
*p_follow = 0;
@@ -158,7 +164,7 @@ static int file_data_correct_size(struct found_data_t* this, int size){
-static int check_file_data_end(struct found_data_t* this,char *buf){
+static int check_file_data_end(struct found_data_t* this,unsigned char *buf){
int size;
int ret = 0;
@@ -174,7 +180,7 @@ static int check_file_data_end(struct found_data_t* this,char *buf){
//?????
-static int check_data_passage(char *a_buf, char *b_buf){
+static int check_data_passage(char *a_buf, unsigned char *b_buf){
int i, blocksize;
int sum[4][2];
@@ -184,7 +190,7 @@ static int check_data_passage(char *a_buf, char *b_buf){
-static int check_file_data_possible(struct found_data_t* this, __u32 scan ,char *buf){
+static int check_file_data_possible(struct found_data_t* this, __u32 scan ,unsigned char *buf){
int ret = 0;
int size ;
ret = this->func(buf, &size ,scan ,1 , this);
@@ -194,7 +200,7 @@ static int check_file_data_possible(struct found_data_t* this, __u32 scan ,char
-static int check_indirect_meta3(char *block_buf){
+static int check_indirect_meta3(unsigned char *block_buf){
blk_t *pb_block;
blk_t last;
int i = current_fs->blocksize/sizeof(blk_t);
@@ -219,7 +225,7 @@ static int check_indirect_meta3(char *block_buf){
-static int check_meta3_block(char *block_buf, blk_t blk, __u32 size){
+static int check_meta3_block(unsigned char *block_buf, blk_t blk, __u32 size){
blk_t block, *pb_block;
int i,j ;
@@ -250,11 +256,11 @@ static int check_meta3_block(char *block_buf, blk_t blk, __u32 size){
-static int check_meta4_block(char *block_buf, blk_t blk, __u32 size){
+static int check_meta4_block(unsigned char *block_buf, blk_t blk, __u32 size){
__u16 *p_h16;
__u16 h16;
- if(!((block_buf[0] == (char)0x0a) && (block_buf[1] == (char)0xf3)))
+ if(!((block_buf[0] == 0x0a) && (block_buf[1] == (unsigned char)0xf3)))
return 0;
p_h16 = (__u16*)block_buf+2;
h16 = ext2fs_le16_to_cpu(*p_h16);
@@ -270,7 +276,7 @@ static int check_meta4_block(char *block_buf, blk_t blk, __u32 size){
-static int check_dir_block(char *block_buf, blk_t blk, __u32 size){
+static int check_dir_block(unsigned char *block_buf, blk_t blk, __u32 size){
struct ext2_dir_entry_2 *dir_entry;
ext2_ino_t inode_nr;
__u16 len;
@@ -298,7 +304,7 @@ static int check_dir_block(char *block_buf, blk_t blk, __u32 size){
-static int check_acl_block(char *block_buf, blk_t blk, __u32 size){
+static int check_acl_block(unsigned char *block_buf, blk_t blk, __u32 size){
__u32 *p32;
int i;
@@ -323,7 +329,7 @@ static int check_acl_block(char *block_buf, blk_t blk, __u32 size){
-static int add_ext3_file_meta_data(struct found_data_t* this, char *buf, blk_t blk){
+static int add_ext3_file_meta_data(struct found_data_t* this, unsigned char *buf, blk_t blk){
blk_t next_meta;
blk_t last_data = 0;
next_meta = inode_add_meta_block(this->inode , blk, &last_data, buf );
@@ -370,18 +376,18 @@ return flag;
//magic scanner
-static int magic_check_block(char* buf,magic_t cookie , magic_t cookie_f, char *magic_buf, __u32 size, blk_t blk){
+static int magic_check_block(unsigned char* buf,magic_t cookie , magic_t cookie_f, char *magic_buf, __u32 size, blk_t blk){
//int count = size-1;
int count = current_fs->blocksize -1 ;
int *i , len;
char text[100] = "";
char *p_search;
__u32 retval = 0;
- char searchstr[] = "7-zip cpio Image filesystem CD-ROM MPEG 9660 Targa Kernel boot Linux x86 SQLite ";
- char token[10];
+ char searchstr[] = "7-zip cpio Image filesystem CD-ROM MPEG 9660 Targa Kernel boot Linux x86 SQLite OpenOffice.org ";
+ char token[20];
- strncpy(text,magic_buffer(cookie_f,buf , size),99);
- strncpy(magic_buf, magic_buffer(cookie , buf , size),99);
+ strncpy(text,magic_buffer(cookie_f,buf , size),60);
+ strncpy(magic_buf, magic_buffer(cookie , buf , size),60);
while (count >= 0 && (*(buf+count) == 0)) count-- ;
#ifdef DEBUG_MAGIC_SCAN
printf("Scan Result : %s %d\n", magic_buf , count+1) ;
@@ -456,7 +462,7 @@ static int magic_check_block(char* buf,magic_t cookie , magic_t cookie_f, char *
}
token[len] = 0;
if (strstr(text,token)){
- strncpy(magic_buf,text,99);
+ strncpy(magic_buf,text,90);
retval |= (M_APPLI | M_ARCHIV);
break;
}
@@ -516,7 +522,7 @@ out:
-static struct found_data_t* soft_border(char *des_dir, char *buf, struct found_data_t* file_data, __u32* follow, blk_t blk){
+static struct found_data_t* soft_border(char *des_dir, unsigned char *buf, struct found_data_t* file_data, __u32* follow, blk_t blk){
if ( check_file_data_end(file_data, buf ))
file_data = recover_file_data(des_dir, file_data, follow);
else{
@@ -527,7 +533,7 @@ return file_data;
}
-static int get_range(blk_t* p_blk ,struct ext2fs_struct_loc_generic_bitmap *ds_bmap, char* buf){
+static int get_range(blk_t* p_blk ,struct ext2fs_struct_loc_generic_bitmap *ds_bmap, unsigned char* buf){
blk_t begin;
blk_t end;
int count=1;
@@ -562,7 +568,7 @@ return count;
-static int get_full_range(blk_t* p_blk ,struct ext2fs_struct_loc_generic_bitmap *ds_bmap, char* buf, blk_t* p_flag){
+static int get_full_range(blk_t* p_blk ,struct ext2fs_struct_loc_generic_bitmap *ds_bmap, unsigned char* buf, blk_t* p_flag){
blk_t begin;
blk_t end;
int count=0;
@@ -640,9 +646,9 @@ blk_t blk[2] ;
blk_t j;
blk_t flag[MAX_RANGE];
blk_t fragment_flag;
-char *buf = NULL;
+unsigned char *buf = NULL;
char *magic_buf = NULL;
-char *tmp_buf = NULL;
+unsigned char *tmp_buf = NULL;
int blocksize, ds_retval,count,i,ret;
__u32 scan,follow, size;
@@ -659,7 +665,7 @@ if ((! cookie) || magic_load(cookie, NULL) || (! cookie_f) || magic_load(cookie
}
buf = malloc(blocksize * MAX_RANGE);
tmp_buf = malloc(blocksize);
-magic_buf = malloc(200);
+magic_buf = malloc(100);
if ((! buf) || (! magic_buf) || (! tmp_buf)){
fprintf(stderr,"ERROR: can't allocate memory\n");
goto errout;
diff --git a/src/util.c b/src/util.c
index c76ab95..2b42328 100644
--- a/src/util.c
+++ b/src/util.c
@@ -333,7 +333,7 @@ for (flag=0;flag<2;flag++){
}
}
}
-first = last;
+if(!flag) first = last;
}
if(buf) {
@@ -525,14 +525,15 @@ unsigned long parse_ulong(const char *str, const char *cmd,
}
-unsigned long long get_nblock_len(char *buf, blk_t *blk){
+void get_nblock_len(char *buf, blk_t *blk, __u64 *p_len){
(*blk)++;
- return current_fs->blocksize ;
+ *p_len += current_fs->blocksize ;
+return;
}
-unsigned long long get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next){
- unsigned long long len;
+void get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p_len){
+// unsigned long long len;
int i = (current_fs->blocksize >> 2)- 1;
char *priv_buf = NULL;
blk_t block, *p_block;
@@ -541,7 +542,7 @@ unsigned long long get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *
priv_buf = malloc(current_fs->blocksize);
if (! priv_buf){
fprintf(stderr,"can not allocate memory\n");
- return 0;
+ return ;
}
p_block = (blk_t*)buf;
p_block += i;
@@ -556,20 +557,21 @@ unsigned long long get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *
}
if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){
fprintf(stderr,"ERROR: while read block %10u\n",block);
- return 0;
+ return ;
}
*next = (flag) ? 0 : block+1 ;
*last = block;
- len = get_nblock_len(priv_buf, blk) + (i * (current_fs->blocksize)) ;
+ get_nblock_len(priv_buf, blk, p_len);
+ *p_len += (i * (current_fs->blocksize)) ;
*blk += (i + 1) ;
free(priv_buf);
-return len;
+return ;
}
-unsigned long long get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next){
- unsigned long long len;
+void get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){
+// unsigned long long len;
int i = (current_fs->blocksize >> 2)- 1;
char *priv_buf = NULL;
blk_t block, *p_block;
@@ -577,7 +579,7 @@ unsigned long long get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t
priv_buf = malloc(current_fs->blocksize);
if (! priv_buf){
fprintf(stderr,"can not allocate memory\n");
- return 0;
+ return;
}
p_block = (blk_t*)buf;
p_block += i;
@@ -591,20 +593,21 @@ unsigned long long get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t
}
if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){
fprintf(stderr,"ERROR: while read ind-block %10u\n",block);
- return 0;
+ return;
}
- len = get_ind_block_len(priv_buf, blk, last, next) + (i * current_fs->blocksize * (current_fs->blocksize >>2) ) ;
+ get_ind_block_len(priv_buf, blk, last, next, p_len);
+ *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) ) ;
*next = ( i == ((current_fs->blocksize >> 2)- 1)) ? *last : 0 ;
*blk += ((i * ((current_fs->blocksize >>2) + 1)) + 1) ;
free(priv_buf);
-return len;
+return ;
}
-unsigned long long get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next){
- unsigned long long len;
+void get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){
+// unsigned long long len;
int i = (current_fs->blocksize >> 2)- 1;
char *priv_buf = NULL;
blk_t block, *p_block;
@@ -612,7 +615,7 @@ unsigned long long get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t
priv_buf = malloc(current_fs->blocksize);
if (! priv_buf){
fprintf(stderr,"can not allocate memory\n");
- return 0;
+ return ;
}
p_block = (blk_t*)buf;
p_block += i;
@@ -626,13 +629,14 @@ unsigned long long get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t
}
if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){
fprintf(stderr,"ERROR: while read dind-block %10u\n",block);
- return 0;
+ return ;
}
- len = get_dind_block_len(priv_buf, blk, last, next) + (i * current_fs->blocksize * (current_fs->blocksize >>2) * (current_fs->blocksize >>2) ) ;
+ get_dind_block_len(priv_buf, blk, last, next,p_len);
+ *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) * (current_fs->blocksize >>2) ) ;
*blk += ((i * ((current_fs->blocksize >>2) + 1) * (current_fs->blocksize >>2)) + 1) ;
*next = 0;
free(priv_buf);
-return len;
+return;
}
diff --git a/src/util.h b/src/util.h
index 4149ec3..9922ea1 100644
--- a/src/util.h
+++ b/src/util.h
@@ -123,8 +123,9 @@ struct found_data_t{
blk_t first;
blk_t last;
blk_t leng;
-unsigned long long size;
-int (*func)(char*, int*, __u32, int, struct found_data_t*);
+__u32 size;
+__u32 h_size;
+int (*func)(unsigned char*, int*, __u32, int, struct found_data_t*);
__u32 scan;
__u32 type;
char *scan_result;