Skip to content
This repository was archived by the owner on Nov 15, 2022. It is now read-only.

Commit eb02440

Browse files
h2002044yaminikb
authored andcommitted
Fixes #21905: Using Hibernate 5.x and Oracle driver throws IllegalAccessException (#22142)
* use setAccessible(true) in doPrivileged block
1 parent 3c756a2 commit eb02440

File tree

1 file changed

+71
-46
lines changed

1 file changed

+71
-46
lines changed

appserver/jdbc/jdbc-ra/jdbc-core/src/main/java/com/sun/gjc/util/MethodExecutor.java

+71-46
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
import javax.resource.ResourceException;
4848
import java.lang.reflect.InvocationTargetException;
4949
import java.lang.reflect.Method;
50+
import java.security.AccessController;
51+
import java.security.PrivilegedAction;
52+
import java.security.PrivilegedActionException;
53+
import java.security.PrivilegedExceptionAction;
5054
import java.util.Vector;
5155
import java.util.Properties;
5256
import java.util.logging.Level;
@@ -87,28 +91,38 @@ public void runJavaBeanMethod(String value, Method method, Object obj) throws Re
8791
if (value == null || value.trim().equals("")) {
8892
return;
8993
}
90-
try {
91-
Class[] parameters = method.getParameterTypes();
92-
if (parameters.length == 1) {
93-
Object[] values = new Object[1];
94-
values[0] = convertType(parameters[0], value);
95-
method.invoke(obj, values);
94+
95+
Class[] parameters = method.getParameterTypes();
96+
if (parameters.length == 1) {
97+
Object[] values = new Object[1];
98+
values[0] = convertType(parameters[0], value);
99+
100+
final ResourceException[] exception = new ResourceException[1];
101+
AccessController
102+
.doPrivileged(new PrivilegedAction() {
103+
public Object run() {
104+
try {
105+
method.setAccessible(true);
106+
method.invoke(obj, values);
107+
} catch (IllegalAccessException | InvocationTargetException | SecurityException iae) {
108+
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", value);
109+
_logger.log(Level.SEVERE, "", iae);
110+
String msg = sm.getString("me.access_denied",
111+
method.getName());
112+
exception[0] = new ResourceException(msg);
113+
} catch (IllegalArgumentException ie) {
114+
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", value);
115+
_logger.log(Level.SEVERE, "", ie);
116+
String msg = sm
117+
.getString("me.illegal_args", method.getName());
118+
exception[0] = new ResourceException(msg);
119+
}
120+
return null;
121+
}
122+
});
123+
if( exception[0] != null){
124+
throw exception[0];
96125
}
97-
} catch (IllegalAccessException iae) {
98-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", value);
99-
_logger.log(Level.SEVERE, "", iae);
100-
String msg = sm.getString("me.access_denied", method.getName());
101-
throw new ResourceException(msg);
102-
} catch (IllegalArgumentException ie) {
103-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", value);
104-
_logger.log(Level.SEVERE, "", ie);
105-
String msg = sm.getString("me.illegal_args", method.getName());
106-
throw new ResourceException(msg);
107-
} catch (InvocationTargetException ite) {
108-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", value);
109-
_logger.log(Level.SEVERE, "", ite);
110-
String msg = sm.getString("me.access_denied", method.getName());
111-
throw new ResourceException(msg);
112126
}
113127
}
114128

@@ -123,7 +137,6 @@ public void runJavaBeanMethod(String value, Method method, Object obj) throws Re
123137
* a security violation.
124138
*/
125139
public void runMethod(Method method, Object obj, Vector values) throws ResourceException {
126-
try {
127140
Class[] parameters = method.getParameterTypes();
128141
if (values.size() != parameters.length) {
129142
return;
@@ -137,22 +150,30 @@ public void runMethod(Method method, Object obj, Vector values) throws ResourceE
137150
actualValues[i] = convertType(parameters[i], val);
138151
}
139152
}
140-
method.invoke(obj, actualValues);
141-
} catch (IllegalAccessException iae) {
142-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", values);
143-
_logger.log(Level.SEVERE, "", iae);
144-
String msg = sm.getString("me.access_denied", method.getName());
145-
throw new ResourceException(msg);
146-
} catch (IllegalArgumentException ie) {
147-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", values);
148-
_logger.log(Level.SEVERE, "", ie);
149-
String msg = sm.getString("me.illegal_args", method.getName());
150-
throw new ResourceException(msg);
151-
} catch (InvocationTargetException ite) {
152-
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", values);
153-
_logger.log(Level.SEVERE, "", ite);
154-
String msg = sm.getString("me.access_denied", method.getName());
155-
throw new ResourceException(msg);
153+
final ResourceException[] exception = new ResourceException[1];
154+
AccessController.doPrivileged(new PrivilegedAction() {
155+
public Object run() {
156+
try {
157+
method.setAccessible(true);
158+
method.invoke(obj, actualValues);
159+
} catch (IllegalAccessException | InvocationTargetException | SecurityException iae) {
160+
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", values);
161+
_logger.log(Level.SEVERE, "", iae);
162+
String msg = sm
163+
.getString("me.access_denied", method.getName());
164+
exception[0] = new ResourceException(msg);
165+
} catch (IllegalArgumentException ie) {
166+
_logger.log(Level.SEVERE, "jdbc.exc_jb_val", values);
167+
_logger.log(Level.SEVERE, "", ie);
168+
String msg = sm
169+
.getString("me.illegal_args", method.getName());
170+
exception[0] = new ResourceException(msg);
171+
}
172+
return null;
173+
}
174+
});
175+
if( exception[0] != null){
176+
throw exception[0];
156177
}
157178
}
158179

@@ -225,7 +246,7 @@ private Object convertType(Class type, String parameter) throws ResourceExceptio
225246
public Object invokeMethod(Object object, String methodName,
226247
Class<?>[] valueTypes, Object... values) throws ResourceException {
227248
Object returnValue = null;
228-
Method actualMethod = null;
249+
Method actualMethod ;
229250
try {
230251
actualMethod = object.getClass().getMethod(methodName, valueTypes);
231252
} catch (NoSuchMethodException ex) {
@@ -235,13 +256,17 @@ public Object invokeMethod(Object object, String methodName,
235256
}
236257
if (actualMethod != null) {
237258
try {
238-
returnValue = actualMethod.invoke(object, values);
239-
} catch (IllegalAccessException ex) {
240-
throw new ResourceException(ex);
241-
} catch (IllegalArgumentException ex) {
242-
throw new ResourceException(ex);
243-
} catch (InvocationTargetException ex) {
244-
throw new ResourceException(ex);
259+
returnValue = AccessController.doPrivileged(
260+
(PrivilegedExceptionAction<Object>) () -> {
261+
actualMethod.setAccessible(true);
262+
return actualMethod.invoke(object, values);
263+
});
264+
} catch (PrivilegedActionException e) {
265+
if(e.getException() != null){
266+
throw new ResourceException(e.getException());
267+
}else{
268+
throw new ResourceException(e);
269+
}
245270
}
246271
}
247272
return returnValue;

0 commit comments

Comments
 (0)