Joerg Hoh created SLING-12873:
---------------------------------
Summary: ScriptBase.getNativeObject can return incorrect data
Key: SLING-12873
URL: https://issues.apache.org/jira/browse/SLING-12873
Project: Sling
Issue Type: Task
Components: Scripting
Reporter: Joerg Hoh
When doublechecking the PR for SLING-12519 ("doublechecked locking") I wonder
if an instance of the ScriptableBase does even work properly, if
[ScriptableBase.getNativei()|https://github.com/apache/sling-org-apache-sling-scripting-javascript/blob/28a85705bfd89abcb86fc194ae3017911f5eeb61/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableBase.java#L39-L58]
is called twice with different parameters from the same thread:
Example:
{noformat}
ScriptableBase sb = ...
Object o1 = sb.getNativeObject("name1", scriptable1); // # case 1
Object o1 = sb.getNativeObject("name2", scriptable2) // # case 2
{noformat}
for case 1 the field {{njo}} is initialized like this:
{{njo = new NativeJavaObject(scriptable1, wrapped, getStaticType())}}
and {{njo}} will be same when the 2nd call is made (case 2).
At the end of {{getNativeObject()}} this call is made:
{noformat}
protected Object getNative(String name, Scriptable start) {
[...]
njo = ...
[...]
return njo.get(name, start);
{noformat}
According to [the sourcecode of
NativeJavaObject|https://github.com/mozilla/rhino/blob/1e1f9c4770ba11bd1b06846bd985532fb9b5c6c7/rhino/src/main/java/org/mozilla/javascript/NativeJavaObject.java#L87-L97]
this method does not even use the provided parameter {{Scriptable start}}, but
relies internally on the scriptable provided in the constructor.
Which means, that in the case 2, if invoked with a different Scriptable, the
result will be incorrect, because the object is still based on scriptable1, but
will ignore scriptable2 entirely.
Which means, that in the generic case (a single Scriptable instance is used for
multiple calls with potentially different parameters) the results can be
incorrect.
Probably this problem was not showing up, because this case (getNativeObject
invoked with different scriptables) never happens in the context of Sling
Scripting (which needs to be confirmed). And at the same time it's also very
likely that this code is never invoked from multiple threads (which would
render the synchronisation redundant, being an easy fix for SLING-12519).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)