Rename resolve_ref() to resolve_ref_unsafe()

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 <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Dec 12, 2011 at 18:20 UTC 8cad4744ee37ebec1d9491a1381ec1771a1ba795
13 files changed +26 -26
branch.c
+1 -1
@@ -182,7 +182,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
182 const char *head;
183 unsigned char sha1[20];
184
185 - head = resolve_ref("HEAD", sha1, 0, NULL);
185 + head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
186 if (!is_bare_repository() && head && !strcmp(head, ref->buf))
187 die("Cannot force update the current branch.");
188 }
builtin/branch.c
+1 -1
@@ -252,7 +252,7 @@ static char *resolve_symref(const char *src, const char *prefix)
252 int flag;
253 const char *dst, *cp;
254
255 - dst = resolve_ref(src, sha1, 0, &flag);
255 + dst = resolve_ref_unsafe(src, sha1, 0, &flag);
256 if (!(dst && (flag & REF_ISSYMREF)))
257 return NULL;
258 if (prefix && (cp = skip_prefix(dst, prefix)))
builtin/commit.c
+1 -1
@@ -1304,7 +1304,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
1304 rev.diffopt.break_opt = 0;
1305 diff_setup_done(&rev.diffopt);
1306
1307 - head = resolve_ref("HEAD", junk_sha1, 0, NULL);
1307 + head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
1308 printf("[%s%s ",
1309 !prefixcmp(head, "refs/heads/") ?
1310 head + 11 :
builtin/fsck.c
+1 -1
@@ -563,7 +563,7 @@ static int fsck_head_link(void)
563 if (verbose)
564 fprintf(stderr, "Checking HEAD link\n");
565
566 - head_points_at = resolve_ref("HEAD", head_sha1, 0, &flag);
566 + head_points_at = resolve_ref_unsafe("HEAD", head_sha1, 0, &flag);
567 if (!head_points_at)
568 return error("Invalid HEAD");
569 if (!strcmp(head_points_at, "HEAD"))
builtin/log.c
+2 -2
@@ -1040,7 +1040,7 @@ static char *find_branch_name(struct rev_info *rev)
1040 if (positive < 0)
1041 return NULL;
1042 strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name);
1043 - branch = resolve_ref(buf.buf, branch_sha1, 1, NULL);
1043 + branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL);
1044 if (!branch ||
1045 prefixcmp(branch, "refs/heads/") ||
1046 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)
1268
1269 rev.pending.objects[0].item->flags |= UNINTERESTING;
1270 add_head_to_pending(&rev);
1271 - ref = resolve_ref("HEAD", sha1, 1, NULL);
1271 + ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
1272 if (ref && !prefixcmp(ref, "refs/heads/"))
1273 branch_name = xstrdup(ref + strlen("refs/heads/"));
1274 else
builtin/receive-pack.c
+1 -1
@@ -572,7 +572,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
572 int flag;
573
574 strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
575 - dst_name = resolve_ref(buf.buf, sha1, 0, &flag);
575 + dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
576 strbuf_release(&buf);
577
578 if (!(flag & REF_ISSYMREF))
builtin/remote.c
+1 -1
@@ -573,7 +573,7 @@ static int read_remote_branches(const char *refname,
573 strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
574 if (!prefixcmp(refname, buf.buf)) {
575 item = string_list_append(rename->remote_branches, xstrdup(refname));
576 - symref = resolve_ref(refname, orig_sha1, 1, &flag);
576 + symref = resolve_ref_unsafe(refname, orig_sha1, 1, &flag);
577 if (flag & REF_ISSYMREF)
578 item->util = xstrdup(symref);
579 else
builtin/show-branch.c
+1 -1
@@ -789,7 +789,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
789 }
790 }
791
792 - head_p = resolve_ref("HEAD", head_sha1, 1, NULL);
792 + head_p = resolve_ref_unsafe("HEAD", head_sha1, 1, NULL);
793 if (head_p) {
794 head_len = strlen(head_p);
795 memcpy(head, head_p, head_len + 1);
builtin/symbolic-ref.c
+1 -1
@@ -12,7 +12,7 @@ static void check_symref(const char *HEAD, int quiet)
12 {
13 unsigned char sha1[20];
14 int flag;
15 - const char *refs_heads_master = resolve_ref(HEAD, sha1, 0, &flag);
15 + const char *refs_heads_master = resolve_ref_unsafe(HEAD, sha1, 0, &flag);
16
17 if (!refs_heads_master)
18 die("No such ref: %s", HEAD);
cache.h
+1 -1
@@ -865,7 +865,7 @@ extern int read_ref(const char *filename, unsigned char *sha1);
865 *
866 * errno is sometimes set on errors, but not always.
867 */
868 -extern const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag);
868 +extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag);
869 extern char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag);
870
871 extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
refs.c
+11 -11
@@ -361,7 +361,7 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha
361 if (!(flags & REF_ISSYMREF))
362 return 0;
363
364 - resolves_to = resolve_ref(refname, junk, 0, NULL);
364 + resolves_to = resolve_ref_unsafe(refname, junk, 0, NULL);
365 if (!resolves_to || strcmp(resolves_to, d->refname))
366 return 0;
367
@@ -497,7 +497,7 @@ static int get_packed_ref(const char *ref, unsigned char *sha1)
497 return -1;
498 }
499
500 -const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag)
500 +const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag)
501 {
502 int depth = MAXDEPTH;
503 ssize_t len;
@@ -607,7 +607,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *
607
608 char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag)
609 {
610 - const char *ret = resolve_ref(ref, sha1, reading, flag);
610 + const char *ret = resolve_ref_unsafe(ref, sha1, reading, flag);
611 return ret ? xstrdup(ret) : NULL;
612 }
613
@@ -620,7 +620,7 @@ struct ref_filter {
620
621 int read_ref_full(const char *ref, unsigned char *sha1, int reading, int *flags)
622 {
623 - if (resolve_ref(ref, sha1, reading, flags))
623 + if (resolve_ref_unsafe(ref, sha1, reading, flags))
624 return 0;
625 return -1;
626 }
@@ -1117,7 +1117,7 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref)
1117
1118 this_result = refs_found ? sha1_from_ref : sha1;
1119 mksnpath(fullref, sizeof(fullref), *p, len, str);
1120 - r = resolve_ref(fullref, this_result, 1, &flag);
1120 + r = resolve_ref_unsafe(fullref, this_result, 1, &flag);
1121 if (r) {
1122 if (!refs_found++)
1123 *ref = xstrdup(r);
@@ -1147,7 +1147,7 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log)
1147 const char *ref, *it;
1148
1149 mksnpath(path, sizeof(path), *p, len, str);
1150 - ref = resolve_ref(path, hash, 1, NULL);
1150 + ref = resolve_ref_unsafe(path, hash, 1, NULL);
1151 if (!ref)
1152 continue;
1153 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
1183 lock = xcalloc(1, sizeof(struct ref_lock));
1184 lock->lock_fd = -1;
1185
1186 - ref = resolve_ref(ref, lock->old_sha1, mustexist, &type);
1186 + ref = resolve_ref_unsafe(ref, lock->old_sha1, mustexist, &type);
1187 if (!ref && errno == EISDIR) {
1188 /* we are trying to lock foo but we used to
1189 * 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
1196 error("there are still refs under '%s'", orig_ref);
1197 goto error_return;
1198 }
1199 - ref = resolve_ref(orig_ref, lock->old_sha1, mustexist, &type);
1199 + ref = resolve_ref_unsafe(orig_ref, lock->old_sha1, mustexist, &type);
1200 }
1201 if (type_p)
1202 *type_p = type;
@@ -1359,7 +1359,7 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)
1359 if (log && S_ISLNK(loginfo.st_mode))
1360 return error("reflog for %s is a symlink", oldref);
1361
1362 - symref = resolve_ref(oldref, orig_sha1, 1, &flag);
1362 + symref = resolve_ref_unsafe(oldref, orig_sha1, 1, &flag);
1363 if (flag & REF_ISSYMREF)
1364 return error("refname %s is a symbolic ref, renaming it is not supported",
1365 oldref);
@@ -1648,7 +1648,7 @@ int write_ref_sha1(struct ref_lock *lock,
1648 unsigned char head_sha1[20];
1649 int head_flag;
1650 const char *head_ref;
1651 - head_ref = resolve_ref("HEAD", head_sha1, 1, &head_flag);
1651 + head_ref = resolve_ref_unsafe("HEAD", head_sha1, 1, &head_flag);
1652 if (head_ref && (head_flag & REF_ISSYMREF) &&
1653 !strcmp(head_ref, lock->ref_name))
1654 log_ref_write("HEAD", lock->old_sha1, sha1, logmsg);
@@ -1985,7 +1985,7 @@ int update_ref(const char *action, const char *refname,
1985 int ref_exists(const char *refname)
1986 {
1987 unsigned char sha1[20];
1988 - return !!resolve_ref(refname, sha1, 1, NULL);
1988 + return !!resolve_ref_unsafe(refname, sha1, 1, NULL);
1989 }
1990
1991 struct ref *find_ref_by_name(const struct ref *list, const char *name)
remote.c
+3 -3
@@ -482,7 +482,7 @@ static void read_config(void)
482 return;
483 default_remote_name = xstrdup("origin");
484 current_branch = NULL;
485 - head_ref = resolve_ref("HEAD", sha1, 0, &flag);
485 + head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag);
486 if (head_ref && (flag & REF_ISSYMREF) &&
487 !prefixcmp(head_ref, "refs/heads/")) {
488 current_branch =
@@ -1007,7 +1007,7 @@ static char *guess_ref(const char *name, struct ref *peer)
1007 struct strbuf buf = STRBUF_INIT;
1008 unsigned char sha1[20];
1009
1010 - const char *r = resolve_ref(peer->name, sha1, 1, NULL);
1010 + const char *r = resolve_ref_unsafe(peer->name, sha1, 1, NULL);
1011 if (!r)
1012 return NULL;
1013
@@ -1058,7 +1058,7 @@ static int match_explicit(struct ref *src, struct ref *dst,
1058 unsigned char sha1[20];
1059 int flag;
1060
1061 - dst_value = resolve_ref(matched_src->name, sha1, 1, &flag);
1061 + dst_value = resolve_ref_unsafe(matched_src->name, sha1, 1, &flag);
1062 if (!dst_value ||
1063 ((flag & REF_ISSYMREF) &&
1064 prefixcmp(dst_value, "refs/heads/")))
transport.c
+1 -1
@@ -163,7 +163,7 @@ static void set_upstreams(struct transport *transport, struct ref *refs,
163 /* Follow symbolic refs (mainly for HEAD). */
164 localname = ref->peer_ref->name;
165 remotename = ref->name;
166 - tmp = resolve_ref(localname, sha, 1, &flag);
166 + tmp = resolve_ref_unsafe(localname, sha, 1, &flag);
167 if (tmp && flag & REF_ISSYMREF &&
168 !prefixcmp(tmp, "refs/heads/"))
169 localname = tmp;