[Rd] Subtle bug in do_basename
Jeffrey Horner
jeff.horner at vanderbilt.edu
Sat Mar 24 23:02:29 CET 2007
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
More information about the R-devel
mailing list