diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
index 3be03b99133e8b48791416edae3f4fbcfcbdcb0b..20bb4b423fba6bb15d17f2daffb07e814e79b161 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java
@@ -297,12 +297,17 @@ public abstract class InternalNode extends OperatorNode {
         @Override
         @ExplodeLoop
         protected Object[] prepareArgs(VirtualFrame frame) {
-            Object[] args = new Object[factory.getSignature().getLength()];
+            int argsLength = factory.getSignature().getLength();
+            if (arguments.length < argsLength - 1) {
+                // Note: GnuR seems to be OK with this and makes up some random values
+                throw error(Message.ARGUMENT_LENGTHS_DIFFER);
+            }
+            Object[] args = new Object[argsLength];
 
             for (int i = 0; i < args.length - 1; i++) {
                 args[i] = arguments[i].execute(frame);
             }
-            Object[] varArgs = new Object[arguments.length - (factory.getSignature().getLength() - 1)];
+            Object[] varArgs = new Object[arguments.length - (argsLength - 1)];
             for (int i = 0; i < varArgs.length; i++) {
                 varArgs[i] = arguments[args.length - 1 + i].execute(frame);
             }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/nodes/EvaluatedArgumentsVisitor.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/nodes/EvaluatedArgumentsVisitor.java
index fa3254ef13d6cbded74e37747af70715980050ed..6f05ebf3cacc34bac8b3fd74f1483ecba822d6c3 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/nodes/EvaluatedArgumentsVisitor.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/nodes/EvaluatedArgumentsVisitor.java
@@ -106,7 +106,9 @@ public final class EvaluatedArgumentsVisitor extends RSyntaxVisitor<Info> {
                         } else {
                             assert signature.getVarArgCount() == 1 : signature;
                             assert innerArguments.length == signature.getLength() || signature.getVarArgIndex() == signature.getLength() - 1 : signature;
-                            assert innerArguments.length >= signature.getLength() - 1 : signature + " " + innerArguments.length;
+                            // holds only for well-formed code, so we cannot rely on it:
+                            // assert innerArguments.length >= signature.getLength() - 1 : signature
+                            // + " " + innerArguments.length;
                         }
                         Info info = Info.createNew();
                         for (int i = innerArguments.length - 1; i >= 0; i--) {