X-Git-Url: http://www.wagner.pp.ru/gitweb/?a=blobdiff_plain;f=src%2Frtfread.c;h=af6be86183986317643093fde87f6d03e36be582;hb=b89ceec5c7a586c1ad3e4758c4d2fdd160117d27;hp=902ee771e1138e7e68904280f3faa6d01006a08a;hpb=51f0f8ed69b065cd2577a27c2a2911cdda243b99;p=oss%2Fcatdoc.git diff --git a/src/rtfread.c b/src/rtfread.c index 902ee77..af6be86 100644 --- a/src/rtfread.c +++ b/src/rtfread.c @@ -103,6 +103,7 @@ RTFTypeMap rtf_types[]={ #define RTFNAMEMAXLEN 32 #define RTFARGSMAXLEN 64 +#define MAX_DIGITS_IN_NUMBER 10 /** * Structure describing rtf command @@ -171,7 +172,7 @@ int rtf_level=0; extern unsigned short int buffer[]; void add_to_buffer(int *bufptr,unsigned short int c) { buffer[++(*bufptr)]=c; - if (*bufptr > PARAGRAPH_BUFFER-2) { + if (*bufptr >= PARAGRAPH_BUFFER-2) { buffer[++(*bufptr)]=0; output_paragraph(buffer); *bufptr=-1; @@ -261,8 +262,23 @@ int parse_rtf(FILE *f) { if (data_skip_mode == 0) add_to_buffer(&bufptr,com.numarg); i=groups[group_count].uc; - while((--i)>0) - fgetc(f); + while((--i)>0) { + int c=fgetc(f); + if (c == '\\') { + c = fgetc(f); + switch (c) { + case '\\': break; + case '\'': + /* skip two hex digits */ + fgetc(f); + fgetc(f); + break; + default: + break; + } + } + } + break; case RTF_PARA: /*if (para_mode > 0) {*/ @@ -352,9 +368,11 @@ signed long getNumber(FILE *f) { int c,count=0; char buf[RTFARGSMAXLEN]; - while(isdigit(c=fgetc(f)) || c=='-') { + while((isdigit(c=fgetc(f)) || c=='-')) { if(feof(f)) return -1; + if (count > MAX_DIGITS_IN_NUMBER) + break; buf[count++]=(char)c; } ungetc(c,f);