From murdoch at stats.uwo.ca  Sat Mar 24 23:11:26 2007
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Sat, 24 Mar 2007 18:11:26 -0400
Subject: [Rd] Subtle bug in do_basename
In-Reply-To: <46059FF5.409@vanderbilt.edu>
References: <46059FF5.409@vanderbilt.edu>
Message-ID: <4605A20E.8030008@stats.uwo.ca>

On 3/24/2007 6:02 PM, Jeffrey Horner wrote:
> Hello,
> 
> 
> I've been wondering why my no-optimization R-devel builds have been 
> hanging during "building/updating package indices ...". I tracked it 
> down with gdb to this line from do_basename in utils.c:
> 
> while ( *(p = buf + strlen(buf) - 1) == fsp ) *p = '\0';
> 
> Now, imagine if your compiler places the variable fsp immediately before 
> buf on the stack, and strlen(buf) is 0. Yup, you get an infinite loop 
> because p will always be assigned the address of fsp. I'm not quite sure 
> what happens when the stack variables are ordered in a different 
> configuration, probably something bad?
> 
> Here's a quick fix, but maybe someone would want to find a better one:

I think that looks like the right solution; I'll commit it.

Duncan Murdoch
> 
> $ svn diff src/main/util.c
> Index: src/main/util.c
> ===================================================================
> --- src/main/util.c     (revision 40876)
> +++ src/main/util.c     (working copy)
> @@ -694,7 +694,8 @@
>          R_fixslash(buf);
>   #endif
>          /* remove trailing file separator(s) */
> -       while ( *(p = buf + strlen(buf) - 1) == fsp ) *p = '\0';
> +       if(strlen(p))
> +           while ( *(p = buf + strlen(buf) - 1) == fsp ) *p = '\0';
>          if ((p = Rf_strrchr(buf, fsp)))
>              p++;
>          else
> 
> Best,
> 
> Jeff



[Rd] Subtle bug in do_basename
Duncan Murdoch