Commit 9e32084e authored by Hengqi Chen's avatar Hengqi Chen Committed by Andrii Nakryiko

libbpf: Do not require executable permission for shared libraries

Currently, resolve_full_path() requires executable permission for both
programs and shared libraries. This causes failures on distos like Debian
since the shared libraries are not installed executable and Linux is not
requiring shared libraries to have executable permissions. Let's remove
executable permission check for shared libraries.
Reported-by: default avatarGoro Fuji <goro@fastly.com>
Signed-off-by: default avatarHengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220806102021.3867130-1-hengqi.chen@gmail.com
parent 0c9a7a7e
...@@ -10664,15 +10664,17 @@ static const char *arch_specific_lib_paths(void) ...@@ -10664,15 +10664,17 @@ static const char *arch_specific_lib_paths(void)
static int resolve_full_path(const char *file, char *result, size_t result_sz) static int resolve_full_path(const char *file, char *result, size_t result_sz)
{ {
const char *search_paths[3] = {}; const char *search_paths[3] = {};
int i; int i, perm;
if (str_has_sfx(file, ".so") || strstr(file, ".so.")) { if (str_has_sfx(file, ".so") || strstr(file, ".so.")) {
search_paths[0] = getenv("LD_LIBRARY_PATH"); search_paths[0] = getenv("LD_LIBRARY_PATH");
search_paths[1] = "/usr/lib64:/usr/lib"; search_paths[1] = "/usr/lib64:/usr/lib";
search_paths[2] = arch_specific_lib_paths(); search_paths[2] = arch_specific_lib_paths();
perm = R_OK;
} else { } else {
search_paths[0] = getenv("PATH"); search_paths[0] = getenv("PATH");
search_paths[1] = "/usr/bin:/usr/sbin"; search_paths[1] = "/usr/bin:/usr/sbin";
perm = R_OK | X_OK;
} }
for (i = 0; i < ARRAY_SIZE(search_paths); i++) { for (i = 0; i < ARRAY_SIZE(search_paths); i++) {
...@@ -10691,8 +10693,8 @@ static int resolve_full_path(const char *file, char *result, size_t result_sz) ...@@ -10691,8 +10693,8 @@ static int resolve_full_path(const char *file, char *result, size_t result_sz)
if (!seg_len) if (!seg_len)
continue; continue;
snprintf(result, result_sz, "%.*s/%s", seg_len, s, file); snprintf(result, result_sz, "%.*s/%s", seg_len, s, file);
/* ensure it is an executable file/link */ /* ensure it has required permissions */
if (access(result, R_OK | X_OK) < 0) if (access(result, perm) < 0)
continue; continue;
pr_debug("resolved '%s' to '%s'\n", file, result); pr_debug("resolved '%s' to '%s'\n", file, result);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment