diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ext4magic.c | 2 | ||||
-rw-r--r-- | src/file_type.c | 198 | ||||
-rw-r--r-- | src/inode.c | 10 | ||||
-rw-r--r-- | src/magic_block_scan.c | 62 | ||||
-rw-r--r-- | src/util.c | 46 | ||||
-rw-r--r-- | src/util.h | 5 |
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; @@ -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; } @@ -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; |