Ralf, On Mon, Feb 10, 2003 at 08:27:08PM +0100, Ralf Habacker wrote: > > I can reproduce it now. I will debug and try to fix it myself. If > > I'm unsuccessful, then I will ask Ralf for help. > > > Jason, your rebase depends on the ms imagehelp library, isn't it.
Not anymore: $ rebase -V rebase version 2.1 Copyright (c) 2001, 2002, 2003 Ralf Habacker and Jason Tishler We are partners in crime now. :,) The attached patch solves the SEGV problem. Your guard: (char *)relocp < (char *)relocs + size wasn't tight enough. My version: (char *)&relocp->SizeOfBlock < (char *)relocs + size seems to be. Did I break anything with this patch? Thanks, Jason -- PGP/GPG Key: http://www.tishler.net/jason/pubkey.asc or key servers Fingerprint: 7A73 1405 7F2B E669 C19D 8784 1AFD E4CC ECF4 8EF6
Index: sections.cc =================================================================== RCS file: /cvsroot/kde-cygwin/tools/rebase/sections.cc,v retrieving revision 1.9 diff -u -p -r1.9 sections.cc --- sections.cc 4 Jan 2003 12:43:00 -0000 1.9 +++ sections.cc 11 Feb 2003 13:23:34 -0000 @@ -270,7 +270,7 @@ bool Relocations::check(void) if (!relocs) return false; - for (; (char *)relocp < (char *)relocs + size && relocp->SizeOfBlock != 0; ((char *)relocp) += relocp->SizeOfBlock ) + for (; (char *)&relocp->SizeOfBlock < (char *)relocs + size && relocp->SizeOfBlock +!= 0; ((char *)relocp) += relocp->SizeOfBlock) { int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD); int va = relocp->VirtualAddress; @@ -302,7 +302,7 @@ bool Relocations::fix(void) if (debug) std::cerr << "warning: fixing bad relocations .... "; - for (; (char *)relocp < (char *)relocs + size && relocp->SizeOfBlock != 0; ((char *)relocp) += relocp->SizeOfBlock ) + for (; (char *)&relocp->SizeOfBlock < (char *)relocs + size && relocp->SizeOfBlock +!= 0; ((char *)relocp) += relocp->SizeOfBlock) { int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD); int va = relocp->VirtualAddress; @@ -337,7 +337,7 @@ bool Relocations::relocate(int differenc if (!relocs) return false; - for (; (char *)relocp < (char *)relocs + size && relocp->SizeOfBlock != 0; ((char *)relocp) += relocp->SizeOfBlock ) + for (; (char *)&relocp->SizeOfBlock < (char *)relocs + size && relocp->SizeOfBlock +!= 0; ((char *)relocp) += relocp->SizeOfBlock) { int NumOfRelocs = (relocp->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof (WORD); int va = relocp->VirtualAddress;