Fuzzing results with Nashorn (hg tip f1fd5f0bc84c)

André Bargull andrebargull at googlemail.com
Tue Sep 17 11:05:49 PDT 2013


Here are the promised fuzzing results. Currently it doesn't make sense 
to run longer fuzzing sessions because of the first bug below. That one 
is triggered way too often.

- André


Compiler errors:

jjs> Function("for(x.x in 0) {}");
Exception in thread "main" java.lang.AssertionError
     at 
jdk.nashorn.internal.codegen.CodeGenerator.enterForIn(CodeGenerator.java:855)
     at 
jdk.nashorn.internal.codegen.CodeGenerator.enterForNode(CodeGenerator.java:807)
     at jdk.nashorn.internal.ir.ForNode.accept(ForNode.java:90)
     at 
jdk.nashorn.internal.ir.LexicalContextNode$Acceptor.accept(LexicalContextNode.java:57)
     at 
jdk.nashorn.internal.ir.LexicalContextStatement.accept(LexicalContextStatement.java:53)
     ...

jjs> Function("switch((null >> x3)) { default: {var x;break ; }\nthrow 
x; }");
java.lang.NullPointerException
     at jdk.internal.org.objectweb.asm.Frame.merge(Frame.java:1321)
     at 
jdk.internal.org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1499)
     at 
jdk.nashorn.internal.codegen.MethodEmitter.end(MethodEmitter.java:201)
     at 
jdk.nashorn.internal.codegen.CodeGenerator.leaveFunctionNode(CodeGenerator.java:1049)
     at jdk.nashorn.internal.ir.FunctionNode.accept(FunctionNode.java:297)
     ...

