From 9b255d465c340945ebe923f4443cb26d44a344ef Mon Sep 17 00:00:00 2001 From: John Hein Date: Thu, 26 Jan 2017 15:27:48 -0700 Subject: [PATCH] If PKG_CONFIG_PATH element is a sym link, use the link destination instead of the link for inode caching checks. See issue 112 & issue 110 (https://github.com/pkgconf/pkgconf/issues) --- libpkgconf/path.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libpkgconf/path.c b/libpkgconf/path.c index acb1cc1..dddb3bf 100644 --- a/libpkgconf/path.c +++ b/libpkgconf/path.c @@ -82,11 +82,22 @@ pkgconf_path_add(const char *text, pkgconf_list_t *dirlist, bool filter) #ifdef PKGCONF_CACHE_INODES struct stat st; - if (filter && stat(text, &st) == -1) - return; + if (filter) + { + if (lstat(text, &st) == -1) + return; + if (S_ISLNK(st.st_mode)) + { + char linkdest[PKGCONF_BUFSIZE]; + ssize_t len = readlink(text, linkdest, sizeof(linkdest)); - if (filter && path_list_contains_entry(text, dirlist, &st)) - return; + if (len != -1 && (size_t)len < sizeof(linkdest) && + stat(linkdest, &st) == -1) + return; + } + if (path_list_contains_entry(text, dirlist, &st)) + return; + } #else if (filter && path_list_contains_entry(text, dirlist)) return;