You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Stefan Küng <to...@gmail.com> on 2012/10/24 20:14:17 UTC

segfault when merging

Hi,

There were quite a few crash reports sent for TSVN which indicate a 
problem when merging. Until now I never really had a good crash dump and 
also no user to contact.

But now that's changed:
User report is here:
http://tortoisesvn.tigris.org/ds/viewMessage.do?dsForumId=4061&dsMessageId=3023140

Crash dump available here:
https://www.crash-server.com/Problem.aspx?ClientID=tsvn&Login=Guest&ProblemID=6224
(you should know the login data already, if not please contact my 
privately).

Here's what I found so far:
libsvn_client\merge.c, calculate_left_hand_side()

/* Convert the absolute path with mergeinfo on it to a path relative
  to the session root. */
SVN_ERR(svn_client__path_relative_to_root(&path_rel_to_root,
                                         ctx->wc_ctx, absolute_path,
                                         target_repos_root, FALSE,
                                         NULL, scratch_pool,
                                         iterpool));
path_rel_to_session = svn_relpath_skip_ancestor(target_repos_rel_path,
                                               path_rel_to_root);
SVN_ERR(svn_client__repos_location_segments(&segments,
                                           target_ra_session,
                                           path_rel_to_session,
                                           target_rev, target_rev,
                                           SVN_INVALID_REVNUM,
                                           ctx, scratch_pool));

here, the 'path_rel_to_session' is set to NULL by the 
svn_relpath_skip_ancestor() call, which then leads to a NULL-pointer 
access later on in svn_client__repos_location_segments and further down 
in svn_ra_get_location_segments():
   SVN_ERR_ASSERT(*path != '/');

where 'path' is the NULL pointer of path_rel_to_session.

svn_relpath_skip_ancestor() returns NULL if the paths are not related or 
if the second argument string does not end with a '/'.
Gathering from the crash dump I can see that the second argument points 
to a file so it does not end with a '/' char.

The two strings passed to svn_relpath_skip_ancestor() are according to 
the crash dump:
somename/branches/dev62
and
shared/trunk/somefile.bas

(somename and somefile used to protect the innocent).


I hope this helps to figure out why the crash happens - I'm not familiar 
with the merge code so someone else needs to look at this.

Stefan

