Skip to content

Commit

Permalink
EPOLL dladdr unexpected return value
Browse files Browse the repository at this point in the history
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 netty#4840
  • Loading branch information
Scottmitch authored and normanmaurer committed Feb 6, 2016
1 parent 36f5069 commit 93e6fe4
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion transport-native-epoll/src/main/c/netty_epoll_native.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 93e6fe4

Please sign in to comment.