From eb842815498f5926828b49c48fffce22fc9586a2 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Fri, 21 Jun 2013 03:45:07 +0200 Subject: Security: Tighten DynamicLinker*, NativeLibrary and DynamicLibraryBundle access (2) - Completes 23341a2df2d2ea36784a16fa1db8bc7385351a12 - Replace 'DynamicLinker' interface w/ well documented one - All DynamicLinker methods are now considered secure, i.e.: - open/lookup and close utilize reference counting on handle via a hash map. - lookupSymbol(..) and close(..) impl. validate the passed library handle whether it's retrieved via open*. This is the fast path, not that expensive. - lookupSymbolGlobal(..) performs Check acccess of 'new RuntimePermission("loadLibrary.*")' if SecurityManager is installed. This is the slow path. - DynamicLibraryBundleInfo now reflects the security requirements, i.e. whether priviledged access is needed. --- src/java/jogamp/common/os/UnixDynamicLinkerImpl.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'src/java/jogamp/common/os/UnixDynamicLinkerImpl.java') diff --git a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java index 1942477..25f4072 100644 --- a/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java +++ b/src/java/jogamp/common/os/UnixDynamicLinkerImpl.java @@ -27,9 +27,7 @@ */ package jogamp.common.os; -import com.jogamp.common.os.DynamicLinker; - -/* pp */ abstract class UnixDynamicLinkerImpl implements DynamicLinker { +/* pp */ abstract class UnixDynamicLinkerImpl extends DynamicLinkerImpl { // // Package private scope of class w/ protected native code access @@ -49,9 +47,11 @@ import com.jogamp.common.os.DynamicLinker; /** Interface to C language function:
void * dlsym(void * , const char * ); */ protected static native long dlsym(long arg0, java.lang.String arg1); - @Override - public final long lookupSymbol(long libraryHandle, String symbolName) { + public final long lookupSymbol(long libraryHandle, String symbolName) throws IllegalArgumentException { + if( null == getLibRef( libraryHandle ) ) { + throw new IllegalArgumentException("Library handle 0x"+Long.toHexString(libraryHandle)+" unknown."); + } final long addr = dlsym(libraryHandle, symbolName); if(DEBUG_LOOKUP) { System.err.println("DynamicLinkerImpl.lookupSymbol(0x"+Long.toHexString(libraryHandle)+", "+symbolName+") -> 0x"+Long.toHexString(addr)); @@ -60,7 +60,10 @@ import com.jogamp.common.os.DynamicLinker; } @Override - public final void closeLibrary(long libraryHandle) { + public final void closeLibrary(long libraryHandle) throws IllegalArgumentException { + if( null == decrLibRefCount( libraryHandle ) ) { + throw new IllegalArgumentException("Library handle 0x"+Long.toHexString(libraryHandle)+" unknown."); + } dlclose(libraryHandle); } -- cgit v1.2.3