libpkgconf: path: supply buffer to realpath
To avoid a crash on some platforms (like Darwin 9) provide a buffer to realpath(3). Darwin 9 (last PPC target) documents realpath needs to be given a buffer to the resolved_path argument large enough to hold PATH_MAX bytes. With NULL argument it crashes. Solaris makes no mention of resolved_path to be allowed NULL, yet recent versions accept it and malloc(3) accordingly. Because the documentation explicitly mentions PATH_MAX being the limit to what realpath(3) would write in resolved_path, switching to a static buffer here doesn't limit resolution compared to dynamically allocating a buffer by realpath(3). While this change requires a bit more space on the stack, it avoids a malloc/free sequence, and allows successful operation on (older) platforms that lack support for dynamically allocating a return buffer in realpath(3). Signed-off-by: Fabian Groffen <grobian@gentoo.org>pull/210/head
parent
78a77dd497
commit
13a5d9a5f0
|
@ -92,16 +92,12 @@ pkgconf_path_add(const char *text, pkgconf_list_t *dirlist, bool filter)
|
||||||
return;
|
return;
|
||||||
if (S_ISLNK(st.st_mode))
|
if (S_ISLNK(st.st_mode))
|
||||||
{
|
{
|
||||||
char *linkdest = realpath(path, NULL);
|
char pathbuf[PATH_MAX];
|
||||||
|
char *linkdest = realpath(path, pathbuf);
|
||||||
|
|
||||||
if (linkdest != NULL && stat(linkdest, &st) == -1)
|
if (linkdest != NULL && stat(linkdest, &st) == -1)
|
||||||
{
|
|
||||||
free(linkdest);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(linkdest);
|
|
||||||
}
|
|
||||||
if (path_list_contains_entry(path, dirlist, &st))
|
if (path_list_contains_entry(path, dirlist, &st))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue