Menu

#261 UnsafeLoader not thread-safe

Need_for_security
closed-fixed
local elib (53)
9
2013-11-25
2005-07-18
No

FIXED
From
http://www.eros-os.org/pipermail/e-lang/2004-August/009977.html

In
src/jsrc/org/erights/e/elang/interp/UnsafeLoader.java#90:4::106:5
:

/**
*
*/
private Slot getLocalSlot(String fqName) {
Slot result;
synchronized (myLocals) {
result = (Slot)myLocals.fetch(fqName,
ValueThunk.NULL_THUNK);
}
if (null != result) {
return result;
}
result = new FinalSlot(getWrapped(fqName));
synchronized (myLocals) {
myLocals.put(fqName, result, true);
}
return result;
}

If this code is executed from multiple threads with the
same fqName, it
is possible that both instances will decide that
myLocals needs the
entry added, in which case the one which finishes later
will fail
(affecting the code that called it) due to myLocals.put
being strict.

---

Solutions I see:

1.

if (!myLocals.maps(fqName)) {
myLocals.put(fqName, result, true);
}

2.

myLocals.put(fqName, result, false);

3. Use only one synchronized block that includes all of
the code
between the existing ones.

---

An example failure, caused by multiple vats being
simultaneously
started and seeded with the same code:

java.net.Socket already in map

- Loader#get(String)
. <unsafe:*>.get("java.net.Socket")
@ get/1:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::48:36::48:59>
- keio.networkAuthor$networkAuthor__C#run/2:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::41:5::41:7>
. <networkAuthor>(<a Scope>, [<dummy sealer>, <dummy
unsealer>])
@ run/2:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::38:24::38:24>
- keio.networkAuthor$networkAuthor__C#run/1:
<file:/Stuff/jlib/keio/networkAuthor.emaker#:span::37:5::37:7>
. <networkAuthor>(<a Scope>)
@ run/1:
<file:/Stuff/jlib/makeRunebotContext.emaker#:span::25:44::25:44>
- makeRunebotContext$makeContext__C#run/5:
<file:/Stuff/jlib/makeRunebotContext.emaker#:span::21:15::21:15>
. <makeContext>(<a Scope>, <Far ref>, "#erights", <Vat
evaluator for #erig...aluator for #erights>>, <Far ref>)
@ run/5
- __main$seedBootstrap__C#run/3
. <seedBootstrap>(<Far ref>, "#erights", <Far ref>)

java.lang.IllegalArgumentException: java.net.Socket
already in map
at
org.erights.e.elib.tables.FlexMapImpl.put(FlexMapImpl.java:342)
at
org.erights.e.elang.interp.UnsafeLoader.getLocalSlot(UnsafeLoader.java:
103)
at
org.erights.e.elang.interp.UnsafeLoader.get(UnsafeLoader.java:110)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown
Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at
org.erights.e.elib.prim.InstanceMethodNode.innerExecute(InstanceMethodNo
de.java:113)
at
org.erights.e.elib.prim.JavaMemberNode.execute(JavaMemberNode.java:183)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:125)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:127)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at
org.erights.e.elang.evm.DefineExpr.subEval(DefineExpr.java:125)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:97)
at
org.erights.e.elang.evm.EscapeExpr.subEval(EscapeExpr.java:154)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:169)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at
org.erights.e.elib.prim.Selector.callIt(Selector.java:99)
at
org.erights.e.elang.evm.CallExpr.subEval(CallExpr.java:132)
at org.erights.e.elang.evm.SeqExpr.subEval(SeqExpr.java:99)
at
org.erights.e.elang.evm.EMethod.execute(EMethod.java:174)
at
org.erights.e.elang.evm.EMethodNode.execute(EMethodNode.java:136)
at org.erights.e.elib.prim.E.callAll(E.java:152)
at
org.erights.e.elib.vat.PendingDelivery.innerRun(PendingDelivery.java:
102)
at
org.erights.e.elib.vat.PendingEvent.run(PendingEvent.java:76)
at
org.erights.e.elib.vat.HeadlessRunner.run(HeadlessRunner.java:176)
at java.lang.Thread.run(Thread.java:552)

Followups

Comment Date By
I used solution #2 2004-Dec-20 03:31 markm

Discussion

  • Steve Jenson

    Steve Jenson - 2005-07-18
    • status: open --> open-fixed
     
  • Steve Jenson

    Steve Jenson - 2005-07-18
    • status: open-fixed --> closed-fixed
     
  • Mark Samuel Miller

    • assigned_to: nobody --> caplet
     

Log in to post a comment.