diff options
author | Sven Gothel <[email protected]> | 2013-06-20 08:59:55 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2013-06-20 08:59:55 +0200 |
commit | 2d8e25398e929f553c4524e9c57f083d90ba4e08 (patch) | |
tree | fcdcb1402293824970f736615022e0054305b63c | |
parent | 23341a2df2d2ea36784a16fa1db8bc7385351a12 (diff) |
Security: Gluegen generated native methods w/ 'pass through function pointer' _must_ be private!
-rw-r--r-- | src/java/com/jogamp/gluegen/procaddress/ProcAddressEmitter.java | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/src/java/com/jogamp/gluegen/procaddress/ProcAddressEmitter.java b/src/java/com/jogamp/gluegen/procaddress/ProcAddressEmitter.java index 82434cf..e6b3b6f 100644 --- a/src/java/com/jogamp/gluegen/procaddress/ProcAddressEmitter.java +++ b/src/java/com/jogamp/gluegen/procaddress/ProcAddressEmitter.java @@ -178,18 +178,23 @@ public class ProcAddressEmitter extends JavaEmitter { // Internals only below this point // + /** If 'native', enforce 'private native' modifiers. */ + protected void fixSecurityModifiers(JavaMethodBindingEmitter javaEmitter) { + if( javaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) && + !javaEmitter.hasModifier(JavaMethodBindingEmitter.PRIVATE) ) + { + javaEmitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + javaEmitter.removeModifier(JavaMethodBindingEmitter.PROTECTED); + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + javaEmitter.addModifier(JavaMethodBindingEmitter.NATIVE); + } + } + protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List<FunctionEmitter> emitters) { // See whether we need a proc address entry for this one boolean callThroughProcAddress = needsProcAddressWrapper(baseJavaEmitter.getBinding().getCSymbol()); - ProcAddressJavaMethodBindingEmitter emitter = - new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter, - callThroughProcAddress, - getProcAddressConfig().getProcAddressTableExpr(), - baseJavaEmitter.isForImplementingMethodCall(), - this); - emitters.add(emitter); - // If this emitter doesn't have a body (i.e., is a direct native // call with no intervening argument processing), we need to force // it to emit a body, and produce another one to act as the entry @@ -199,18 +204,35 @@ public class ProcAddressEmitter extends JavaEmitter { // from incorrectly introducing method bodies to the private // native implementing methods; want this to work at least for // public and package-private methods - if (baseJavaEmitter.signatureOnly() - && !baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.PRIVATE) - && baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) - && callThroughProcAddress) { - emitter.setEmitBody(true); - emitter.removeModifier(JavaMethodBindingEmitter.NATIVE); - emitter = new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter, + final boolean needsJavaWrapper = baseJavaEmitter.signatureOnly() && + !baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.PRIVATE) && + baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) && + callThroughProcAddress; + + + { + final ProcAddressJavaMethodBindingEmitter emitter = new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter, + callThroughProcAddress, + getProcAddressConfig().getProcAddressTableExpr(), + baseJavaEmitter.isForImplementingMethodCall(), + this); + if( needsJavaWrapper ) { + emitter.setEmitBody(true); + emitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + } else if ( callThroughProcAddress ) { + fixSecurityModifiers(emitter); + } + emitters.add(emitter); + } + + if( needsJavaWrapper ) { + final ProcAddressJavaMethodBindingEmitter emitter = new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter, callThroughProcAddress, getProcAddressConfig().getProcAddressTableExpr(), true, this); emitter.setForImplementingMethodCall(true); + fixSecurityModifiers(emitter); emitters.add(emitter); } } |