From: Michael Haggerty Date: Sun, 4 Sep 2016 16:08:23 +0000 (+0200) Subject: resolve_gitlink_ref(): avoid memory allocation in many cases X-Git-Tag: v2.11.0-rc0~143^2~21 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/48a8475fd3f935d753cc2e0dd81562bc73f6d6d3?ds=sidebyside resolve_gitlink_ref(): avoid memory allocation in many cases If we don't have to strip trailing '/' from the submodule path, then don't allocate and copy the submodule name. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano --- diff --git a/refs.c b/refs.c index 7b86b4eab5..17f3497a0b 100644 --- a/refs.c +++ b/refs.c @@ -1301,19 +1301,26 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags, int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1) { - int len = strlen(path); - struct strbuf submodule = STRBUF_INIT; + size_t len = strlen(path); struct ref_store *refs; int flags; - while (len && path[len-1] == '/') + while (len && path[len - 1] == '/') len--; + if (!len) return -1; - strbuf_add(&submodule, path, len); - refs = get_ref_store(submodule.buf); - strbuf_release(&submodule); + if (path[len]) { + /* We need to strip off one or more trailing slashes */ + char *stripped = xmemdupz(path, len); + + refs = get_ref_store(stripped); + free(stripped); + } else { + refs = get_ref_store(path); + } + if (!refs) return -1;