jjs> try{Function("switch(x) { case 8: break; case false: 
}");}catch(e){e.printStackTrace()}
java.lang.ClassCastException: java.lang.Boolean cannot be cast to 
java.lang.Integer
     at 
jdk.nashorn.internal.codegen.CodeGenerator.enterSwitchNode(CodeGenerator.java:1844)
     at jdk.nashorn.internal.ir.SwitchNode.accept(SwitchNode.java:103)
     at 
jdk.nashorn.internal.ir.LexicalContextNode$Acceptor.accept(LexicalContextNode.java:57)
     at 
jdk.nashorn.internal.ir.LexicalContextStatement.accept(LexicalContextStatement.java:53)
     at jdk.nashorn.internal.ir.SwitchNode.accept(SwitchNode.java:38)
     ...

jjs> Function("try { return true; } finally { return false; } ");
Exception in thread "main" java.lang.AssertionError: 
[BinaryNode at 0x396e2f39#:t$1 (Object) root = [:t$1 (Object)] (object)]
     [IdentNode at 0x1990a65e#:return (boolean) (slot=1) lhs = ':return' 
[:return (boolean) (slot=1)] (boolean)]
     [UnaryNode at 0x25bbf683#:t$1 (Object) rhs convert [:t$1 (Object)] 
(object)]
         [LiteralNode$BooleanLiteralNode at 0x7276c8cd#:l$1 (boolean) rhs = 
'true' [:l$1 (boolean)] (boolean)]

     at 
jdk.nashorn.internal.codegen.CodeGenerator.enterASSIGN(CodeGenerator.java:2440)
     at 
jdk.nashorn.internal.ir.visitor.NodeOperatorVisitor.enterBinaryNode(NodeOperatorVisitor.java:121)
     at jdk.nashorn.internal.ir.BinaryNode.accept(BinaryNode.java:165)
     at 
jdk.nashorn.internal.codegen.CodeGenerator$1.enterDefault(CodeGenerator.java:418)
     at 
jdk.nashorn.internal.ir.visitor.NodeVisitor.enterBinaryNode(NodeVisitor.java:178)
     ...

jjs> Function("({ get 1e81(){} })");
Exception in thread "main" java.lang.ClassFormatError: Illegal method 
name "_L1$get 1.0e+81" in class 
jdk/nashorn/internal/scripts/Script$\^function\_
     at java.lang.ClassLoader.defineClass1(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:752)
     at 
jdk.nashorn.internal.runtime.ScriptLoader.installClass(ScriptLoader.java:87)
     at 
jdk.nashorn.internal.runtime.Context$ContextCodeInstaller.install(Context.java:125)
     at jdk.nashorn.internal.codegen.Compiler.install(Compiler.java:408)
     ...

jjs> Function("{var x, x3;try { return 0; } finally { return 3/0; }  }");
Exception in thread "main" java.lang.AssertionError: int is not 
compatible with double
     at 
jdk.nashorn.internal.codegen.MethodEmitter.popType(MethodEmitter.java:235)
     at 
jdk.nashorn.internal.codegen.MethodEmitter.store(MethodEmitter.java:953)
     at 
jdk.nashorn.internal.codegen.CodeGenerator$Store$2.enterIdentNode(CodeGenerator.java:3164)
     at jdk.nashorn.internal.ir.IdentNode.accept(IdentNode.java:123)
     at 
jdk.nashorn.internal.codegen.CodeGenerator$Store.epilogue(CodeGenerator.java:3139)
     ...

jjs> Function("with(x ? 1e81 : (x2.constructor = 0.1)){}")
Exception in thread "main" java.lang.AssertionError: double is not 
compatible with object
     at 
jdk.nashorn.internal.codegen.MethodEmitter.popType(MethodEmitter.java:235)
     at 
jdk.nashorn.internal.codegen.MethodEmitter.fixParamStack(MethodEmitter.java:1109)
     at 
jdk.nashorn.internal.codegen.MethodEmitter.invoke(MethodEmitter.java:1128)
     at 
jdk.nashorn.internal.codegen.MethodEmitter.invokestatic(MethodEmitter.java:1182)
     at 
jdk.nashorn.internal.codegen.CompilerConstants$2.invoke(CompilerConstants.java:359)
     ...

jjs> Function("while(x-=1){var x=0; }")
Exception in thread "main" java.lang.VerifyError: get long/double 
overflows locals
Exception Details:
   Location:
jdk/nashorn/internal/scripts/Script$\^function\_._L1(Ljava/lang/Object;)Ljava/lang/Object; 
@5: dload_2
   Reason:
     Local index 2 is invalid
   Bytecode:
     0000000: a700 050e 4928 0f67 5c49 b800 339a fff6
     0000010: b200 2bb0
   Stackmap Table:
     append_frame(@3,Top,Double)
     chop_frame(@5,2)

     at java.lang.Class.getDeclaredFields0(Native Method)
     at java.lang.Class.privateGetDeclaredFields(Class.java:2476)
     at java.lang.Class.getDeclaredField(Class.java:1975)
     at jdk.nashorn.internal.codegen.Compiler$2.run(Compiler.java:417)
     at jdk.nashorn.internal.codegen.Compiler$2.run(Compiler.java:413)
     ...

The following scripts have similar VerifyErrors, I think they're related:
Function("while((x-=false) && 0){var x = this; }");
Function("/*infloop*/while(x4-=x)var x, x4 = x1;");
Function("/*infloop*/L:while(x+=null){this;var x =  /x/g ; }");
Function("while((x1|=0.1) && 0){var x1 = -0, functional; }");

---

Runtime errors:


jjs> try{Function("with({}) return 
(eval(\"arguments\"));")()}catch(e){e.printStackTrace()}
java.lang.NullPointerException
     at 
java.lang.invoke.MethodHandles.guardWithTest(MethodHandles.java:2131)
     at 
jdk.nashorn.internal.lookup.MethodHandleFactory$StandardMethodHandleFunctionality.guardWithTest(MethodHandleFactory.java:287)
     at 
jdk.nashorn.internal.runtime.WithObject.fixScopeCallSite(WithObject.java:258)
     at jdk.nashorn.internal.runtime.WithObject.lookup(WithObject.java:126)
     at 
jdk.nashorn.internal.runtime.linker.NashornLinker.getGuardedInvocation(NashornLinker.java:75)
     ...



More information about the nashorn-dev mailing list