-- 
        ___
   oo  // \\      "De Chelonian Mobile"
  (_,\/ \_/ \     TortoiseSVN
    \ \_/_\_/>    The coolest Interface to (Sub)Version Control
    /_/   \_\     http://tortoisesvn.net

Re: segfault when merging

Posted by Paul Burba <pt...@gmail.com>.
On Wed, Oct 24, 2012 at 7:16 PM, Paul Burba <pt...@gmail.com> wrote:
> On Wed, Oct 24, 2012 at 2:14 PM, Stefan Küng <to...@gmail.com> wrote:
>> Hi,
>>
>> There were quite a few crash reports sent for TSVN which indicate a problem
>> when merging.
>>
>> Until now I never really had a good crash dump and also no
>> user to contact.
>>
>> But now that's changed:
>> User report is here:
>> http://tortoisesvn.tigris.org/ds/viewMessage.do?dsForumId=4061&dsMessageId=3023140
>>
>> Crash dump available here:
>> https://www.crash-server.com/Problem.aspx?ClientID=tsvn&Login=Guest&ProblemID=6224
>> (you should know the login data already, if not please contact my
>> privately).
>>
>> Here's what I found so far:
>> libsvn_client\merge.c, calculate_left_hand_side()
>>
>> /* Convert the absolute path with mergeinfo on it to a path relative
>>  to the session root. */
>> SVN_ERR(svn_client__path_relative_to_root(&path_rel_to_root,
>>                                         ctx->wc_ctx, absolute_path,
>>                                         target_repos_root, FALSE,
>>                                         NULL, scratch_pool,
>>                                         iterpool));
>> path_rel_to_session = svn_relpath_skip_ancestor(target_repos_rel_path,
>>                                               path_rel_to_root);
>> SVN_ERR(svn_client__repos_location_segments(&segments,
>>                                           target_ra_session,
>>                                           path_rel_to_session,
>>                                           target_rev, target_rev,
>>                                           SVN_INVALID_REVNUM,
>>                                           ctx, scratch_pool));
>>
>> here, the 'path_rel_to_session' is set to NULL by the
>> svn_relpath_skip_ancestor() call, which then leads to a NULL-pointer access
>> later on in svn_client__repos_location_segments and further down in
>> svn_ra_get_location_segments():
>>   SVN_ERR_ASSERT(*path != '/');
>>
>> where 'path' is the NULL pointer of path_rel_to_session.
>>
>> svn_relpath_skip_ancestor() returns NULL if the paths are not related or if
>> the second argument string does not end with a '/'.
>
> FWIW the second arg does not need to end with a '/' for a non-NULL return value.
>
>> Gathering from the crash dump I can see that the second argument points to a
>> file so it does not end with a '/' char.
>>
>> The two strings passed to svn_relpath_skip_ancestor() are according to the
>> crash dump:
>> somename/branches/dev62
>> and
>> shared/trunk/somefile.bas
>>
>> (somename and somefile used to protect the innocent).
>>
>> I hope this helps to figure out why the crash happens - I'm not familiar
>> with the merge code so someone else needs to look at this.
>
> I think I found the problem.  The user mentioned he has "several
> Externals as files, no folders, which may be worth mentioning as a
> potential source of problem."  I can produce a segfault during a merge
> if the file externals in the reintegrate target have svn:mergeinfo set
> on them.  We should ignore these file externals as far as merge
> tracking is concerned, but we aren't.  Fixed on trunk in r1401915.

I also nominated r1401915 for backport to 1.7.x.

-- 
Paul T. Burba
CollabNet, Inc. -- www.collab.net -- Enterprise Cloud Development
Skype: ptburba

Re: segfault when merging

Posted by Paul Burba <pt...@gmail.com>.
On Wed, Oct 24, 2012 at 2:14 PM, Stefan Küng <to...@gmail.com> wrote:
> Hi,
>
> There were quite a few crash reports sent for TSVN which indicate a problem
> when merging.
>
> Until now I never really had a good crash dump and also no
> user to contact.
>
> But now that's changed:
> User report is here:
> http://tortoisesvn.tigris.org/ds/viewMessage.do?dsForumId=4061&dsMessageId=3023140
>
> Crash dump available here:
> https://www.crash-server.com/Problem.aspx?ClientID=tsvn&Login=Guest&ProblemID=6224
> (you should know the login data already, if not please contact my
> privately).
>
> Here's what I found so far:
> libsvn_client\merge.c, calculate_left_hand_side()
>
> /* Convert the absolute path with mergeinfo on it to a path relative
>  to the session root. */
> SVN_ERR(svn_client__path_relative_to_root(&path_rel_to_root,
>                                         ctx->wc_ctx, absolute_path,
>                                         target_repos_root, FALSE,
>                                         NULL, scratch_pool,
>                                         iterpool));
> path_rel_to_session = svn_relpath_skip_ancestor(target_repos_rel_path,
>                                               path_rel_to_root);
> SVN_ERR(svn_client__repos_location_segments(&segments,
>                                           target_ra_session,
>                                           path_rel_to_session,
>                                           target_rev, target_rev,
>                                           SVN_INVALID_REVNUM,
>                                           ctx, scratch_pool));
>
> here, the 'path_rel_to_session' is set to NULL by the
> svn_relpath_skip_ancestor() call, which then leads to a NULL-pointer access
> later on in svn_client__repos_location_segments and further down in
> svn_ra_get_location_segments():
>   SVN_ERR_ASSERT(*path != '/');
>
> where 'path' is the NULL pointer of path_rel_to_session.
>
> svn_relpath_skip_ancestor() returns NULL if the paths are not related or if
> the second argument string does not end with a '/'.

FWIW the second arg does not need to end with a '/' for a non-NULL return value.

> Gathering from the crash dump I can see that the second argument points to a
> file so it does not end with a '/' char.
>
> The two strings passed to svn_relpath_skip_ancestor() are according to the
> crash dump:
> somename/branches/dev62
> and
> shared/trunk/somefile.bas
>
> (somename and somefile used to protect the innocent).
>
> I hope this helps to figure out why the crash happens - I'm not familiar
> with the merge code so someone else needs to look at this.

I think I found the problem.  The user mentioned he has "several
Externals as files, no folders, which may be worth mentioning as a
potential source of problem."  I can produce a segfault during a merge
if the file externals in the reintegrate target have svn:mergeinfo set
on them.  We should ignore these file externals as far as merge
tracking is concerned, but we aren't.  Fixed on trunk in r1401915.

-- 
Paul T. Burba
CollabNet, Inc. -- www.collab.net -- Enterprise Cloud Development
Skype: ptburba

> Stefan
>
> --
>        ___
>   oo  // \\      "De Chelonian Mobile"
>  (_,\/ \_/ \     TortoiseSVN
>    \ \_/_\_/>    The coolest Interface to (Sub)Version Control
>    /_/   \_\     http://tortoisesvn.net