tags 427256 patch
thanks

On Sat, Jun 09, 2007 at 09:18:27PM +0100, Reuben Thomas wrote:
> On Fri, 8 Jun 2007, Robert Millan wrote:
> 
> >On Fri, Jun 08, 2007 at 08:35:10PM +0200, Reuben Thomas wrote:
> >>If you single-step in gdb from the call to search_forward you should be
> >>able to see where bogosity sets in. (But don't worry about that too much; 
> >>a
> >>correct backtrace is the main thing, I think.)
> >
> >With CVS from just a few minutes ago:
> 
> Thanks. Could you carry on until it crashes? BTW, I've tried using qemu, 
> but have been unable either to install Debian (although the installer 
> boots) or get a live CD to boot.

Oh, silly me!  I should have thought that -O2 was scrambling it...

With a clean backtrace I was able to figure out why it failed.  In this line:

  while (translate[(unsigned)*sp1++] == translate[(unsigned)*sp2++])

(unsigned) doesn't imply unsigned char, so when (signed) *sp1 < 0, you get
a huge number.

I fixed it by replacing this with (unsigned char).  My patch also replaces
a similar line in the next function.

-- 
Robert Millan

My spam trap is [EMAIL PROTECTED]  Note: this address is only intended
for spam harvesters.  Writing to it will get you added to my black list.
--- src/search.c~	2007-06-07 00:48:38.000000000 +0200
+++ src/search.c	2007-06-10 22:46:50.000000000 +0200
@@ -92,7 +92,7 @@
   for (; s1 <= e1 - s2size; s1++) {
     const char *sp1 = s1, *sp2 = s2;
 
-    while (translate[(unsigned)*sp1++] == translate[(unsigned)*sp2++])
+    while (translate[(unsigned char)*sp1++] == translate[(unsigned char)*sp2++])
       if (sp2 == e2)
         return sp1;
   }
@@ -109,7 +109,7 @@
   for (; e1 >= s1 + s2size; e1--) {
     const char *sp1 = e1, *sp2 = e2;
 
-    while (translate[(unsigned)*--sp1] == translate[(unsigned)*--sp2])
+    while (translate[(unsigned char)*--sp1] == translate[(unsigned char)*--sp2])
       if (sp2 == s2)
         return sp1;
   }

Reply via email to