X-Git-Url: http://www.wagner.pp.ru/gitweb/?p=oss%2Fcatdoc.git;a=blobdiff_plain;f=src%2Fole.c;h=805d8c716c9694bba2a4afc7c7045bb00953a0e4;hp=ff21a30e587c4d5f735fec4ba548b07ced0c1d46;hb=704c53839728067bb54c9c570916b77008388a23;hpb=51f0f8ed69b065cd2577a27c2a2911cdda243b99 diff --git a/src/ole.c b/src/ole.c index ff21a30..805d8c7 100644 --- a/src/ole.c +++ b/src/ole.c @@ -2,7 +2,7 @@ * @file ole.c * @author Alex Ott, Victor B Wagner * @date Wed Jun 11 12:33:01 2003 - * Version: $Id: ole.c,v 1.1 2006-02-24 17:44:06 vitus Exp $ + * Version: $Id: ole.c,v 1.2 2006-02-25 15:28:14 vitus Exp $ * Copyright: Victor B Wagner, 1996-2003 Alex Ott, 2003 * * @brief Parsing structure of MS Office compound document @@ -37,8 +37,8 @@ long propCurNumber, propLen, propNumber, propStart; unsigned char *properties=NULL; long int fileLength=0; -static unsigned char ole_sign[]={0xD0,0xCF,0x11,0xE0,0xA1,0xB1,0x1A,0xE1,0}; - +char ole_sign[]={0xD0,0xCF,0x11,0xE0,0xA1,0xB1,0x1A,0xE1,0}; +char zip_sign[]="PK\003\004"; /** * Initializes ole structure @@ -97,7 +97,10 @@ FILE* ole_init(FILE *f, void *buffer, size_t bufSize) { if ( ret != BBD_BLOCK_SIZE ) { return NULL; } - if (strncmp(oleBuf,ole_sign,8) != 0) { + if (strncmp((char *)&oleBuf,zip_sign,4) == 0) { + fprintf(stderr,"Looks like ZIP archive or Office 2007 or later. Not supported\n"); + return NULL; + } else if (strncmp((char *)&oleBuf,ole_sign,8) != 0) { return NULL; } sectorSize = 1<name[0]||strcmp(tEntry->name,"Root Entry") == 0) { + if (tEntry->type == oleRootDir ) { rootEntry=tEntry; break; } @@ -252,8 +255,7 @@ FILE* ole_init(FILE *f, void *buffer, size_t bufSize) { propCurNumber = 0; fseek(newfile, 0, SEEK_SET); if (!rootEntry) { - fprintf(stderr,"Cannot find root entry in this file!\n"); - ole_finish(); + fprintf(stderr,"Broken OLE structure. Cannot find root entry in this file!\n"); ole_finish(); return NULL; } return newfile; @@ -329,9 +331,27 @@ FILE *ole_readdir(FILE *f) { (e->startBlock <= fileLength/(e->isBigBlock ? sectorSize : shortSectorSize))) { if((e->blocks=malloc(chainMaxLen*sizeof(long int))) == NULL ) { + free(e); return NULL; } while(1) { + if(chainCurrent < 0 || + chainCurrent >= ( + e->isBigBlock ? + ((bbdNumBlocks*sectorSize)/4) : + ((sbdNumber*shortSectorSize)/4) + ) || + (e->numOfBlocks > + e->length/( + e->isBigBlock ? + sectorSize : + shortSectorSize + ) + ) + ) { +/* fprintf(stderr, "chain End=%ld\n", chainCurrent); */ + break; + } /* fprintf(stderr, "chainCurrent=%ld\n", chainCurrent); */ e->blocks[e->numOfBlocks++] = chainCurrent; if (e->numOfBlocks >= chainMaxLen) { @@ -354,15 +374,6 @@ FILE *ole_readdir(FILE *f) { } else { chainCurrent=-1; } - if(chainCurrent <= 0 || - chainCurrent >= ( e->isBigBlock ? - ((bbdNumBlocks*sectorSize)/4) - : ((sbdNumber*shortSectorSize)/4) ) || - (e->numOfBlocks > - e->length/(e->isBigBlock ? sectorSize : shortSectorSize))) { -/* fprintf(stderr, "chain End=%ld\n", chainCurrent); */ - break; - } } }