[PATCH 15/22] resolve_symlink(): use a strbuf internally
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Apr 1, 2014, 15:58 UTC
- Message-ID
- <1396367910-7299-16-git-send-email-mhagger@alum.mit.edu>
- In-Reply-To
- <1396367910-7299-1-git-send-email-mhagger@alum.mit.edu>
This removes another place where the path name is arbitrarily limited.
This gets rid of a warning
%s: symlink too long
even though strbuf_readlink() in fact still limits the length of what it can handle to something like 2*PATH_MAX. But (1) the limit is now much longer, and (2) strbuf_readlink() doesn't return enough information to distinguish this problem from other symlink-reading problems, so just let it go.
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> --- lockfile.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/lockfile.c b/lockfile.c index 931ebbd..0ade314 100644 --- a/lockfile.c +++ b/lockfile.c @@ -128,30 +128,25 @@ static void trim_last_path_elm(struct strbuf *path) static void resolve_symlink(struct strbuf *path) { int depth = MAXDEPTH; + struct strbuf link; + + strbuf_init(&link, path->len); while (depth--) { - char link[PATH_MAX]; - int link_len = readlink(path->buf, link, sizeof(link)); - if (link_len < 0) { - /* not a symlink anymore */ - return; - } - if (link_len >= sizeof(link)) { - warning("%s: symlink too long", path->buf); - return; - } - /* readlink() never null-terminates */ - link[link_len] = '\0'; + if (strbuf_readlink(&link, path->buf, path->len) < 0) + break; - if (is_absolute_path(link)) + if (is_absolute_path(link.buf)) /* an absolute path replaces the whole path: */ strbuf_setlen(path, 0); else /* a relative path replaces the last element of path: */ trim_last_path_elm(path); - strbuf_add(path, link, link_len); + strbuf_addbuf(path, &link); } + + strbuf_release(&link); } /* We append ".lock" to the filename to derive the lockfile name: */
-- 1.9.0