On 09.03.2012 20:06, Philip Martin wrote:
Stefan Küng<tortoise...@gmail.com>  writes:

I'm going through some crash reports sent for TSVN and I found a crash
that happens when committing, and the wc has some incomplete entries:

libsvn_wc/node.c, svn_wc__internal_get_origin().

SVN_ERR(svn_wc__db_scan_addition(&status,&op_root_abspath, NULL,
                                 NULL, NULL,&original_repos_relpath,
                                 repos_root_url,
                                 repos_uuid, revision, NULL, NULL,
                                 db, local_abspath,
                                 result_pool, scratch_pool));

if (status == svn_wc__db_status_added)
  {
    if (is_copy)
      *is_copy = FALSE;
    return SVN_NO_ERROR; /* Local addition */
  }

*repos_relpath = svn_relpath_join(
                        original_repos_relpath,
                        svn_dirent_skip_ancestor(op_root_abspath,
                                                 local_abspath),
                        result_pool);


when the status is svn_wc__db_status_incomplete, the
original_repos_relpath can be NULL, and then the svn_relpath_join()
crashes because of a null-pointer access.

scan_addition implies the node must be added, and for that to be
incomplete it must be the result of an interrupted wc-to-wc copy.

$ svn st wc
A  +    wc/X
!       wc/X/B/C
!       wc/X/B/f

In that state a simple commit doesn't trigger a bug, but then it doesn't
call svn_wc__internal_get_origin either.  I see commit_util.c has calls
to svn_wc__node_get_orig, which calls svn_wc__internal_get_origin, so I
suppose that must be how it gets called, but I don't know what sort of
commit to run to see the bug.  How does TortoiseSVN commit such a tree?

I don't know how the user started the commit. There's not enough information available from the crash dump. But here's the stack trace, maybe this will help?

> libsvn_tsvn.dll!svn_relpath_join(const char * base=0x000000000641edc0, const char * component=0x000000000641eca0, apr_pool_t * pool=0x000000000641ec48) Line 1158 + 0xf bytes C libsvn_tsvn.dll!svn_wc__internal_get_origin(int * is_copy=0x0000000005571b60, long * revision=0x0000000005571ae8, const char * * repos_relpath=0x0000000000000008, const char * * repos_root_url=0x0000000001dc4301, const char * * repos_uuid=0x0000000000000000, const char * * copy_root_abspath=0x000000000641edd0, svn_wc__db_t * db=0x0000000001dc4490, const char * local_abspath=0x00000000055720d8, int scan_deleted=0, apr_pool_t * result_pool=0x0000000005571ae8, apr_pool_t * scratch_pool=0x0000000005571ae8) Line 1414 + 0x1c bytes C libsvn_tsvn.dll!svn_wc__node_get_origin(int * is_copy=0x0000000005571b60, long * revision=0x0000000005571ae8, const char * * repos_relpath=0x0000000000000a28, const char * * repos_root_url=0x0000000005571b60, const char * * repos_uuid=0x0000000000000000, const char * * copy_root_abspath=0x000000000641edd0, svn_wc_context_t * wc_ctx=0x0000000001dc4478, const char * local_abspath=0x00000000055720d8, int scan_deleted=0, apr_pool_t * result_pool=0x0000000005571ae8, apr_pool_t * scratch_pool=0x0000000005571ae8) Line 1453 C libsvn_tsvn.dll!harvest_committables(svn_wc_context_t * wc_ctx=0x0000000001dc4478, const char * local_abspath=0x0000000005571b60, svn_client__committables_t * committables=0x00000000055800b8, apr_hash_t * lock_tokens=0x0000000005580258, const char * repos_root_url=0x0000000001db7370, const char * commit_relpath=0x0000000000000000, int copy_mode_root=0, svn_depth_t depth=svn_depth_infinity, int just_locked=1, apr_hash_t * changelists=0x0000000000000000, int skip_files=0, int skip_dirs=0, apr_hash_t * danglers=0x0000000001de24b0, svn_error_t * (void *, svn_node_kind_t *, const char *, long, apr_pool_t *)* check_url_func=0x000007fef1d36e60, void * check_url_baton=0x000000000641f0d0, svn_error_t * (void *)* cancel_func=0x000000013f1b1f74, void * cancel_baton=0x000000000026e4a0, void (void *, const svn_wc_notify_t *, apr_pool_t *)* notify_func=0x000000013f1b1c18, void * notify_baton=0x000000000026e4a0, apr_pool_t * result_pool=0x0000000001dd63d8, apr_pool_t * scratch_pool=0x0000000005571ae8) Line 825 + 0x41 bytes C

libsvn_tsvn.dll!svn_client__harvest_committables(svn_client__committables_t * * committables=0x0000000001dd63d8, apr_hash_t * * lock_tokens=0x000000000641f068, const char * base_dir_abspath=0x0000000001dd6478, const apr_array_header_t * targets=0x0000000005580000, svn_depth_t depth=svn_depth_infinity, int just_locked=1, const apr_array_header_t * changelists=0x0000000001dd6450, svn_error_t * (void *, svn_node_kind_t *, const char *, long, apr_pool_t *)* check_url_func=0x000007fef1d36e60, void * check_url_baton=0x000000000641f0d0, svn_client_ctx_t * ctx=0x0000000000000002, apr_pool_t * result_pool=0x0000000001dd63d8, apr_pool_t * scratch_pool=0x0000000001de2438) Line 1146 + 0xcd bytes C libsvn_tsvn.dll!svn_client_commit5(const apr_array_header_t * targets=0x0000000001dd6450, svn_depth_t depth=svn_depth_infinity, int keep_locks=0, int keep_changelists=0, int commit_as_operations=1, const apr_array_header_t * changelists=0x0000000001dd6450, const apr_hash_t * revprop_table=0x0000000000000000, svn_error_t * (const svn_commit_info_t *, void *, apr_pool_t *)* commit_callback=0x000000013f1b4f88, void * commit_baton=0x000000000026e4a0, svn_client_ctx_t * ctx=0x0000000001dc43c0, apr_pool_t * pool=0x0000000001dd63d8) Line 1310 C



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

Reply via email to