diff options
author | Edward Thomson <ethomson@github.com> | 2017-01-21 23:45:23 +0000 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2017-01-21 23:45:23 +0000 |
commit | 28d0ba0ba5f41f71997a15e81bbda4ed2d1b896a (patch) | |
tree | b03c94a2b3a901f12503c10ff6fc13d130668c32 | |
parent | 452bf57cbe665768810f2597aba50b9afc9509a7 (diff) | |
download | libgit2-28d0ba0ba5f41f71997a15e81bbda4ed2d1b896a.tar.gz |
symbolic ref target validation: fixups
Fixups requested in #3912.
-rw-r--r-- | include/git2/common.h | 18 | ||||
-rw-r--r-- | src/refs.c | 38 | ||||
-rw-r--r-- | src/refs.h | 2 | ||||
-rw-r--r-- | src/settings.c | 2 |
4 files changed, 19 insertions, 41 deletions
diff --git a/include/git2/common.h b/include/git2/common.h index 02d263048..3304f46d2 100644 --- a/include/git2/common.h +++ b/include/git2/common.h @@ -157,7 +157,7 @@ typedef enum { GIT_OPT_SET_SSL_CERT_LOCATIONS, GIT_OPT_SET_USER_AGENT, GIT_OPT_ENABLE_STRICT_OBJECT_CREATION, - GIT_OPT_ENABLE_SYMBOLIC_REF_TARGET_VALIDATION, + GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, GIT_OPT_SET_SSL_CIPHERS, GIT_OPT_GET_USER_AGENT, } git_libgit2_opt_t; @@ -272,16 +272,14 @@ typedef enum { * > will be validated when creating a new commit. This defaults * > to disabled. * - * * opts(GIT_OPT_ENABLE_SYMBOLIC_REF_TARGET_VALIDATION, int enabled) + * * opts(GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION, int enabled) * - * > Validate the target of a symbolic ref when creating it. - * > For example, 'foobar' is not a valid ref, - * > therefore 'foobar' is not a valid target - * > for a symbolic ref by default, - * > where as 'refs/heads/foobar' is. - * > Disabling this bypasses validation so that an arbitrary - * > strings such as 'foobar' can be used for a symbolic ref target. - * > This defaults to enabled. + * > Validate the target of a symbolic ref when creating it. For + * > example, `foobar` is not a valid ref, therefore `foobar` is + * > not a valid target for a symbolic ref by default, whereas + * > `refs/heads/foobar` is. Disabling this bypasses validation + * > so that an arbitrary strings such as `foobar` can be used + * > for a symbolic ref target. This defaults to enabled. * * * opts(GIT_OPT_SET_SSL_CIPHERS, const char *ciphers) * diff --git a/src/refs.c b/src/refs.c index c77653da8..da6add0b4 100644 --- a/src/refs.c +++ b/src/refs.c @@ -177,7 +177,7 @@ int git_reference_name_to_id( return 0; } -static int reference__normalize_for_repo( +static int reference_normalize_for_repo( git_refname_t out, git_repository *repo, const char *name, @@ -190,29 +190,12 @@ static int reference__normalize_for_repo( precompose) flags |= GIT_REF_FORMAT__PRECOMPOSE_UNICODE; - if (!validate) { - flags |= GIT_REF_VALIDATION_DISABLE; - } + if (!validate) + flags |= GIT_REF_FORMAT__VALIDATION_DISABLE; return git_reference_normalize_name(out, GIT_REFNAME_MAX, name, flags); } -static int reference_normalize_for_repo( - git_refname_t out, - git_repository *repo, - const char *name) -{ - return reference__normalize_for_repo(out, repo, name, true); -} - -static int reference_normalize_for_repo_without_validation( - git_refname_t out, - git_repository *repo, - const char *name) -{ - return reference__normalize_for_repo(out, repo, name, false); -} - int git_reference_lookup_resolved( git_reference **ref_out, git_repository *repo, @@ -236,7 +219,7 @@ int git_reference_lookup_resolved( scan_type = GIT_REF_SYMBOLIC; - if ((error = reference_normalize_for_repo(scan_name, repo, name)) < 0) + if ((error = reference_normalize_for_repo(scan_name, repo, name, true)) < 0) return error; if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0) @@ -406,7 +389,7 @@ static int reference__create( if (ref_out) *ref_out = NULL; - error = reference_normalize_for_repo(normalized, repo, name); + error = reference_normalize_for_repo(normalized, repo, name, true); if (error < 0) return error; @@ -427,11 +410,8 @@ static int reference__create( } else { git_refname_t normalized_target; - if (git_reference__enable_symbolic_ref_target_validation) { - error = reference_normalize_for_repo(normalized_target, repo, symbolic); - } else { - error = reference_normalize_for_repo_without_validation(normalized_target, repo, symbolic); - } + error = reference_normalize_for_repo(normalized_target, repo, + symbolic, git_reference__enable_symbolic_ref_target_validation); if (error < 0) return error; @@ -612,7 +592,7 @@ static int reference__rename(git_reference **out, git_reference *ref, const char assert(ref && new_name && signature); if ((error = reference_normalize_for_repo( - normalized, git_reference_owner(ref), new_name)) < 0) + normalized, git_reference_owner(ref), new_name, true)) < 0) return error; @@ -905,7 +885,7 @@ int git_reference__normalize_name( int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC; unsigned int process_flags; bool normalize = (buf != NULL); - bool validate = (flags & GIT_REF_VALIDATION_DISABLE) == 0; + bool validate = (flags & GIT_REF_FORMAT__VALIDATION_DISABLE) == 0; #ifdef GIT_USE_ICONV git_path_iconv_t ic = GIT_PATH_ICONV_INIT; diff --git a/src/refs.h b/src/refs.h index c4786ddb4..80e655af7 100644 --- a/src/refs.h +++ b/src/refs.h @@ -55,7 +55,7 @@ extern bool git_reference__enable_symbolic_ref_target_validation; #define GIT_REFS_STASH_FILE GIT_REFS_DIR GIT_STASH_FILE #define GIT_REF_FORMAT__PRECOMPOSE_UNICODE (1u << 16) -#define GIT_REF_VALIDATION_DISABLE (1u << 15) +#define GIT_REF_FORMAT__VALIDATION_DISABLE (1u << 15) #define GIT_REFNAME_MAX 1024 diff --git a/src/settings.c b/src/settings.c index 1fcdce2ed..bf0477b06 100644 --- a/src/settings.c +++ b/src/settings.c @@ -192,7 +192,7 @@ int git_libgit2_opts(int key, ...) git_object__strict_input_validation = (va_arg(ap, int) != 0); break; - case GIT_OPT_ENABLE_SYMBOLIC_REF_TARGET_VALIDATION: + case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0); break; |