[Rd] Subtle bug in do_basename
Simon Urbanek
simon.urbanek at r-project.org
Mon Mar 26 16:16:35 CEST 2007
Good catch, there is even one more problem I believe - it can still
run past the beginning of the buffer (e.g. if you use "///").
This is a bit more more efficient due to fewer calls to strlen and
fixes both problems:
if (*buf) {
p = buf + strlen(buf) - 1;
while (p>=buf && *p == fsp) *(p--)='\0';
}
Cheers,
Simon
On Mar 24, 2007, at 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:
>
> $ 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
> --
> http://biostat.mc.vanderbilt.edu/JeffreyHorner
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
More information about the R-devel
mailing list