Author: stsp Date: Tue Sep 3 15:45:53 2019 New Revision: 1866328 URL: http://svn.apache.org/viewvc?rev=1866328&view=rev Log: Use more of the new _safe variants of canonicalization functions.
This commit converts all relevant function calls in libsvn_repos. * subversion/libsvn_repos/commit.c (add_file_or_directory, delete_entry, open_directory, open_file): Use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). * subversion/libsvn_repos/delta.c (svn_repos_dir_delta2): Use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). * subversion/libsvn_repos/dump.c (make_dir_baton): Convert to return an svn_error_t and use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). (open_root, add_directory, open_directory): Update callers. (dump_node): Use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). * subversion/libsvn_repos/dump_editor.c (make_dir_baton): Convert to return an svn_error_t and use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). (open_root, add_directory, open_directory): Update callers. * subversion/libsvn_repos/load-fs-vtable.c (prefix_mergeinfo_paths, make_node_baton, svn_repos_get_fs_build_parser6): Use svn_relpath_canonicalize_safe() instead of svn_relpath_canonicalize(). Modified: subversion/trunk/subversion/libsvn_repos/commit.c subversion/trunk/subversion/libsvn_repos/delta.c subversion/trunk/subversion/libsvn_repos/dump.c subversion/trunk/subversion/libsvn_repos/dump_editor.c subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c Modified: subversion/trunk/subversion/libsvn_repos/commit.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/commit.c?rev=1866328&r1=1866327&r2=1866328&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/commit.c (original) +++ subversion/trunk/subversion/libsvn_repos/commit.c Tue Sep 3 15:45:53 2019 @@ -306,13 +306,14 @@ add_file_or_directory(const char *path, struct edit_baton *eb = pb->edit_baton; apr_pool_t *subpool = svn_pool_create(pool); svn_boolean_t was_copied = FALSE; - const char *full_path; + const char *full_path, *canonicalized_path; /* Reject paths which contain control characters (related to issue #4340). */ SVN_ERR(svn_path_check_valid(path, pool)); - full_path = svn_fspath__join(eb->base_path, - svn_relpath_canonicalize(path, pool), pool); + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, path, + pool, pool)); + full_path = svn_fspath__join(eb->base_path, canonicalized_path, pool); /* Sanity check. */ if (copy_path && (! SVN_IS_VALID_REVNUM(copy_revision))) @@ -477,10 +478,11 @@ delete_entry(const char *path, struct edit_baton *eb = parent->edit_baton; svn_node_kind_t kind; svn_repos_authz_access_t required = svn_authz_write; - const char *full_path; + const char *full_path, *canonicalized_path; - full_path = svn_fspath__join(eb->base_path, - svn_relpath_canonicalize(path, pool), pool); + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, path, + pool, pool)); + full_path = svn_fspath__join(eb->base_path, canonicalized_path, pool); /* Check PATH in our transaction. */ SVN_ERR(svn_fs_check_path(&kind, eb->txn_root, full_path, pool)); @@ -538,10 +540,11 @@ open_directory(const char *path, struct dir_baton *pb = parent_baton; struct edit_baton *eb = pb->edit_baton; svn_node_kind_t kind; - const char *full_path; + const char *full_path, *canonicalized_path; - full_path = svn_fspath__join(eb->base_path, - svn_relpath_canonicalize(path, pool), pool); + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, path, + pool, pool)); + full_path = svn_fspath__join(eb->base_path, canonicalized_path, pool); /* Check PATH in our transaction. If it does not exist, return a 'Path not present' error. */ @@ -611,10 +614,11 @@ open_file(const char *path, struct edit_baton *eb = pb->edit_baton; svn_revnum_t cr_rev; apr_pool_t *subpool = svn_pool_create(pool); - const char *full_path; + const char *full_path, *canonicalized_path; - full_path = svn_fspath__join(eb->base_path, - svn_relpath_canonicalize(path, pool), pool); + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, path, + pool, pool)); + full_path = svn_fspath__join(eb->base_path, canonicalized_path, pool); /* Check for read authorization. */ SVN_ERR(check_authz(eb, full_path, eb->txn_root, Modified: subversion/trunk/subversion/libsvn_repos/delta.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/delta.c?rev=1866328&r1=1866327&r2=1866328&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/delta.c (original) +++ subversion/trunk/subversion/libsvn_repos/delta.c Tue Sep 3 15:45:53 2019 @@ -215,7 +215,7 @@ svn_repos_dir_delta2(svn_fs_root_t *src_ { void *root_baton = NULL; struct context c; - const char *src_fullpath; + const char *src_fullpath, *canonicalized_path; svn_node_kind_t src_kind, tgt_kind; svn_revnum_t rootrev; svn_fs_node_relation_t relation; @@ -223,14 +223,22 @@ svn_repos_dir_delta2(svn_fs_root_t *src_ /* SRC_PARENT_DIR must be valid. */ if (src_parent_dir) - src_parent_dir = svn_relpath_canonicalize(src_parent_dir, pool); + { + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + src_parent_dir, pool, pool)); + src_parent_dir = canonicalized_path; + } else return svn_error_create(SVN_ERR_FS_NOT_DIRECTORY, 0, "Invalid source parent directory '(null)'"); /* TGT_FULLPATH must be valid. */ if (tgt_fullpath) - tgt_fullpath = svn_relpath_canonicalize(tgt_fullpath, pool); + { + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + tgt_fullpath, pool, pool)); + tgt_fullpath = canonicalized_path; + } else return svn_error_create(SVN_ERR_FS_PATH_SYNTAX, 0, _("Invalid target path")); Modified: subversion/trunk/subversion/libsvn_repos/dump.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump.c?rev=1866328&r1=1866327&r2=1866328&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/dump.c (original) +++ subversion/trunk/subversion/libsvn_repos/dump.c Tue Sep 3 15:45:53 2019 @@ -738,8 +738,9 @@ struct dir_baton or NULL if this is the top-level directory of the edit. Perform all allocations in POOL. */ -static struct dir_baton * -make_dir_baton(const char *path, +static struct svn_error_t * +make_dir_baton(struct dir_baton **dbp, + const char *path, const char *cmp_path, svn_revnum_t cmp_rev, void *edit_baton, @@ -748,10 +749,10 @@ make_dir_baton(const char *path, { struct edit_baton *eb = edit_baton; struct dir_baton *new_db = apr_pcalloc(pool, sizeof(*new_db)); - const char *full_path; + const char *full_path, *canonicalized_path; /* A path relative to nothing? I don't think so. */ - SVN_ERR_ASSERT_NO_RETURN(!path || pb); + SVN_ERR_ASSERT(!path || pb); /* Construct the full path of this node. */ if (pb) @@ -761,7 +762,11 @@ make_dir_baton(const char *path, /* Remove leading slashes from copyfrom paths. */ if (cmp_path) - cmp_path = svn_relpath_canonicalize(cmp_path, pool); + { + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + cmp_path, pool, pool)); + cmp_path = canonicalized_path; + } new_db->edit_baton = eb; new_db->path = full_path; @@ -772,7 +777,8 @@ make_dir_baton(const char *path, new_db->check_name_collision = FALSE; new_db->pool = pool; - return new_db; + *dbp = new_db; + return SVN_NO_ERROR; } static svn_error_t * @@ -1168,7 +1174,12 @@ dump_node(struct edit_baton *eb, /* Remove leading slashes from copyfrom paths. */ if (cmp_path) - cmp_path = svn_relpath_canonicalize(cmp_path, pool); + { + const char *canonicalized_path; + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + cmp_path, pool, pool)); + cmp_path = canonicalized_path; + } /* Validate the comparison path/rev. */ if (ARE_VALID_COPY_ARGS(cmp_path, cmp_rev)) @@ -1538,9 +1549,9 @@ open_root(void *edit_baton, apr_pool_t *pool, void **root_baton) { - *root_baton = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM, - edit_baton, NULL, pool); - return SVN_NO_ERROR; + return svn_error_trace(make_dir_baton((struct dir_baton **)root_baton, + NULL, NULL, SVN_INVALID_REVNUM, + edit_baton, NULL, pool)); } @@ -1572,8 +1583,10 @@ add_directory(const char *path, struct edit_baton *eb = pb->edit_baton; void *was_deleted; svn_boolean_t is_copy = FALSE; - struct dir_baton *new_db - = make_dir_baton(path, copyfrom_path, copyfrom_rev, eb, pb, pool); + struct dir_baton *new_db; + + SVN_ERR(make_dir_baton(&new_db, path, copyfrom_path, copyfrom_rev, eb, + pb, pool)); /* This might be a replacement -- is the path already deleted? */ was_deleted = svn_hash_gets(pb->deleted_entries, path); @@ -1630,7 +1643,7 @@ open_directory(const char *path, cmp_rev = pb->cmp_rev; } - new_db = make_dir_baton(path, cmp_path, cmp_rev, eb, pb, pool); + SVN_ERR(make_dir_baton(&new_db, path, cmp_path, cmp_rev, eb, pb, pool)); *child_baton = new_db; return SVN_NO_ERROR; } Modified: subversion/trunk/subversion/libsvn_repos/dump_editor.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump_editor.c?rev=1866328&r1=1866327&r2=1866328&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/dump_editor.c (original) +++ subversion/trunk/subversion/libsvn_repos/dump_editor.c Tue Sep 3 15:45:53 2019 @@ -178,8 +178,9 @@ struct dump_edit_baton { * this is the top-level directory of the edit. * * Perform all allocations in POOL. */ -static struct dir_baton * -make_dir_baton(const char *path, +static struct svn_error_t * +make_dir_baton(struct dir_baton **dbp, + const char *path, const char *copyfrom_path, svn_revnum_t copyfrom_rev, void *edit_baton, @@ -192,7 +193,8 @@ make_dir_baton(const char *path, /* Construct the full path of this node. */ if (pb) - repos_relpath = svn_relpath_canonicalize(path, pool); + SVN_ERR(svn_relpath_canonicalize_safe(&repos_relpath, NULL, path, + pool, pool)); else repos_relpath = ""; @@ -213,7 +215,8 @@ make_dir_baton(const char *path, new_db->deleted_props = apr_hash_make(pool); new_db->deleted_entries = apr_hash_make(pool); - return new_db; + *dbp = new_db; + return SVN_NO_ERROR; } /* Make a file baton to represent the directory at PATH (relative to @@ -577,8 +580,8 @@ open_root(void *edit_baton, { /* ... but for the source directory itself, we'll defer to letting the typical plumbing handle this task. */ - new_db = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM, - edit_baton, NULL, pool); + SVN_ERR(make_dir_baton(&new_db, NULL, NULL, SVN_INVALID_REVNUM, + edit_baton, NULL, pool)); SVN_ERR(dump_node(&new_db->headers, eb, new_db->repos_relpath, new_db, NULL, svn_node_action_add, FALSE, @@ -594,8 +597,8 @@ open_root(void *edit_baton, if (! new_db) { - new_db = make_dir_baton(NULL, NULL, SVN_INVALID_REVNUM, - edit_baton, NULL, pool); + SVN_ERR(make_dir_baton(&new_db, NULL, NULL, SVN_INVALID_REVNUM, + edit_baton, NULL, pool)); } *root_baton = new_db; @@ -636,8 +639,8 @@ add_directory(const char *path, SVN_ERR(dump_pending_dir(pb->eb, pool)); - new_db = make_dir_baton(path, copyfrom_path, copyfrom_rev, pb->eb, - pb, pb->pool); + SVN_ERR(make_dir_baton(&new_db, path, copyfrom_path, copyfrom_rev, pb->eb, + pb, pb->pool)); /* This might be a replacement -- is the path already deleted? */ was_deleted = svn_hash_gets(pb->deleted_entries, path); @@ -690,8 +693,8 @@ open_directory(const char *path, copyfrom_rev = pb->copyfrom_rev; } - new_db = make_dir_baton(path, copyfrom_path, copyfrom_rev, pb->eb, pb, - pb->pool); + SVN_ERR(make_dir_baton(&new_db, path, copyfrom_path, copyfrom_rev, + pb->eb, pb, pb->pool)); *child_baton = new_db; return SVN_NO_ERROR; Modified: subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c?rev=1866328&r1=1866327&r2=1866328&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c (original) +++ subversion/trunk/subversion/libsvn_repos/load-fs-vtable.c Tue Sep 3 15:45:53 2019 @@ -213,9 +213,11 @@ prefix_mergeinfo_paths(svn_string_t **me { const char *merge_source = apr_hash_this_key(hi); svn_rangelist_t *rangelist = apr_hash_this_val(hi); - const char *path; + const char *path, *canonicalized_path; - merge_source = svn_relpath_canonicalize(merge_source, pool); + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + merge_source, pool, pool)); + merge_source = canonicalized_path; /* The svn:mergeinfo property syntax demands a repos abspath */ path = svn_fspath__canonicalize(svn_relpath_join(parent_dir, @@ -377,7 +379,10 @@ make_node_baton(struct node_baton **node /* Then add info from the headers. */ if ((val = svn_hash_gets(headers, SVN_REPOS_DUMPFILE_NODE_PATH))) { - val = svn_relpath_canonicalize(val, pool); + const char *canonicalized_path; + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + val, pool, pool)); + val = canonicalized_path; if (rb->pb->parent_dir) nb->path = svn_relpath_join(rb->pb->parent_dir, val, pool); else @@ -1202,7 +1207,12 @@ svn_repos_get_fs_build_parser6(const svn struct parse_baton *pb = apr_pcalloc(pool, sizeof(*pb)); if (parent_dir) - parent_dir = svn_relpath_canonicalize(parent_dir, pool); + { + const char *canonicalized_path; + SVN_ERR(svn_relpath_canonicalize_safe(&canonicalized_path, NULL, + parent_dir, pool, pool)); + parent_dir = canonicalized_path; + } SVN_ERR_ASSERT((SVN_IS_VALID_REVNUM(start_rev) && SVN_IS_VALID_REVNUM(end_rev))