[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Segfault when upgrading

From: Julian Foad <julian.foad_at_wandisco.com>
Date: Mon, 08 Aug 2011 18:10:24 +0100

Stefan Küng wrote:
> I've now analyzed the fifth crash report for TSVN that shows a segfault
> when upgrading a working copy. The crash happens here:
>
> libsvn_wc\upgrade.c, line 1111
>
> info = apr_hash_get(*text_bases_info, versioned_file_name,
> APR_HASH_KEY_STRING);
>
> with 'versioned_file_name' being NULL.
> (ok, the crash is in the hash function in the apr lib, but it crashes
> because the key string is NULL).
>
> Problem is I have no idea why that would be NULL, it gets set a few
> lines above by the 'remove_suffix()' function which only returns NULL if
> either the filename is too short or the extension doesn't match - which
> I can't see why this would ever happen.
>
> Anyone got any ideas?
> I've asked those who sent those reports, but they have no idea what's
> different about their working copies. All of them had several working
> copies, and the crash happens only with one or maybe two of them, but
> not all of the working copies they upgrade.

Looks like that could happen if the text-base directory contains a file
that's not a Subversion text-base filename. This might fix it:

[[[
Index: subversion/libsvn_wc/upgrade.c
===================================================================
--- subversion/libsvn_wc/upgrade.c (revision 1154861)
+++ subversion/libsvn_wc/upgrade.c (working copy)
@@ -1102,12 +1102,17 @@ migrate_text_bases(apr_hash_t **text_bas
         else
           {
             versioned_file_name = remove_suffix(text_base_basename,
                                                 SVN_WC__BASE_EXT, result_pool);
             is_revert_base = FALSE;
           }
+ if (! versioned_file_name)
+ {
+ SVN_DBG(("ignoring non-text-base file '%s'\n", text_base_basename));
+ continue;
+ }
 
         /* Create a new info struct for this versioned file, or fill in the
          * existing one if this is the second text-base we've found for it. */
         info = apr_hash_get(*text_bases_info, versioned_file_name,
                             APR_HASH_KEY_STRING);
         if (info == NULL)
]]]

- Julian
Received on 2011-08-08 19:10:59 CEST

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.