"William A. Rowe, Jr." <[EMAIL PROTECTED]> writes: > Folks, this looks wrong after consideration. If someone is familiar > with the Linux gcc optimizer, please see my last comments in > > http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14147 > > I'm starting to feel like the optimizer bit us.
That was the first thing I thought. However, since that loop does not fit on one screen it took a bit more concentration to see what was happening. Those gotos make it a little more interesting :) do { int temp_slash=0; if (condition met) { temp_slash=1; } ... minimerge: ... minimerge2: if (temp_slash) { r->filename[--filename_len] = '\0'; } .... if (matches) { if (last_walk->matched == sec_ent[sec_idx]) { .... goto minimerge; XXXXXXXXX } } } while (thisinfo.filetype == APR_DIR); The line marked XXXXXXXX is one place where we go back to a point before zapping the last char of r->filename without clearing temp_slash. And since filename_len is decremented, we will zap a different char the next time. I didn't check if there are other places where can can go back earlier in the loop without temp_slash being cleared. But since there are two goto destinations that seems possible. It does boggle my mind that we developers apparently never hit this. I tried to duplicate the mod_dav problem multiple times with no luck. "William A. Rowe, Jr." <[EMAIL PROTECTED]> writes: > Folks, this looks wrong after consideration. If someone is familiar > with the Linux gcc optimizer, please see my last comments in > > http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14147 > > I'm starting to feel like the optimizer bit us. > > Bill > > Index: request.c > > =================================================================== > > RCS file: /home/cvs/httpd-2.0/server/request.c,v > > retrieving revision 1.117 > > retrieving revision 1.118 > > diff -u -r1.117 -r1.118 > > --- request.c 25 Oct 2002 16:38:11 -0000 1.117 > > +++ request.c 1 Nov 2002 03:27:20 -0000 1.118 > > @@ -924,6 +924,8 @@ > > /* That temporary trailing slash was useful, now drop it. > > */ > > if (temp_slash) { > > + temp_slash = 0; > > + AP_ASSERT(r->filename[filename_len-1] == '/'); By the way... I would like to trust this code enough to make it AP_DEBUG_ASSERT(), but I guess if you're scared I should be scared too :) > > r->filename[--filename_len] = '\0'; -- Jeff Trawick | [EMAIL PROTECTED] Born in Roswell... married an alien...