--- psiconv/trunk/lib/psiconv/parse_driver.c 2000/12/13 16:30:21 63 +++ psiconv/trunk/lib/psiconv/parse_driver.c 2000/12/15 00:21:51 64 @@ -31,7 +31,8 @@ psiconv_file_type_t res; int leng; - psiconv_parse_header_section(buf,0,0,&leng,&header); + if ((psiconv_parse_header_section(buf,0,0,&leng,&header))) + return psiconv_unknown_file; res = header->file; if (result) *result = header; @@ -49,13 +50,13 @@ int off=0; int leng; - (*result) = malloc(sizeof(**result)); + if (!((*result) = malloc(sizeof(**result)))) + goto ERROR1; (*result)->type = psiconv_file_type(buf,&leng,NULL); if ((*result)->type == psiconv_unknown_file) { psiconv_warn(lev+1,off,"Unknown file type: can't parse!"); (*result)->file = NULL; - res = -1; } else if ((*result)->type == psiconv_word_file) res = psiconv_parse_word_file(buf,lev+2,leng, (psiconv_word_f *)(&((*result)->file))); @@ -75,9 +76,18 @@ psiconv_warn(lev+1,off,"Can't parse this file yet!"); (*result)->file = NULL; } - res = -1; - - return res; + if (res) + goto ERROR2; + return 0; + +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Psion File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; } int psiconv_parse_clipart_file(const psiconv_buffer buf,int lev, @@ -90,23 +100,50 @@ psiconv_u32 *entry; psiconv_progress(lev+1,off,"Going to read a clipart file"); - (*result) = malloc(sizeof(**result)); + if (!((*result) = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off,"Going to read the MBM jumptable"); - res |= psiconv_parse_jumptable_section(buf,lev+2,off, NULL,&table); + if ((res = psiconv_parse_jumptable_section(buf,lev+2,off, NULL,&table))) + goto ERROR2; psiconv_progress(lev+2,off,"Going to read the clipart sections"); - (*result)->sections = psiconv_list_new(sizeof(*clipart)); + if (!((*result)->sections = psiconv_list_new(sizeof(*clipart)))) + goto ERROR3; for (i = 0; i < psiconv_list_length(table); i ++) { - entry = psiconv_list_get(table,i); + if (!(entry = psiconv_list_get(table,i))) + goto ERROR4; psiconv_progress(lev+3,off,"Going to read clipart section %i",i); - psiconv_parse_clipart_section(buf,lev+3,*entry,NULL,&clipart); - psiconv_list_add((*result)->sections,clipart); + if (!(psiconv_parse_clipart_section(buf,lev+3,*entry,NULL,&clipart))) + goto ERROR4; + if (!(psiconv_list_add((*result)->sections,clipart))) + goto ERROR5; } psiconv_free_jumptable_section(table); psiconv_progress(lev+1,off,"End of clipart file"); return res; +ERROR5: + psiconv_free_clipart_section(clipart); +ERROR4: + for (i = 0; i < psiconv_list_length((*result)->sections); i++) { + if (!(clipart = psiconv_list_get((*result)->sections,i))) { + psiconv_warn(lev+1,off,"Massive memory corruption"); + goto ERROR3; + } + psiconv_free_clipart_section(clipart); + } + psiconv_list_free((*result)->sections); +ERROR3: + psiconv_free_jumptable_section(table); +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Clipart File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; } int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off, @@ -120,27 +157,57 @@ psiconv_u32 sto; psiconv_progress(lev+1,off,"Going to read a mbm file"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable"); - sto = psiconv_read_u32(buf,lev+2,off); + sto = psiconv_read_u32(buf,lev+2,off,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off,"Offset: %08x",sto); psiconv_progress(lev+2,off,"Going to read the MBM jumptable"); - res |= psiconv_parse_jumptable_section(buf,lev+2,sto, NULL,&table); + if ((res = psiconv_parse_jumptable_section(buf,lev+2,sto, NULL,&table))) + goto ERROR2; psiconv_progress(lev+2,off,"Going to read the picture sections"); - (*result)->sections = psiconv_list_new(sizeof(*paint)); + if (!((*result)->sections = psiconv_list_new(sizeof(*paint)))) + goto ERROR3; for (i = 0; i < psiconv_list_length(table); i ++) { - entry = psiconv_list_get(table,i); + if (!(entry = psiconv_list_get(table,i))) + goto ERROR4; psiconv_progress(lev+3,off,"Going to read picture section %i",i); - psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,0,&paint); - psiconv_list_add((*result)->sections,paint); + if ((res = psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL, + 0,&paint))) + goto ERROR4; + if ((res = psiconv_list_add((*result)->sections,paint))) + goto ERROR5; } psiconv_free_jumptable_section(table); psiconv_progress(lev+1,off,"End of mbm file"); - return res; + return 0; +ERROR5: + psiconv_free_paint_data_section(paint); +ERROR4: + for (i = 0; i < psiconv_list_length((*result)->sections); i++) { + if (!(paint = psiconv_list_get((*result)->sections,i))) { + psiconv_warn(lev+1,off,"Massive memory corruption"); + goto ERROR3; + } + psiconv_free_paint_data_section(paint); + } + psiconv_list_free((*result)->sections); +ERROR3: + psiconv_free_jumptable_section(table); +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of MBM File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; } int psiconv_parse_sketch_file(const psiconv_buffer buf,int lev, @@ -158,19 +225,24 @@ char *temp_str; psiconv_progress(lev+1,off,"Going to read a sketch file"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off, "Going to read the offset of the section table section"); - sto = psiconv_read_u32(buf,lev+2,off); + sto = psiconv_read_u32(buf,lev+2,off,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off,"Offset: %08x",sto); psiconv_progress(lev+2,sto, "Going to read the section table section"); - res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table); + if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table))) + goto ERROR2; for (i = 0; i < psiconv_list_length(table); i ++) { psiconv_progress(lev+2,sto, "Going to read entry %d",i); - entry = psiconv_list_get(table,i); + if (!(entry = psiconv_list_get(table,i))) + goto ERROR3; if (entry->id == PSICONV_ID_APPL_ID_SECTION) { applid_sec = entry->offset; psiconv_debug(lev+3,sto, @@ -181,23 +253,24 @@ "Found the Sketch section at %08x",sketch_sec); } else { psiconv_warn(lev+3,sto, - "Found unknown section in the Section Table"); + "Found unknown section in the Section Table (ignoring)"); psiconv_debug(lev+3,sto, "Section ID %08x, offset %08x",entry->id,entry->offset); - res = -1; } } psiconv_progress(lev+2,sto, "Looking for the Application ID section"); if (! applid_sec) { - psiconv_warn(lev+2,sto, - "Application ID section not found in the section table"); - res = -1; + psiconv_warn(lev+2,sto, + "Application ID section not found in the section table"); + res = -PSICONV_E_PARSE; + goto ERROR3; } else { psiconv_debug(lev+2,sto, "Application ID section at offset %08x",applid_sec); - res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, - &appl_id); + if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, + &appl_id))) + goto ERROR3; } if ((appl_id->id != PSICONV_ID_SKETCH) || strcmp(appl_id->name,"Paint.app")) { @@ -205,22 +278,25 @@ "Application ID section contains unexpected data"); psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found", PSICONV_ID_SKETCH,appl_id->id); - temp_str = psiconv_make_printable(appl_id->name); + if (!(temp_str = psiconv_make_printable(appl_id->name))) + goto ERROR4; psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found", "Paint.app",temp_str); free(temp_str); + res = -PSICONV_E_PARSE; + goto ERROR4; } psiconv_progress(lev+2,sto, "Looking for the Sketch section"); if (! sketch_sec) { psiconv_warn(lev+2,sto, "Sketch section not found in the section table"); - res = -1; } else { psiconv_debug(lev+2,sto, "Sketch section at offset %08x",applid_sec); - res |= psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0, - &(*result)->sketch_sec); + if ((res = psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0, + &(*result)->sketch_sec))) + goto ERROR4; } psiconv_free_application_id_section(appl_id); @@ -228,8 +304,20 @@ psiconv_progress(lev+1,off,"End of word file"); return res; + +ERROR4: + psiconv_free_application_id_section(appl_id); +ERROR3: + free(table); +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Scketch File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; } - int psiconv_parse_texted_file(const psiconv_buffer buf,int lev, @@ -250,19 +338,24 @@ int i; psiconv_progress(lev+1,off,"Going to read a texted file"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off, "Going to read the offset of the section table section"); - sto = psiconv_read_u32(buf,lev+2,off); + sto = psiconv_read_u32(buf,lev+2,off,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off,"Offset: %08x",sto); psiconv_progress(lev+2,sto, "Going to read the section table section"); - res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table); + if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table))) + goto ERROR2; for (i = 0; i < psiconv_list_length(table); i ++) { psiconv_progress(lev+2,sto, "Going to read entry %d",i); - entry = psiconv_list_get(table,i); + if (!(entry = psiconv_list_get(table,i))) + goto ERROR3; if (entry->id == PSICONV_ID_APPL_ID_SECTION) { applid_sec = entry->offset; psiconv_debug(lev+3,sto, @@ -277,10 +370,9 @@ "Found the TextEd section at %08x",texted_sec); } else { psiconv_warn(lev+3,sto, - "Found unknown section in the Section Table"); + "Found unknown section in the Section Table (ignoring)"); psiconv_debug(lev+3,sto, "Section ID %08x, offset %08x",entry->id,entry->offset); - res = -1; } } @@ -288,12 +380,14 @@ if (! applid_sec) { psiconv_warn(lev+2,sto, "Application ID section not found in the section table"); - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR3; } else { psiconv_debug(lev+2,sto, "Application ID section at offset %08x",applid_sec); - res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, - &appl_id); + if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, + &appl_id))) + goto ERROR3; } if ((appl_id->id != PSICONV_ID_TEXTED) || strcmp(appl_id->name,"TextEd.app")) { @@ -301,10 +395,13 @@ "Application ID section contains unexpected data"); psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found", PSICONV_ID_TEXTED,appl_id->id); - temp_str = psiconv_make_printable(appl_id->name); + if (!(temp_str = psiconv_make_printable(appl_id->name))) + goto ERROR4; psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found", "TextEd.app",temp_str); free(temp_str); + res = -PSICONV_E_PARSE; + goto ERROR4; } psiconv_progress(lev+2,sto, @@ -312,30 +409,34 @@ if (! page_sec) { psiconv_warn(lev+2,sto, "Page layout section not found in the section table"); - (*result)->page_sec = NULL; - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR4; } else { psiconv_debug(lev+2,sto, "Page layout section at offset %08x",page_sec); - res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL, - &(*result)->page_sec); + if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL, + &(*result)->page_sec))) + goto ERROR4; } - base_char = psiconv_basic_character_layout(); - base_para = psiconv_basic_paragraph_layout(); + if (!(base_char = psiconv_basic_character_layout())) + goto ERROR5; + if (!(base_para = psiconv_basic_paragraph_layout())) + goto ERROR6; psiconv_progress(lev+2,sto, "Looking for the TextEd section"); if (! texted_sec) { psiconv_warn(lev+2,sto, "TextEd section not found in the section table"); - (*result)->texted_sec = NULL; - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR7; } else { psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec); - res |= psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL, + if ((res = psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL, &(*result)->texted_sec, - base_char,base_para); + base_char,base_para))) + goto ERROR7; } psiconv_free_character_layout(base_char); psiconv_free_paragraph_layout(base_para); @@ -343,8 +444,27 @@ psiconv_free_application_id_section(appl_id); psiconv_free_section_table_section(table); - psiconv_progress(lev+1,off,"End of word file"); - return res; + psiconv_progress(lev+1,off,"End of TextEd file"); + return 0; + +ERROR7: + psiconv_free_paragraph_layout(base_para); +ERROR6: + psiconv_free_character_layout(base_char); +ERROR5: + psiconv_free_page_layout_section((*result)->page_sec); +ERROR4: + psiconv_free_application_id_section(appl_id); +ERROR3: + psiconv_free_section_table_section(table); +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of TextEd File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; } int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off, @@ -366,20 +486,25 @@ int i; psiconv_progress(lev+1,off,"Going to read a word file"); - *result = malloc(sizeof(**result)); + if (!(*result = malloc(sizeof(**result)))) + goto ERROR1; psiconv_progress(lev+2,off, "Going to read the offset of the section table section"); - sto = psiconv_read_u32(buf,lev+2,off); + sto = psiconv_read_u32(buf,lev+2,off,&res); + if (res) + goto ERROR2; psiconv_debug(lev+2,off,"Offset: %08x",sto); psiconv_progress(lev+2,sto, "Going to read the section table section"); - res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table); + if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table))) + goto ERROR2; for (i = 0; i < psiconv_list_length(table); i ++) { psiconv_progress(lev+2,sto, "Going to read entry %d",i); - entry = psiconv_list_get(table,i); + if (!(entry = psiconv_list_get(table,i))) + goto ERROR3; if (entry->id == PSICONV_ID_APPL_ID_SECTION) { applid_sec = entry->offset; psiconv_debug(lev+3,sto, @@ -397,7 +522,8 @@ "Found the Password section at %08x",pwd_sec); psiconv_warn(lev+3,sto, "Password section found - can't read encrypted data"); - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR3; } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) { status_sec = entry->offset; psiconv_debug(lev+3,sto, @@ -412,10 +538,9 @@ "Found the Layout section at %08x",layout_sec); } else { psiconv_warn(lev+3,sto, - "Found unknown section in the Section Table"); + "Found unknown section in the Section Table (ignoring)"); psiconv_debug(lev+3,sto, "Section ID %08x, offset %08x",entry->id,entry->offset); - res = -1; } } @@ -424,23 +549,27 @@ "Looking for the Status section"); if (!status_sec) { psiconv_warn(lev+2,sto, "Status section not found in the section table"); - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR3; } else { psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec); - res |= psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL, - &((*result)->status_sec)); + if ((res = psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL, + &((*result)->status_sec)))) + goto ERROR3; } psiconv_progress(lev+2,sto, "Looking for the Application ID section"); if (! applid_sec) { psiconv_warn(lev+2,sto, "Application ID section not found in the section table"); - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR4; } else { psiconv_debug(lev+2,sto, "Application ID section at offset %08x",applid_sec); - res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, - &appl_id); + if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL, + &appl_id))) + goto ERROR4; } if ((appl_id->id != PSICONV_ID_WORD) || strcmp(appl_id->name,"Word.app")) { @@ -448,10 +577,13 @@ "Application ID section contains unexpected data"); psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found", PSICONV_ID_WORD,appl_id->id); - temp_str = psiconv_make_printable(appl_id->name); + if (!(temp_str = psiconv_make_printable(appl_id->name))) + goto ERROR5; psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found", "Word.app",temp_str); free(temp_str); + res = -PSICONV_E_PARSE; + goto ERROR5; } psiconv_progress(lev+2,sto, @@ -459,13 +591,14 @@ if (! page_sec) { psiconv_warn(lev+2,sto, "Page layout section not found in the section table"); - (*result)->page_sec = NULL; - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR5; } else { psiconv_debug(lev+2,sto, "Page layout section at offset %08x",page_sec); - res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL, - &(*result)->page_sec); + if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL, + &(*result)->page_sec))) + goto ERROR5; } psiconv_progress(lev+2,sto, @@ -473,50 +606,67 @@ if (!styles_sec) { psiconv_warn(lev+2,sto, "Word styles section not found in the section table"); - (*result)->styles_sec = NULL; - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR6; } else { psiconv_debug(lev+2,sto, "Word styles section at offset %08x",styles_sec); - res |= psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL, - &(*result)->styles_sec); + if ((res = psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL, + &(*result)->styles_sec))) + goto ERROR6; } psiconv_progress(lev+2,sto, "Looking for the Text section"); if (!text_sec) { psiconv_warn(lev+2,sto, "Text section not found in the section table"); - (*result)->paragraphs = NULL; - res = -1; + res = -PSICONV_E_PARSE; + goto ERROR7; } else { psiconv_debug(lev+2,sto, "Text section at offset %08x",text_sec); - res |= psiconv_parse_text_section(buf,lev+2,text_sec,NULL, - &(*result)->paragraphs); + if ((res = psiconv_parse_text_section(buf,lev+2,text_sec,NULL, + &(*result)->paragraphs))) + goto ERROR7; } - if (((*result)->paragraphs) && ((*result)->styles_sec)) { - psiconv_progress(lev+2,sto, - "Looking for the Layout section"); - if (!layout_sec) { - psiconv_debug(lev+2,sto, - "Layout section not found in the section table"); - res = -1; - } else { - psiconv_debug(lev+2,sto, - "Layout section at offset %08x",layout_sec); - res |= psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL, - (*result)->paragraphs, - (*result)->styles_sec); - } - } else + psiconv_progress(lev+2,sto, "Looking for the Layout section"); + if (!layout_sec) { + psiconv_debug(lev+2,sto, "No layout section today"); + } else { psiconv_debug(lev+2,sto, - "Skipping search for Layout section, as either the " - "text or the word styles section was not found"); + "Layout section at offset %08x",layout_sec); + if ((res = psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL, + (*result)->paragraphs, + (*result)->styles_sec))) + goto ERROR8; + } psiconv_free_application_id_section(appl_id); psiconv_free_section_table_section(table); psiconv_progress(lev+1,off,"End of word file"); return res; + + +ERROR8: + psiconv_free_text_and_layout((*result)->paragraphs); +ERROR7: + psiconv_free_word_styles_section((*result)->styles_sec); +ERROR6: + psiconv_free_page_layout_section((*result)->page_sec); +ERROR5: + psiconv_free_application_id_section(appl_id); +ERROR4: + psiconv_free_word_status_section((*result)->status_sec); +ERROR3: + psiconv_free_section_table_section(table); +ERROR2: + free(*result); +ERROR1: + psiconv_warn(lev+1,off,"Reading of Word File failed"); + if (res == 0) + return -PSICONV_E_NOMEM; + else + return res; }