From 8cad4744ee37ebec1d9491a1381ec1771a1ba795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Mon, 12 Dec 2011 18:20:32 +0700 Subject: [PATCH] Rename resolve_ref() to resolve_ref_unsafe() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolve_ref() may return a pointer to a shared buffer and can be overwritten by the next resolve_ref() calls. Callers need to pay attention, not to keep the pointer when the next call happens. Rename with "_unsafe" suffix to warn developers (or reviewers) before introducing new call sites. This patch is generated using the following command git grep -l 'resolve_ref(' -- '*.[ch]'|xargs sed -i 's/resolve_ref(/resolve_ref_unsafe(/g' Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- branch.c | 2 +- builtin/branch.c | 2 +- builtin/commit.c | 2 +- builtin/fsck.c | 2 +- builtin/log.c | 4 ++-- builtin/receive-pack.c | 2 +- builtin/remote.c | 2 +- builtin/show-branch.c | 2 +- builtin/symbolic-ref.c | 2 +- cache.h | 2 +- refs.c | 22 +++++++++++----------- remote.c | 6 +++--- transport.c | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/branch.c b/branch.c index d91a099fdd..772a4c251d 100644 --- a/branch.c +++ b/branch.c @@ -182,7 +182,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref, const char *head; unsigned char sha1[20]; - head = resolve_ref("HEAD", sha1, 0, NULL); + head = resolve_ref_unsafe("HEAD", sha1, 0, NULL); if (!is_bare_repository() && head && !strcmp(head, ref->buf)) die("Cannot force update the current branch."); } diff --git a/builtin/branch.c b/builtin/branch.c index c459f0bab0..642b5bd317 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -252,7 +252,7 @@ static char *resolve_symref(const char *src, const char *prefix) int flag; const char *dst, *cp; - dst = resolve_ref(src, sha1, 0, &flag); + dst = resolve_ref_unsafe(src, sha1, 0, &flag); if (!(dst && (flag & REF_ISSYMREF))) return NULL; if (prefix && (cp = skip_prefix(dst, prefix))) diff --git a/builtin/commit.c b/builtin/commit.c index e36e9adf87..4d39d25109 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -1304,7 +1304,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1, rev.diffopt.break_opt = 0; diff_setup_done(&rev.diffopt); - head = resolve_ref("HEAD", junk_sha1, 0, NULL); + head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL); printf("[%s%s ", !prefixcmp(head, "refs/heads/") ? head + 11 : diff --git a/builtin/fsck.c b/builtin/fsck.c index 30d0dc82f0..8c479a791b 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -563,7 +563,7 @@ static int fsck_head_link(void) if (verbose) fprintf(stderr, "Checking HEAD link\n"); - head_points_at = resolve_ref("HEAD", head_sha1, 0, &flag); + head_points_at = resolve_ref_unsafe("HEAD", head_sha1, 0, &flag); if (!head_points_at) return error("Invalid HEAD"); if (!strcmp(head_points_at, "HEAD")) diff --git a/builtin/log.c b/builtin/log.c index 4395f3e471..89d0cc0132 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1040,7 +1040,7 @@ static char *find_branch_name(struct rev_info *rev) if (positive < 0) return NULL; strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name); - branch = resolve_ref(buf.buf, branch_sha1, 1, NULL); + branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL); if (!branch || prefixcmp(branch, "refs/heads/") || hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1)) @@ -1268,7 +1268,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) rev.pending.objects[0].item->flags |= UNINTERESTING; add_head_to_pending(&rev); - ref = resolve_ref("HEAD", sha1, 1, NULL); + ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL); if (ref && !prefixcmp(ref, "refs/heads/")) branch_name = xstrdup(ref + strlen("refs/heads/")); else diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 62afac3ec1..d2dcb7e4af 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -572,7 +572,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list) int flag; strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name); - dst_name = resolve_ref(buf.buf, sha1, 0, &flag); + dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag); strbuf_release(&buf); if (!(flag & REF_ISSYMREF)) diff --git a/builtin/remote.c b/builtin/remote.c index 407abfb0f7..583eec90e0 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -573,7 +573,7 @@ static int read_remote_branches(const char *refname, strbuf_addf(&buf, "refs/remotes/%s/", rename->old); if (!prefixcmp(refname, buf.buf)) { item = string_list_append(rename->remote_branches, xstrdup(refname)); - symref = resolve_ref(refname, orig_sha1, 1, &flag); + symref = resolve_ref_unsafe(refname, orig_sha1, 1, &flag); if (flag & REF_ISSYMREF) item->util = xstrdup(symref); else diff --git a/builtin/show-branch.c b/builtin/show-branch.c index a1f148e48c..a59e088cf5 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -789,7 +789,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix) } } - head_p = resolve_ref("HEAD", head_sha1, 1, NULL); + head_p = resolve_ref_unsafe("HEAD", head_sha1, 1, NULL); if (head_p) { head_len = strlen(head_p); memcpy(head, head_p, head_len + 1); diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index dea849c3c5..2ef5962386 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -12,7 +12,7 @@ static void check_symref(const char *HEAD, int quiet) { unsigned char sha1[20]; int flag; - const char *refs_heads_master = resolve_ref(HEAD, sha1, 0, &flag); + const char *refs_heads_master = resolve_ref_unsafe(HEAD, sha1, 0, &flag); if (!refs_heads_master) die("No such ref: %s", HEAD); diff --git a/cache.h b/cache.h index 4887a3e331..e6436e08e9 100644 --- a/cache.h +++ b/cache.h @@ -865,7 +865,7 @@ extern int read_ref(const char *filename, unsigned char *sha1); * * errno is sometimes set on errors, but not always. */ -extern const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag); +extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag); extern char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag); extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref); diff --git a/refs.c b/refs.c index 8ffb32fe58..4bf45b1979 100644 --- a/refs.c +++ b/refs.c @@ -361,7 +361,7 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha if (!(flags & REF_ISSYMREF)) return 0; - resolves_to = resolve_ref(refname, junk, 0, NULL); + resolves_to = resolve_ref_unsafe(refname, junk, 0, NULL); if (!resolves_to || strcmp(resolves_to, d->refname)) return 0; @@ -497,7 +497,7 @@ static int get_packed_ref(const char *ref, unsigned char *sha1) return -1; } -const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag) +const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag) { int depth = MAXDEPTH; ssize_t len; @@ -607,7 +607,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag) { - const char *ret = resolve_ref(ref, sha1, reading, flag); + const char *ret = resolve_ref_unsafe(ref, sha1, reading, flag); return ret ? xstrdup(ret) : NULL; } @@ -620,7 +620,7 @@ struct ref_filter { int read_ref_full(const char *ref, unsigned char *sha1, int reading, int *flags) { - if (resolve_ref(ref, sha1, reading, flags)) + if (resolve_ref_unsafe(ref, sha1, reading, flags)) return 0; return -1; } @@ -1117,7 +1117,7 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref) this_result = refs_found ? sha1_from_ref : sha1; mksnpath(fullref, sizeof(fullref), *p, len, str); - r = resolve_ref(fullref, this_result, 1, &flag); + r = resolve_ref_unsafe(fullref, this_result, 1, &flag); if (r) { if (!refs_found++) *ref = xstrdup(r); @@ -1147,7 +1147,7 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log) const char *ref, *it; mksnpath(path, sizeof(path), *p, len, str); - ref = resolve_ref(path, hash, 1, NULL); + ref = resolve_ref_unsafe(path, hash, 1, NULL); if (!ref) continue; if (!stat(git_path("logs/%s", path), &st) && @@ -1183,7 +1183,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char lock = xcalloc(1, sizeof(struct ref_lock)); lock->lock_fd = -1; - ref = resolve_ref(ref, lock->old_sha1, mustexist, &type); + ref = resolve_ref_unsafe(ref, lock->old_sha1, mustexist, &type); if (!ref && errno == EISDIR) { /* we are trying to lock foo but we used to * have foo/bar which now does not exist; @@ -1196,7 +1196,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char error("there are still refs under '%s'", orig_ref); goto error_return; } - ref = resolve_ref(orig_ref, lock->old_sha1, mustexist, &type); + ref = resolve_ref_unsafe(orig_ref, lock->old_sha1, mustexist, &type); } if (type_p) *type_p = type; @@ -1359,7 +1359,7 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg) if (log && S_ISLNK(loginfo.st_mode)) return error("reflog for %s is a symlink", oldref); - symref = resolve_ref(oldref, orig_sha1, 1, &flag); + symref = resolve_ref_unsafe(oldref, orig_sha1, 1, &flag); if (flag & REF_ISSYMREF) return error("refname %s is a symbolic ref, renaming it is not supported", oldref); @@ -1648,7 +1648,7 @@ int write_ref_sha1(struct ref_lock *lock, unsigned char head_sha1[20]; int head_flag; const char *head_ref; - head_ref = resolve_ref("HEAD", head_sha1, 1, &head_flag); + head_ref = resolve_ref_unsafe("HEAD", head_sha1, 1, &head_flag); if (head_ref && (head_flag & REF_ISSYMREF) && !strcmp(head_ref, lock->ref_name)) log_ref_write("HEAD", lock->old_sha1, sha1, logmsg); @@ -1985,7 +1985,7 @@ int update_ref(const char *action, const char *refname, int ref_exists(const char *refname) { unsigned char sha1[20]; - return !!resolve_ref(refname, sha1, 1, NULL); + return !!resolve_ref_unsafe(refname, sha1, 1, NULL); } struct ref *find_ref_by_name(const struct ref *list, const char *name) diff --git a/remote.c b/remote.c index 6655bb05b2..73a3809300 100644 --- a/remote.c +++ b/remote.c @@ -482,7 +482,7 @@ static void read_config(void) return; default_remote_name = xstrdup("origin"); current_branch = NULL; - head_ref = resolve_ref("HEAD", sha1, 0, &flag); + head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && !prefixcmp(head_ref, "refs/heads/")) { current_branch = @@ -1007,7 +1007,7 @@ static char *guess_ref(const char *name, struct ref *peer) struct strbuf buf = STRBUF_INIT; unsigned char sha1[20]; - const char *r = resolve_ref(peer->name, sha1, 1, NULL); + const char *r = resolve_ref_unsafe(peer->name, sha1, 1, NULL); if (!r) return NULL; @@ -1058,7 +1058,7 @@ static int match_explicit(struct ref *src, struct ref *dst, unsigned char sha1[20]; int flag; - dst_value = resolve_ref(matched_src->name, sha1, 1, &flag); + dst_value = resolve_ref_unsafe(matched_src->name, sha1, 1, &flag); if (!dst_value || ((flag & REF_ISSYMREF) && prefixcmp(dst_value, "refs/heads/"))) diff --git a/transport.c b/transport.c index 51814b5da3..e9797c0fc7 100644 --- a/transport.c +++ b/transport.c @@ -163,7 +163,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs, /* Follow symbolic refs (mainly for HEAD). */ localname = ref->peer_ref->name; remotename = ref->name; - tmp = resolve_ref(localname, sha, 1, &flag); + tmp = resolve_ref_unsafe(localname, sha, 1, &flag); if (tmp && flag & REF_ISSYMREF && !prefixcmp(tmp, "refs/heads/")) localname = tmp;