Author: philip
Date: Fri Feb 6 16:43:12 2015
New Revision: 1657893
URL: http://svn.apache.org/r1657893
Log:
Fix SEGV in libsvn_repos due to legacy lock API when executing
pre-commit hook.
* subversion/subversion/libsvn_repos/hooks.c
(lock_token_content): Add special handling for 'magic' value
((const char *) 1).
* subversion/subversion/tests/libsvn_repos/repos-test.c
(deprecated_access_context_api): New.
(test_funcs): Add new test.
Patch by: sergey.raevskiy{_AT_}visualsvn.com
me
Modified:
subversion/trunk/subversion/libsvn_repos/hooks.c
subversion/trunk/subversion/tests/libsvn_repos/repos-test.c
Modified: subversion/trunk/subversion/libsvn_repos/hooks.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/hooks.c?rev=1657893&r1=1657892&r2=1657893&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/hooks.c (original)
+++ subversion/trunk/subversion/libsvn_repos/hooks.c Fri Feb 6 16:43:12 2015
@@ -522,10 +522,19 @@ lock_token_content(apr_file_t **handle,
const char *token = apr_hash_this_key(hi);
const char *path = apr_hash_this_val(hi);
+ if (path == (const char *) 1)
+ {
+ /* Special handling for svn_fs_access_t * created by using deprecated
+ svn_fs_access_add_lock_token() function. */
+ path = "";
+ }
+ else
+ {
+ path = svn_path_uri_autoescape(path, pool);
+ }
+
svn_stringbuf_appendstr(lock_str,
- svn_stringbuf_createf(pool, "%s|%s\n",
- svn_path_uri_autoescape(path, pool),
- token));
+ svn_stringbuf_createf(pool, "%s|%s\n", path, token));
}
svn_stringbuf_appendcstr(lock_str, "\n");
Modified: subversion/trunk/subversion/tests/libsvn_repos/repos-test.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_repos/repos-test.c?rev=1657893&r1=1657892&r2=1657893&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_repos/repos-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_repos/repos-test.c Fri Feb 6
16:43:12 2015
@@ -3562,6 +3562,56 @@ test_repos_fs_type(const svn_test_opts_t
return SVN_NO_ERROR;
}
+static svn_error_t *
+deprecated_access_context_api(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_repos_t *repos;
+ svn_fs_access_t *access;
+ svn_fs_txn_t *txn;
+ svn_fs_root_t *root;
+ const char *conflict;
+ svn_revnum_t new_rev;
+ const char *hook;
+
+ /* Create test repository. */
+ SVN_ERR(svn_test__create_repos(&repos,
+ "test-repo-deprecated-access-context-api",
+ opts, pool));
+
+ /* Set an empty pre-commit hook. */
+#ifdef WIN32
+ hook = apr_pstrcat(pool, svn_repos_pre_commit_hook(repos, pool), ".bat",
+ SVN_VA_NULL);
+ SVN_ERR(svn_io_file_create(hook,
+ "exit 0" APR_EOL_STR,
+ pool));
+#else
+ hook = svn_repos_pre_commit_hook(repos, pool);
+ SVN_ERR(svn_io_file_create(hook,
+ "#!/bin/sh" APR_EOL_STR "exit 0" APR_EOL_STR,
+ pool));
+ SVN_ERR(svn_io_set_file_executable(hook, TRUE, FALSE, pool));
+#endif
+
+ /* Set some access context using svn_fs_access_add_lock_token(). */
+ SVN_ERR(svn_fs_create_access(&access, "jrandom", pool));
+ SVN_ERR(svn_fs_access_add_lock_token(access, "opaquelocktoken:abc"));
+ SVN_ERR(svn_fs_set_access(svn_repos_fs(repos), access));
+
+ /* Commit a new revision. */
+ SVN_ERR(svn_repos_fs_begin_txn_for_commit2(&txn, repos, 0,
+ apr_hash_make(pool), pool));
+ SVN_ERR(svn_fs_txn_root(&root, txn, pool));
+ SVN_ERR(svn_fs_make_dir(root, "/whatever", pool));
+ SVN_ERR(svn_repos_fs_commit_txn(&conflict, repos, &new_rev, txn, pool));
+
+ SVN_TEST_STRING_ASSERT(conflict, NULL);
+ SVN_TEST_ASSERT(new_rev == 1);
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
static int max_threads = 4;
@@ -3615,6 +3665,8 @@ static struct svn_test_descriptor_t test
"test svn_repos__config_pool_*"),
SVN_TEST_OPTS_PASS(test_repos_fs_type,
"test test_repos_fs_type"),
+ SVN_TEST_OPTS_PASS(deprecated_access_context_api,
+ "test deprecated access context api"),
SVN_TEST_NULL
};