On Fri, May 24, 2013 at 3:25 PM, Branko Čibej <br...@wandisco.com> wrote:

> On 24.05.2013 15:10, Stefan Sperling wrote:
> > On Thu, May 23, 2013 at 08:55:32PM -0000, stef...@apache.org wrote:
> >> Author: stefan2
> >> Date: Thu May 23 20:55:32 2013
> >> New Revision: 1485848
> >>
> >> URL: http://svn.apache.org/r1485848
> >> Log:
> >> Double the speed translate_chunk in case that keyword substitution has
> >> not been enabled.
> > I believe this revision is causing crashes in my client built
> > from trunk. The trunk client is also corrupting working copies I use.
> >
> > I'll investigate a bit further, but if my testing shows that this
> > change is reponsible I am going to revert it ASAP to prevent the
> > damage from spreading.
> >
> > 'svn diff' coredumps with:
> >
> > (gdb)
> > #0  0x000011bd8dc946bd in svn_eol__find_eol_start (buf=0x11bd84838ffa "",
> >     len=12309) at subversion/libsvn_subr/eol.c:56
> > 56          apr_uintptr_t chunk = *(const apr_uintptr_t *)buf;
> > (gdb)
> > Bottom (i.e., innermost) frame selected; you cannot go down.
> > (gdb) p buf
> > $1 = 0x11bd84838ffa ""
> > (gdb) p chunk
> > $2 = 0
> > (gdb) p * buf
> > $3 = 0 '\0'
> >
> > Some working files contain binary garbage after the crash.
> > The working copy needs to be checked out again with a working client.
> >
> >> * subversion/libsvn_subr/subst.c
> >>   (translate_chunk): use a fast scanner if we only care about newlines
> >>
> >> Modified:
> >>     subversion/trunk/subversion/libsvn_subr/subst.c
> >>
> >> Modified: subversion/trunk/subversion/libsvn_subr/subst.c
> >> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/subst.c?rev=1485848&r1=1485847&r2=1485848&view=diff
> >>
> ==============================================================================
> >> --- subversion/trunk/subversion/libsvn_subr/subst.c (original)
> >> +++ subversion/trunk/subversion/libsvn_subr/subst.c Thu May 23 20:55:32
> 2013
> >> @@ -50,6 +50,7 @@
> >>  #include "svn_private_config.h"
> >>
> >>  #include "private/svn_string_private.h"
> >> +#include "private/svn_eol_private.h"
> >>
> >>  /**
> >>   * The textual elements of a detranslated special file.  One of these
> >> @@ -1116,28 +1117,39 @@ translate_chunk(svn_stream_t *dst,
> >>                /* skip current EOL */
> >>                len += b->eol_str_len;
> >>
> >> -              /* Check 4 bytes at once to allow for efficient
> pipelining
> >> -                 and to reduce loop condition overhead. */
> >> -              while ((p + len + 4) <= end)
>
> If the above condition is correct ...
> [...]
>
> >> +              else
> >> +                {
> >> +                  /* use our optimized sub-routine to find the next
> EOL */
> >> +                  const char *eol
> >> +                    = svn_eol__find_eol_start((char *)p + len, end -
> p);
>
> ... then the second parameter here should be (end - p + 1), not (end - p).
>

Nope, end - (p + len). And that was the problem.

>
> >> +                  len += (eol ? eol : end) - (p + len);
>
> And I don't understand this statement at all.
>

If there is no EOL, svn_eol__find_eol_start will return NULL.

-- Stefan^2.

-- 
*Join one of our free daily demo sessions on* *Scaling Subversion for the
Enterprise <http://www.wandisco.com/training/webinars>*
*

*

Reply via email to