diff --git a/capsule/capsule-dlmopen.c b/capsule/capsule-dlmopen.c index e8508c291608ce91bbccd0e9882e30ab2ce3122d..8ce21457075e7b4d6169e732a4892b17588ef010 100644 --- a/capsule/capsule-dlmopen.c +++ b/capsule/capsule-dlmopen.c @@ -1404,8 +1404,7 @@ cleanup: } void * -capsule_shim_dlopen(void *handle, - Lmid_t ns, +capsule_shim_dlopen(Lmid_t ns, const char *prefix, const char **exclude, const char *file, @@ -1414,37 +1413,58 @@ capsule_shim_dlopen(void *handle, void *res; int code = 0; char *errors = NULL; + ldlibs_t ldlibs = { 0 }; - debug("capsule dlopen() wrapper: handle: %p; LMID: %ld; prefix: %s", handle, ns, prefix ); - debug(" target: %s; flags: %d", file, flag); - - if( !handle ) - return NULL; + debug( ">>>> capsule dlopen(%s, %x) wrapper: LMID: %ld; prefix: %s;", + file, flag, ns, prefix ); - // we have an absolute file path and a significant path prefix: - if( file && *file == '/' && - prefix && strcmp(prefix, "/") ) + if( prefix && strcmp(prefix, "/") ) { - char path[PATH_MAX]; - const size_t l = strlen( prefix ); + init_ldlibs( &ldlibs, exclude, prefix, 1, &code, &errors ); + + if( !load_ld_cache( &ldlibs, "/etc/ld.so.cache" ) ) + { + int rv = (errno == 0) ? EINVAL : errno; + + debug( "Loading ld.so.cache from %s (error: %d)", prefix, rv ); + goto cleanup; + } + + if( !dso_find( file, &ldlibs, 0 ) ) + { + int rv = (errno == 0) ? EINVAL : errno; + + debug( "<<<< Not found: %s under %s (error: %d)", file, prefix, rv ); + goto cleanup; + } - safe_strncpy( path, prefix, PATH_MAX ); - path[ l ] = '/'; - safe_strncpy( path + l + 1, file, PATH_MAX ); + dso_iterate_sections( &ldlibs, 0 ); - debug("RE-MAPPED dlopen target '%s' to '%s'\n", file, path); + if( ldlibs.error ) + { + debug( "<<<< capsule dlopen error: %s", ldlibs.error ); + goto cleanup; + } - res = - capsule_dlmopen( path, prefix, &ns, NULL, 0, exclude, &code, &errors ); + res = load_ldlibs( &ldlibs, &ns, flag, &code, &errors ); if( !res ) - debug("capsule_shim_dlopen failed: (%d) %s\n", code, errors); + { + debug( "<<<< capsule dlopen error %d: %s", code, errors ); + goto cleanup; + } } - else + else // no prefix: straightforward dlmopen into our capsule namespace: { - debug("No prefix, opening %s in private namespace %p", file, (void *)ns); - res = dlmopen( ns, file, RTLD_NOW ); + res = dlmopen( ns, file, flag ); + + if( !res ) + debug( "<<<< capsule dlopen error %s: %s", file, dlerror() ); } return res; + +cleanup: + cleanup_ldlibs( &ldlibs ); + return res; } diff --git a/capsule/capsule.h b/capsule/capsule.h index f172315cd99fd48bf2414969c3848f6254fb2303..129de50a818758e15e566f0c57bb725d329eda1d 100644 --- a/capsule/capsule.h +++ b/capsule/capsule.h @@ -41,8 +41,7 @@ void *capsule_dlmopen (const char *dso, int *errcode, char **error); -void *capsule_shim_dlopen(void *handle, - Lmid_t ns, +void *capsule_shim_dlopen(Lmid_t ns, const char *prefix, const char **exclude, const char *file,