Skip to content

Commit

Permalink
Merge pull request #39 from yasserzamani/WW-4817
Browse files Browse the repository at this point in the history
WW-4817 Similar to #36 for master
  • Loading branch information
lukaszlenart authored Aug 1, 2017
2 parents 992c531 + 593aba2 commit 4b94b7d
Showing 1 changed file with 33 additions and 49 deletions.
82 changes: 33 additions & 49 deletions src/java/ognl/OgnlRuntime.java
Original file line number Diff line number Diff line change
Expand Up @@ -820,46 +820,15 @@ public static Object invokeMethod(Object target, Method method, Object[] argsArr
throws InvocationTargetException, IllegalAccessException
{
boolean syncInvoke = false;
boolean checkPermission = false;

// only synchronize method invocation if it actually requires it

synchronized(method) {
if (_methodAccessCache.get(method) == null
|| _methodAccessCache.get(method) == Boolean.TRUE) {
syncInvoke = true;
}

if (_securityManager != null && _methodPermCache.get(method) == null
|| _methodPermCache.get(method) == Boolean.FALSE) {
checkPermission = true;
}
}

Object result;
boolean wasAccessible = true;

if (syncInvoke)
{
synchronized(method)
{
if (checkPermission)
{
try
{
_securityManager.checkPermission(getPermission(method));
_methodPermCache.put(method, Boolean.TRUE);
} catch (SecurityException ex) {
_methodPermCache.put(method, Boolean.FALSE);
throw new IllegalAccessException("Method [" + method + "] cannot be accessed.");
}
}

if (_methodAccessCache.get(method) == null) {
if (!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers()))
{
if (!(wasAccessible = ((AccessibleObject) method).isAccessible()))
if (!(((AccessibleObject) method).isAccessible()))
{
((AccessibleObject) method).setAccessible(true);
_methodAccessCache.put(method, Boolean.TRUE);
} else
{
Expand All @@ -869,28 +838,43 @@ public static Object invokeMethod(Object target, Method method, Object[] argsArr
{
_methodAccessCache.put(method, Boolean.FALSE);
}
}
if (_methodAccessCache.get(method) == Boolean.TRUE) {
syncInvoke = true;
}

result = method.invoke(target, argsArray);

if (!wasAccessible)
{
((AccessibleObject) method).setAccessible(false);
if (_methodPermCache.get(method) == null) {
if (_securityManager != null) {
try
{
_securityManager.checkPermission(getPermission(method));
_methodPermCache.put(method, Boolean.TRUE);
} catch (SecurityException ex) {
_methodPermCache.put(method, Boolean.FALSE);
throw new IllegalAccessException("Method [" + method + "] cannot be accessed.");
}
}
}
} else
{
if (checkPermission)
{
try
{
_securityManager.checkPermission(getPermission(method));
else {
_methodPermCache.put(method, Boolean.TRUE);
} catch (SecurityException ex) {
_methodPermCache.put(method, Boolean.FALSE);
throw new IllegalAccessException("Method [" + method + "] cannot be accessed.");
}
}
if (_methodPermCache.get(method) == Boolean.FALSE) {
throw new IllegalAccessException("Method [" + method + "] cannot be accessed.");
}
}

Object result;

if (syncInvoke) //if is not public and is not accessible
{
synchronized(method)
{
((AccessibleObject) method).setAccessible(true);
result = method.invoke(target, argsArray);
((AccessibleObject) method).setAccessible(false);
}
} else
{
result = method.invoke(target, argsArray);
}

Expand Down

0 comments on commit 4b94b7d

Please sign in to comment.