A+
Name: wd_paranoid ChangeLog: being stricter about checks (especially in RVA translations) License: X11 GenDate: 2004/01/14 21:18:07 UTC ModifiedFiles: tools/winedump/main.c tools/winedump/pe.c tools/winedump/winedump.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/tools/winedump/main.c,v retrieving revision 1.13 diff -u -u -r1.13 main.c --- tools/winedump/main.c 13 May 2003 04:47:53 -0000 1.13 +++ tools/winedump/main.c 1 Jan 2004 08:53:47 -0000 @@ -404,7 +404,8 @@ if (globals.input_name == NULL) fatal("No file name has been given\n"); set_module_name(1); - dll_open (globals.input_name); + if (!dll_open (globals.input_name)) + break; output_spec_preamble (); output_header_preamble (); Index: tools/winedump/pe.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/tools/winedump/pe.c,v retrieving revision 1.30 diff -u -u -r1.30 pe.c --- tools/winedump/pe.c 11 Nov 2003 22:04:33 -0000 1.30 +++ tools/winedump/pe.c 1 Jan 2004 08:53:47 -0000 @@ -111,27 +111,23 @@ IMAGE_SECTION_HEADER* sectHead; int i; + if (rva == 0) return NULL; + sectHead = (IMAGE_SECTION_HEADER*)((char*)PE_nt_headers + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + PE_nt_headers->FileHeader.SizeOfOptionalHeader); - if (rva == 0) return NULL; - for (i = PE_nt_headers->FileHeader.NumberOfSections - 1; i >= 0; i--) { if (sectHead[i].VirtualAddress <= rva && rva + len <= (DWORD)sectHead[i].VirtualAddress + sectHead[i].SizeOfRawData) - break; - } - - if (i < 0) - { - printf("rva not found in any section (%lu)\n", rva); - return NULL; + { + /* return image import directory offset */ + return PRD(sectHead[i].PointerToRawData + rva - sectHead[i].VirtualAddress, len); + } } - /* return image import directory offset */ - return PRD(sectHead[i].PointerToRawData + rva - sectHead[i].VirtualAddress, len); + return NULL; } static void* get_dir(unsigned idx) @@ -170,7 +166,7 @@ printf(" Machine: %04X (%s)\n", fileHeader->Machine, get_machine_str(fileHeader->Machine)); printf(" Number of Sections: %d\n", fileHeader->NumberOfSections); - printf(" TimeDateStamp: %08lX (%s) offset %ld\n", + printf(" TimeDateStamp: %08lX (%s) offset %lu\n", fileHeader->TimeDateStamp, get_time_str(fileHeader->TimeDateStamp), Offset(&(fileHeader->TimeDateStamp))); printf(" PointerToSymbolTable: %08lX\n", fileHeader->PointerToSymbolTable); @@ -591,8 +587,12 @@ printf( " Callbacks %08lx -> {", (DWORD)dir->AddressOfCallBacks ); if (dir->AddressOfCallBacks) { - callbacks = RVA((DWORD)dir->AddressOfCallBacks - PE_nt_headers->OptionalHeader.ImageBase,0); - while (*callbacks) printf( " %08lx", *callbacks++ ); + DWORD addr = (DWORD)dir->AddressOfCallBacks - PE_nt_headers->OptionalHeader.ImageBase; + while ((callbacks = RVA(addr, sizeof(DWORD))) && *callbacks) + { + printf( " %08lx", *callbacks ); + addr += sizeof(DWORD); + } } printf(" }\n\n"); } @@ -704,6 +704,11 @@ unsigned int i, j; printf( "%s", prefix ); + if (!ptr) + { + printf("NULL\n"); + return; + } for (i = 0; i < size; i++) { printf( "%02x%c", ptr[i], (i % 16 == 7) ? '-' : ' ' ); @@ -1224,9 +1229,9 @@ * * Open a DLL and read in exported symbols */ -void dll_open (const char *dll_name) +int dll_open (const char *dll_name) { - pe_analysis(dll_name, do_grab_sym, SIG_PE); + return pe_analysis(dll_name, do_grab_sym, SIG_PE); } /******************************************************************* Index: tools/winedump/winedump.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/tools/winedump/winedump.h,v retrieving revision 1.8 diff -u -u -r1.8 winedump.h --- tools/winedump/winedump.h 26 Nov 2003 03:55:01 -0000 1.8 +++ tools/winedump/winedump.h 1 Jan 2004 08:53:47 -0000 @@ -157,9 +157,9 @@ void dump_file(const char* name); /* DLL functions */ -void dll_open (const char *dll_name); +int dll_open (const char *dll_name); -int dll_next_symbol (parsed_symbol * sym); +int dll_next_symbol (parsed_symbol * sym); /* Symbol functions */ int symbol_init(parsed_symbol* symbol, const char* name);