mcexec: Fix resolving library path for LD_PRELOAD

Fixes: 8ee1d61d "Revert "Detect hang of McKernel in mcexec""
Fixes: b87ac8b8 "reproductible builds: remove most install paths in c code"
Change-Id: I8ef9ab81cd0a41ccd0e227ebc3e45c0745c150e9
This commit is contained in:
Masamichi Takagi
2020-04-16 20:46:46 +09:00
parent 0082447043
commit 367bbda713

View File

@@ -1875,39 +1875,51 @@ static ssize_t find_libdir(char *libdir, size_t len)
ssize_t rc; ssize_t rc;
size_t linelen = 0; size_t linelen = 0;
char *line = NULL; char *line = NULL;
char *ihklib, *slash; char *slash;
char path[PATH_MAX];
char cmd[PATH_MAX];
filep = fopen("/proc/self/maps", "r"); rc = readlink("/proc/self/exe", path, sizeof(path));
if (!filep) { if (rc < 0) {
rc = -errno; rc = -errno;
fprintf(stderr, "could not open /proc/self/maps: %zd\n", -rc); fprintf(stderr, "readlink /proc/self/exe: %ld\n", -rc);
return rc; goto out;
} else if (rc >= sizeof(path)) {
strcpy(path, "/proc/self/exe");
} else {
path[rc] = '\0';
} }
while ((rc = getline(&line, &linelen, filep)) > 0) { rc = snprintf(cmd, sizeof(cmd),
ihklib = strstr(line, "libihk.so"); "objdump -x %s | awk '/RPATH/ { print $2 }'",
if (ihklib) path);
break; if (rc >= sizeof(cmd)) {
} rc = -ERANGE;
if (!ihklib) {
fprintf(stderr, "mcexec does not have libihk.so loaded?\n");
rc = -ENOENT;
goto out; goto out;
} }
filep = popen(cmd, "r");
if (!filep) {
rc = -errno;
fprintf(stderr, "objdump /proc/self/exe: %ld\n", -rc);
goto out;
}
rc = getline(&line, &linelen, filep);
if (rc <= 0) {
rc = -errno;
fprintf(stderr, "RPATH not found: %ld\n", -rc);
goto out;
}
line[rc - 1] = 0;
slash = strchr(line, '/'); slash = strchr(line, '/');
if (!slash) { if (!slash) {
rc = -EINVAL; rc = -EINVAL;
goto out; goto out;
} }
/* leave / iff root of filesystem */ rc = snprintf(libdir, len, "%s", line);
if (slash + 1 != ihklib)
ihklib--;
*ihklib = 0;
rc = snprintf(libdir, len, "%s", slash);
if (rc > len) { if (rc > len) {
rc = -ERANGE; rc = -ERANGE;
@@ -1915,7 +1927,7 @@ static ssize_t find_libdir(char *libdir, size_t len)
} }
out: out:
fclose(filep); pclose(filep);
free(line); free(line);
return rc; return rc;
} }