--- psiconv/trunk/lib/psiconv/parse_image.c 2000/12/13 16:30:21 63 +++ psiconv/trunk/lib/psiconv/parse_image.c 2000/12/15 00:21:51 64 @@ -33,17 +33,23 @@ int i; psiconv_progress(lev+1,off+len,"Going to read the jumptable section"); - (*result) = psiconv_list_new(sizeof(psiconv_u32)); + if (!((*result) = psiconv_list_new(sizeof(psiconv_u32)))) + goto ERROR1; psiconv_progress(lev+2,off+len,"Going to read the list length"); - listlen = psiconv_read_u32(buf,lev+2,off+len); + listlen = psiconv_read_u32(buf,lev+2,off+len,&res); + if (!res) + goto ERROR2; psiconv_debug(lev+2,off+len,"List length: %08x",listlen); len += 4; psiconv_progress(lev+2,off+len,"Going to read the list"); for (i = 0; i < listlen; i++) { - temp = psiconv_read_u32(buf,lev+2,off+len); - psiconv_list_add(*result,&temp); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (!res) + goto ERROR2; + if ((res = psiconv_list_add(*result,&temp))) + goto ERROR2; psiconv_debug(lev+3,off+len,"Offset: %08x",temp); len += 4; } @@ -54,7 +60,18 @@ psiconv_progress(lev+1,off+len-1,"End of jumptable section " "(total length: %08x)", len); - return res; + return 0; + +ERROR2: + psiconv_list_free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Jumptable Section failed"); + if (length) + *length = 0; + if (!res) + return -PSICONV_E_NOMEM; + else + return res; } static int decode_byte(int lev, psiconv_u32 off, @@ -77,7 +94,8 @@ data->red[*pixelnr] = data->green[*pixelnr] = data->blue[*pixelnr] = ((float) (byte & mask)) / ((1 << bits_per_pixel) -1); psiconv_debug(lev+1,off,"Pixel %04x: (%04x,%04x) value %02x, color %f", - *pixelnr,*pixelnr % data->xsize,*pixelnr / data->xsize, byte&mask, data->red[*pixelnr]); + *pixelnr,*pixelnr % data->xsize, + *pixelnr / data->xsize, byte&mask, data->red[*pixelnr]); byte = byte >> bits_per_pixel; (*pixelnr) ++; } @@ -97,7 +115,6 @@ { int res = 0; int len = 0; - int read_err = 0; psiconv_u32 size,offset,picsize,temp,datasize,pixelnr,datanr,linelen; psiconv_u8 marker; int i,leng; @@ -105,15 +122,20 @@ int linepos = 0; psiconv_progress(lev+1,off,"Going to read a paint data section"); - (*result) = malloc(sizeof(**result)); + if (!((*result) = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off+len,"Going to read section size"); - size = psiconv_read_u32(buf,lev+2,off+len); + size = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Section size: %08x",size); len += 4; psiconv_progress(lev+2,off+len,"Going to read pixel data offset"); - offset = psiconv_read_u32(buf,lev+2,off+len); + offset = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (offset != 0x28) { psiconv_warn(lev+2,off+len, "Paint data section data offset has unexpected value"); @@ -124,53 +146,66 @@ len += 4; psiconv_progress(lev+2,off+len,"Going to read picture X size"); - (*result)->xsize = psiconv_read_u32(buf,lev+2,off+len); + (*result)->xsize = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture X size: %08x:",(*result)->xsize); len += 4; psiconv_progress(lev+2,off+len,"Going to read picture Y size"); - (*result)->ysize = psiconv_read_u32(buf,lev+2,off+len); + (*result)->ysize = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture Y size: %08x:",(*result)->ysize); len += 4; picsize = (*result)->ysize * (*result)->xsize; psiconv_progress(lev+2,off+len,"Going to read the real picture x size"); - (*result)->pic_xsize = psiconv_read_length(buf,lev+2,off+len,&leng); + (*result)->pic_xsize = psiconv_read_length(buf,lev+2,off+len,&leng,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture x size: %f",(*result)->pic_xsize); len += leng; psiconv_progress(lev+2,off+len,"Going to read the real picture y size"); - (*result)->pic_ysize = psiconv_read_length(buf,lev+2,off+len,&leng); + (*result)->pic_ysize = psiconv_read_length(buf,lev+2,off+len,&leng,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture y size: %f",(*result)->pic_ysize); len += leng; psiconv_progress(lev+2,off+len,"Going to read the number of bits per pixel"); - bits_per_pixel=psiconv_read_u32(buf,lev+2,off+len); + bits_per_pixel=psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (bits_per_pixel > 8) { psiconv_warn(lev+2,off+len,"Picture has too many colors"); psiconv_debug(lev+2,off+len,"Read %d colorbits",bits_per_pixel); - res = -1; - bits_per_pixel = 2; + res = -PSICONV_E_PARSE; + goto ERROR2; } psiconv_debug(lev+2,off+len,"Bits per pixel: %d",bits_per_pixel); len += 4; for (i = 0 ; i < 2; i++) { - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 00) { psiconv_warn(lev+2,off+len, - "Paint data section prologue has unknown values"); + "Paint data section prologue has unknown values (ignored)"); psiconv_debug(lev+2,off+len, "offset %02x: read %08x, expected %08x",i,temp, 0x00); - res = -1; } len += 4; } psiconv_progress(lev+2,off+len, "Going to read whether RLE compression is used"); - compression=psiconv_read_u32(buf,lev+2,off+len); + compression=psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (compression > 1) { psiconv_warn(lev+2,off+len,"Paint data section has unknown " "compression type, assuming RLE"); @@ -182,30 +217,35 @@ if (isclipart) { psiconv_progress(lev+2,off+len,"Going to read an unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0xffffffff) { psiconv_warn(lev+2,off+len, - "Paint data section prologue has unknown values"); + "Paint data section prologue has unknown values (ignoring)"); psiconv_debug(lev+2,off+len, "offset %02x: read %08x, expected %08x",i,temp, 0xffffffff); - res = -1; } len += 4; psiconv_progress(lev+2,off+len,"Going to read a second unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0x44) { psiconv_warn(lev+2,off+len, - "Paint data section prologue has unknown values"); + "Paint data section prologue has unknown values (ignoring)"); psiconv_debug(lev+2,off+len, "offset %02x: read %08x, expected %08x",i,temp, 0x44); - res = -1; } len += 4; } - (*result)->red = malloc(sizeof(float) * picsize); - (*result)->green = malloc(sizeof(float) * picsize); - (*result)->blue = malloc(sizeof(float) * picsize); + if (!((*result)->red = malloc(sizeof(float) * picsize))) + goto ERROR2; + if (!((*result)->green = malloc(sizeof(float) * picsize))) + goto ERROR3; + if (!((*result)->blue = malloc(sizeof(float) * picsize))) + goto ERROR4; len = offset; datasize = size - len; if (isclipart) @@ -218,11 +258,12 @@ linelen = datasize / (*result)->ysize; psiconv_debug(lev+3,off+len,"Line length: %04x bytes",linelen); while((datanr < datasize)) { - temp = psiconv_read_u8(buf,lev+2,off+len+datanr); + temp = psiconv_read_u8(buf,lev+2,off+len+datanr,&res); + if (res) + goto ERROR5; if (decode_byte(lev+3,off+len+datanr,*result,&pixelnr,temp,bits_per_pixel, linelen,&linepos,picsize)) { - read_err = 1; - res = -1; + res = -PSICONV_E_PARSE; break; } datanr++; @@ -232,7 +273,9 @@ datanr = 0; i = 0; while (datanr < datasize) { - marker = psiconv_read_u8(buf,lev+3,off+len+datanr); + marker = psiconv_read_u8(buf,lev+3,off+len+datanr,&res); + if (res) + goto ERROR5; if (marker >= 0x80) { datanr += 0x100 - marker + 1; i += 0x100 - marker; @@ -245,7 +288,9 @@ datanr=0; psiconv_debug(lev+2,off+len,"Linelen: %04x bytes",linelen); while((datanr < datasize)) { - marker = psiconv_read_u8(buf,lev+3,off+len+datanr); + marker = psiconv_read_u8(buf,lev+3,off+len+datanr,&res); + if (res) + goto ERROR5; psiconv_debug(lev+3,off+len+datanr, "Pixelnr %08x, Datanr %08x: Read marker %02x", pixelnr,datanr,marker); @@ -259,15 +304,15 @@ "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, datanr,marker); - read_err = 1; - res = -1; + res = -PSICONV_E_PARSE; break; } - temp = psiconv_read_u8(buf,lev+2,off+len+datanr); + temp = psiconv_read_u8(buf,lev+2,off+len+datanr,&res); + if (res) + goto ERROR5; if (decode_byte(lev+2,off+len+datanr,*result,&pixelnr,temp, bits_per_pixel,linelen,&linepos,picsize)) { - res = -1; - read_err = 1; + res = -PSICONV_E_PARSE; break; } } @@ -278,15 +323,15 @@ "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, datanr,marker); - read_err = 1; - res = -1; + res = -PSICONV_E_PARSE; } else { - temp = psiconv_read_u8(buf,lev+3,off+len+datanr); + temp = psiconv_read_u8(buf,lev+3,off+len+datanr,&res); + if (res) + goto ERROR5; for (i = 0; i <= marker; i++) { if (decode_byte(lev+2,off+len+datanr,*result,&pixelnr,temp, bits_per_pixel,linelen,&linepos,picsize)) { - read_err = 1; - res = -1; + res = -PSICONV_E_PARSE; break; } } @@ -300,12 +345,12 @@ (8/bits_per_pixel)) datanr += (linelen - linepos); - if (!read_err && ((datanr != datasize) || (pixelnr != picsize))) { + if (res || (datanr != datasize) || (pixelnr != picsize)) { psiconv_warn(lev+2,off+len,"Corrupted picture data!"); psiconv_debug(lev+3,off+len+datanr, "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," "Datanr: %08x",picsize,datasize,pixelnr,datanr); - res = -1; + goto ERROR5; } len += datanr; @@ -317,6 +362,23 @@ "(total length: %08x)", len); return res; + +ERROR5: + free((*result)->blue); +ERROR4: + free((*result)->green); +ERROR3: + free((*result)->red); +ERROR2: + free (*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Paint Data Section failed"); + if (length) + *length = 0; + if (!res) + return -PSICONV_E_NOMEM; + else + return res; } int psiconv_parse_sketch_section(const psiconv_buffer buf, int lev, @@ -330,99 +392,124 @@ int i; psiconv_progress(lev+1,off,"Going to read the sketch section"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; if (!is_object) { psiconv_progress(lev+2,off+len,"Going to read the form hor. size"); - (*result)->form_xsize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->form_xsize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Form hor. size: %04x", (*result)->form_xsize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the form ver. size"); - (*result)->form_ysize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->form_ysize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Form ver. size: %04x", (*result)->form_ysize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the picture hor. offset"); - (*result)->picture_x_offset = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_x_offset = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture hor. offset: %04x", (*result)->picture_x_offset); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the picture ver. offset"); - (*result)->picture_y_offset = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_y_offset = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture ver. offset: %04x", (*result)->picture_y_offset); len += 0x02; psiconv_progress(lev+2,off+len,"Going to skip 5 words of zeros"); for (i = 0; i < 5; i++) { - temp = psiconv_read_u16(buf,lev+2,off+len); + temp = psiconv_read_u16(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0) { psiconv_warn(lev+2,off+len, - "Unexpected value in sketch section preamble"); + "Unexpected value in sketch section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Word %d: Read %04x, expected %04x",i, temp,0); - res = -1; } off += 0x02; } } else { psiconv_progress(lev+2,off+len,"Going to read the displayed hor. size"); - (*result)->picture_xsize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_xsize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Displayed hor. size: %04x", (*result)->picture_xsize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the displayed ver. size"); - (*result)->picture_ysize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_ysize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Displayed ver. size: %04x", (*result)->picture_ysize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to skip 2 words of zeros"); for (i = 0; i < 2; i++) { - temp = psiconv_read_u16(buf,lev+2,off+len); + temp = psiconv_read_u16(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0) { psiconv_warn(lev+2,off+len, - "Unexpected value in sketch section preamble"); + "Unexpected value in sketch section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Word %d: Read %04x, expected %04x",i, temp,0); - res = -1; } off += 0x02; } psiconv_progress(lev+2,off+len,"Going to read the picture hor. offset"); - (*result)->picture_x_offset = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_x_offset = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture hor. offset: %04x", (*result)->picture_x_offset); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the picture ver. offset"); - (*result)->picture_y_offset = psiconv_read_u16(buf,lev+2,off + len); + (*result)->picture_y_offset = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Picture ver. offset: %04x", (*result)->picture_y_offset); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the form hor. size"); - (*result)->form_xsize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->form_xsize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Form hor. size: %04x", (*result)->form_xsize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the form ver. size"); - (*result)->form_ysize = psiconv_read_u16(buf,lev+2,off + len); + (*result)->form_ysize = psiconv_read_u16(buf,lev+2,off + len,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off+len,"Form ver. size: %04x", (*result)->form_ysize); len += 0x02; psiconv_progress(lev+2,off+len,"Going to skip 1 zero word"); - temp = psiconv_read_u16(buf,lev+2,off+len); + temp = psiconv_read_u16(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0) { psiconv_warn(lev+2,off+len, - "Unexpected value in sketch section preamble"); + "Unexpected value in sketch section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %04x, expected %04x",i, temp,0); - res = -1; } off += 0x02; } psiconv_progress(lev+2,off+len,"Going to read the picture data"); - res |= psiconv_parse_paint_data_section(buf,lev+2,off+len,&leng,0, - &((*result)->picture)); + if ((res = psiconv_parse_paint_data_section(buf,lev+2,off+len,&leng,0, + &((*result)->picture)))) + goto ERROR2; off += leng; if (!is_object) { (*result)->picture_xsize = (*result)->picture->xsize; @@ -430,36 +517,48 @@ } psiconv_progress(lev+2,off+len,"Going to read the hor. magnification"); - (*result)->magnification_x = psiconv_read_u16(buf,lev+2,off + len) / 1000.0; + (*result)->magnification_x = psiconv_read_u16(buf,lev+2,off+len,&res)/1000.0; + if (res) + goto ERROR3; psiconv_debug(lev+2,off+len,"Form hor. magnification: %f", (*result)->magnification_x); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the ver. magnification"); - (*result)->magnification_y = psiconv_read_u16(buf,lev+2,off + len) / 1000.0; + (*result)->magnification_y = psiconv_read_u16(buf,lev+2,off+len,&res)/1000.0; + if (res) + goto ERROR3; psiconv_debug(lev+2,off+len,"Form ver. magnification: %f", (*result)->magnification_y); len += 0x02; psiconv_progress(lev+2,off+len,"Going to read the left cut"); - temp = psiconv_read_u32(buf,lev+2,off + len); + temp = psiconv_read_u32(buf,lev+2,off + len,&res); + if (res) + goto ERROR3; (*result)->cut_left = (temp * 6.0) / (*result)->picture_xsize; psiconv_debug(lev+2,off+len,"Left cut: raw %08x, real: %f", temp,(*result)->cut_left); len += 0x04; psiconv_progress(lev+2,off+len,"Going to read the right cut"); - temp = psiconv_read_u32(buf,lev+2,off + len); + temp = psiconv_read_u32(buf,lev+2,off + len,&res); + if (res) + goto ERROR3; (*result)->cut_right = (temp * 6.0) / (*result)->picture_xsize; psiconv_debug(lev+2,off+len,"Right cut: raw %08x, real: %f", temp,(*result)->cut_right); len += 0x04; psiconv_progress(lev+2,off+len,"Going to read the top cut"); - temp = psiconv_read_u32(buf,lev+2,off + len); + temp = psiconv_read_u32(buf,lev+2,off + len,&res); + if (res) + goto ERROR3; (*result)->cut_top = (temp * 6.0) / (*result)->picture_ysize; psiconv_debug(lev+2,off+len,"Top cut: raw %08x, real: %f", temp,(*result)->cut_top); len += 0x04; psiconv_progress(lev+2,off+len,"Going to read the bottom cut"); - temp = psiconv_read_u32(buf,lev+2,off + len); + temp = psiconv_read_u32(buf,lev+2,off + len,&res); + if (res) + goto ERROR3; (*result)->cut_bottom = (temp * 6.0) / (*result)->picture_ysize; psiconv_debug(lev+2,off+len,"Bottom cut: raw %08x, real: %f", temp,(*result)->cut_bottom); @@ -472,6 +571,18 @@ "End of sketch section (total length: %08x)", len); return res; +ERROR3: + psiconv_free_paint_data_section((*result)->picture); +ERROR2: + free (*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Sketch Section failed"); + if (length) + *length = 0; + if (!res) + return -PSICONV_E_NOMEM; + else + return res; } @@ -485,69 +596,76 @@ psiconv_u32 temp; psiconv_progress(lev+1,off+len,"Going to read the clipart section"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off+len,"Going to read the section ID"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != PSICONV_ID_CLIPART_ITEM) { psiconv_warn(lev+2,off+len, - "Unexpected value in clipart section preamble"); + "Unexpected value in clipart section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %08x, expected %08x",temp, PSICONV_ID_CLIPART_ITEM); - res = -1; } else psiconv_debug(lev+2,off+len,"Clipart ID: %08x", temp); off += 4; psiconv_progress(lev+2,off+len,"Going to read an unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0x02) { psiconv_warn(lev+2,off+len, - "Unexpected value in clipart section preamble"); + "Unexpected value in clipart section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %08x, expected %08x",temp, 0x02); - res = -1; } else psiconv_debug(lev+2,off+len,"First unknown long: %08x", temp); off += 4; psiconv_progress(lev+2,off+len,"Going to read a second unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0) { psiconv_warn(lev+2,off+len, - "Unexpected value in clipart section preamble"); + "Unexpected value in clipart section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %08x, expected %08x",temp, 0); - res = -1; } else psiconv_debug(lev+2,off+len,"Second unknown long: %08x", temp); off += 4; psiconv_progress(lev+2,off+len,"Going to read a third unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if (temp != 0) { psiconv_warn(lev+2,off+len, - "Unexpected value in clipart section preamble"); + "Unexpected value in clipart section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %08x, expected %08x",temp, 0); - res = -1; } else psiconv_debug(lev+2,off+len,"Third unknown long: %08x", temp); off += 4; psiconv_progress(lev+2,off+len,"Going to read a fourth unknown long"); - temp = psiconv_read_u32(buf,lev+2,off+len); + temp = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR2; if ((temp != 0x0c) && (temp != 0x08)) { psiconv_warn(lev+2,off+len, - "Unexpected value in clipart section preamble"); + "Unexpected value in clipart section preamble (ignored)"); psiconv_debug(lev+2,off+len,"Read %08x, expected %08x or %08x",temp, 0x0c, 0x08); - res = -1; } else psiconv_debug(lev+2,off+len,"Fourth unknown long: %08x", temp); off += 4; psiconv_progress(lev+2,off+len,"Going to read the Paint Data Section"); - res |= psiconv_parse_paint_data_section(buf,lev+2,off+len,&leng,1, - &((*result)->picture)); + if ((res = psiconv_parse_paint_data_section(buf,lev+2,off+len,&leng,1, + &((*result)->picture)))) + goto ERROR2; len += leng; if (length) @@ -555,6 +673,16 @@ psiconv_progress(lev,off+len-1, "End of clipart section (total length: %08x)", len); + return 0; - return res; +ERROR2: + free (*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Font failed"); + if (length) + *length = 0; + if (!res) + return -PSICONV_E_NOMEM; + else + return res; }