subversion-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stefan Sperling <s...@elego.de>
Subject Re: svn 1.8.1: segmentation fault on merge
Date Tue, 03 Sep 2013 16:39:04 GMT
On Tue, Sep 03, 2013 at 06:06:46PM +0200, Matthias Vorwerk wrote:
> 
> I encountered the same problem with subversion-1.8.3
> (CentOS5, httpd-2.4.6):
> svn merge ends with sengmentation fault.
> 
> I re-compiled svn with the  --enable-maintainer-mode configure option.
> 
> Here is what I get:
> ---------------------------------
> % libtool --mode=execute  gdb --args /opt/local/bin/bin/svn merge
> --non-interactive --dry-run http://reposrv/p1/branches/branch1/work .
> /usr/bin/libtool: line 6823: LC_ALL: command not found
> /usr/bin/libtool: line 6823: LC_CTYPE: command not found
> /usr/bin/libtool: line 6823: LC_COLLATE: command not found
> /usr/bin/libtool: line 6823: LC_MESSAGES: command not found
> GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-37.el5)
> Copyright (C) 2009 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-redhat-linux-gnu".
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>...
> Reading symbols from /opt/local/bin/bin/svn...done.
> (gdb) r
> Starting program: /opt/local/bin/bin/svn merge --non-interactive --dry-run
> http://reposrv/p1/branches/branch1/work .
> [Thread debugging using libthread_db enabled]
> 
> Program received signal SIGSEGV, Segmentation fault.
> 0x00002aaaaab0e2db in filter_log_entry_with_rangelist
> (baton=0x7fffffff9530, log_entry=0x9c2510, pool=0x9c2498)
>     at subversion/libsvn_client/mergeinfo.c:1399
> 1399                  svn_merge_range_t *youngest_range = APR_ARRAY_IDX(
> (gdb)

Can you show us what these gdb commands print here, please?

  bt
  p ancestor_is_self
  p nearest_ancestor_mergeinfo
  p rangelist

Thanks!

And then, please try this. It's a shot in the dark. There is an obvious
bug where the code doesn't check for nearest_ancestor_mergeinfo being
NULL even though it could be. I threw in a NULL check for rangelist
for good measure, apparently that's what you're hitting?

Index: subversion/libsvn_client/mergeinfo.c
===================================================================
--- subversion/libsvn_client/mergeinfo.c	(revision 1519009)
+++ subversion/libsvn_client/mergeinfo.c	(working copy)
@@ -1405,17 +1405,21 @@ filter_log_entry_with_rangelist(void *baton,
              obviously back.  If it was added or replaced it's still around
              possibly it was replaced one or more times, but it's back now.
              Regardless, LOG_ENTRY->REVISION is *not* an eligible revision! */
-          if (ancestor_is_self /* Explicit mergeinfo on TARGET_PATH_AFFECTED */
+          if (nearest_ancestor_mergeinfo &&
+              ancestor_is_self /* Explicit mergeinfo on TARGET_PATH_AFFECTED */
               && (change->action != 'M'))
             {
               svn_rangelist_t *rangelist =
                   svn_hash_gets(nearest_ancestor_mergeinfo, path);
-              svn_merge_range_t *youngest_range = APR_ARRAY_IDX(
-                rangelist, rangelist->nelts - 1, svn_merge_range_t *);
+              if (rangelist)
+                {
+                  svn_merge_range_t *youngest_range = APR_ARRAY_IDX(
+                    rangelist, rangelist->nelts - 1, svn_merge_range_t *);
 
-              if (youngest_range
-                  && (youngest_range->end > log_entry->revision))
-                continue;
+                  if (youngest_range
+                      && (youngest_range->end > log_entry->revision))
+                    continue;
+                }
             }
 
           if (nearest_ancestor_mergeinfo)

Mime
View raw message