X-Git-Url: http://www.wagner.pp.ru/gitweb/?p=oss%2Fcatdoc.git;a=blobdiff_plain;f=src%2Frtfread.c;h=86a57fbb771a4f04a15b27a8890263cbf963f826;hp=902ee771e1138e7e68904280f3faa6d01006a08a;hb=f03d3bbce7b36e358df5ee15fab1af190ffcad5a;hpb=51f0f8ed69b065cd2577a27c2a2911cdda243b99 diff --git a/src/rtfread.c b/src/rtfread.c index 902ee77..86a57fb 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) {*/ @@ -355,6 +371,8 @@ signed long getNumber(FILE *f) { 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);