EPOLL dladdr unexpected return value

Motivation:
netty_epoll_native.c uses dladdr in attempt to get the name of the library that the code is running in. However the address passed to this funciton (JNI_OnLoad) may not be unique in the context of the application which loaded it. For example if another JNI library is loaded this address may first resolve to the other JNI library and cause the path name parsing to fail, which will cause the library to fail.

Modifications:
- Pass an addresses which is local to the current library to dladdr

Result:
EPOLL JNI library can be loaded in an environment where multiple JNI libraries are loaded.
Fixes https://github.com/netty/netty/issues/4840
This commit is contained in:
Scott Mitchell 2016-02-05 11:17:20 -08:00 committed by Norman Maurer
parent f10d66b45e
commit b9682a26b1

View File

@ -947,11 +947,15 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) {
Dl_info dlinfo;
jint status = 0;
if (!dladdr((void*) JNI_OnLoad, &dlinfo)) {
// We need to use an address of a function that is uniquely part of this library, so choose a static
// function. See https://github.com/netty/netty/issues/4840.
if (!dladdr((void*) parsePackagePrefix, &dlinfo)) {
fprintf(stderr, "FATAL: transport-native-epoll JNI call to dladdr failed!\n");
return JNI_ERR;
}
char* packagePrefix = parsePackagePrefix(dlinfo.dli_fname, &status);
if (status == JNI_ERR) {
fprintf(stderr, "FATAL: transport-native-epoll JNI encountered unexpected dlinfo.dli_fname: %s\n", dlinfo.dli_fname);
return JNI_ERR;
}