Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8327375

JavaCompiler occurs java.lang.StackOverflowError in some cases

XMLWordPrintable

    • b01
    • 11
    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Microsoft Windows 10.0.19045
      java version "17.0.10" 2024-01-16 LTS
      Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240)
      Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)

      A DESCRIPTION OF THE PROBLEM :
      When I was doing fuzzing testing, I found that JavaCompiler would generate a java.lang.StackOverflowError exception when there were too many {}. Maybe the recursive analysis of the content in the block leads to too many recursions and then crashes. The number of recursions can be limited. The number of {}'s that crash JavaCompiler may vary in different systems. If the example file does not trigger the exception, you can try adding more { or }.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      compile the file1 and error will occur
      run file2 and error will occur

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      no error
      ACTUAL -
      java.lang.StackOverflowError
      at java.base/java.lang.AbstractStringBuilder.setLength(AbstractStringBuilder.java:321)
      at java.base/java.lang.StringBuilder.setLength(StringBuilder.java:87)
      at jdk.compiler/com.sun.tools.javac.parser.JavaTokenizer.readToken(JavaTokenizer.java:784)
      at jdk.compiler/com.sun.tools.javac.parser.Scanner.nextToken(Scanner.java:115)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.nextToken(JavacParser.java:275)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.accept(JavacParser.java:468)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.accept(JavacParser.java:460)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2538)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.parseSimpleStatement(JavacParser.java:2781)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatement(JavacParser.java:2632)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.blockStatements(JavacParser.java:2569)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2539)
      at jdk.compiler/com.sun.tools.javac.parser.JavacParser.block(JavacParser.java:2553)
      ......


      ---------- BEGIN SOURCE ----------
      *file1:
      public class tmp {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
          {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
              {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{


              }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

      }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
      }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}



      file2:
      import javax.tools.*;
      import java.io.IOException;
      import java.net.URI;
      import java.util.Arrays;

      public class Main {
          public static SimpleJavaFileObject getJavaFileContentsAsString(String s) {
              StringBuilder javaFileContents =
                      new StringBuilder(
                              "import java.sql.*; public class TestClass { static String DBUSER; static String DBPW;"
                                      + " static String DBURL; public static void main(String[] args) {"
                                      + s
                                      + "}}");
              JavaObjectFromString javaFileObject = null;
              try {
                  javaFileObject = new JavaObjectFromString("TestClass.java", javaFileContents.toString());
              } catch (Exception exception) {
                  exception.printStackTrace();
              }
              return javaFileObject;
          }
          //com.sun.tools.javac.api.JavacTaskImpl
          public static void main(String[] args){
              String s = "{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{";
              JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
              DiagnosticCollector diagnosticsCollector = new DiagnosticCollector();
              StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnosticsCollector, null, null);
              JavaFileObject javaObjectFromString = getJavaFileContentsAsString(s);
              Iterable fileObjects = Arrays.asList(javaObjectFromString);
              JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnosticsCollector, null, null, fileObjects);
              try{
                  Boolean result = task.call();
              } catch (Error e) {
                  System.out.println(e);
              }
          }
      }

      class JavaObjectFromString extends SimpleJavaFileObject {
          private String contents = null;

          public JavaObjectFromString(String className, String contents) throws Exception {
              super(new URI(className), Kind.SOURCE);
              this.contents = contents;
          }

          public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
              return contents;
          }
      }

      ---------- END SOURCE ----------

      FREQUENCY : always


        1. Main.java
          4 kB
        2. tmp.java
          2 kB

            jlahoda Jan Lahoda
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: