mirror of
https://github.com/git/git.git
synced 2024-11-23 09:56:28 +08:00
resolve_symlink(): use a strbuf for internal scratch space
Aside from shortening and simplifying the code, this removes another place where the path name length is arbitrarily limited. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
cf6950d3bf
commit
5025d8450a
33
lockfile.c
33
lockfile.c
@ -126,44 +126,35 @@ static char *last_path_elm(char *p)
|
||||
static char *resolve_symlink(char *p, size_t s)
|
||||
{
|
||||
int depth = MAXDEPTH;
|
||||
static struct strbuf link = STRBUF_INIT;
|
||||
|
||||
while (depth--) {
|
||||
char link[PATH_MAX];
|
||||
int link_len = readlink(p, link, sizeof(link));
|
||||
if (link_len < 0) {
|
||||
/* not a symlink anymore */
|
||||
return p;
|
||||
}
|
||||
else if (link_len < sizeof(link))
|
||||
/* readlink() never null-terminates */
|
||||
link[link_len] = '\0';
|
||||
else {
|
||||
warning("%s: symlink too long", p);
|
||||
return p;
|
||||
}
|
||||
if (strbuf_readlink(&link, p, strlen(p)) < 0)
|
||||
break;
|
||||
|
||||
if (is_absolute_path(link)) {
|
||||
if (is_absolute_path(link.buf)) {
|
||||
/* absolute path simply replaces p */
|
||||
if (link_len < s)
|
||||
strcpy(p, link);
|
||||
if (link.len < s)
|
||||
strcpy(p, link.buf);
|
||||
else {
|
||||
warning("%s: symlink too long", p);
|
||||
return p;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* link is a relative path, so I must replace the
|
||||
* link is a relative path, so replace the
|
||||
* last element of p with it.
|
||||
*/
|
||||
char *r = (char *)last_path_elm(p);
|
||||
if (r - p + link_len < s)
|
||||
strcpy(r, link);
|
||||
if (r - p + link.len < s)
|
||||
strcpy(r, link.buf);
|
||||
else {
|
||||
warning("%s: symlink too long", p);
|
||||
return p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
strbuf_reset(&link);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user