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

JLine update to System.console interferes with existing Java SignalHandler

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: P4 P4
    • 25
    • None
    • core-libs
    • None
    • b08
    • 22

      Handling a signal using `jdk.unsupported/share/classes/sun/misc/SignalHandler.java` is failing since `22+b08`.

      Looks like it was the change:
      8308591: JLine as the default Console provider

      JLine uses Signal.
      Running with -Djdk.console=java.base does restore the old working signal behaviour.

      ### Reproduction

      ```
      $ cat Jdk8346805_SignalHandlerJLineTest.java
      import sun.misc.Signal;
      public final class Jdk8346805_SignalHandlerJLineTest {
          public static void main(String[] args) throws java.io.IOException {
              Signal.handle(new Signal("INT"), signal -> System.out.format("[%s]", signal));
              while (true) { if ("x".equals(System.console().readLine())) { break; } }
          }
      }

      $ ~/oracle/jdk-22.0.2/bin/java Jdk8346805_SignalHandlerJLineTest.java
      asd
      foo
      ff
      [PRESSING CTRL+C AT THIS POINT]
      Exception in thread "main" jdk.internal.org.jline.reader.UserInterruptException
      at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:717)
      at jdk.internal.le/jdk.internal.org.jline.reader.impl.LineReaderImpl.readLine(LineReaderImpl.java:468)
      at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:98)
      at jdk.internal.le/jdk.internal.org.jline.JdkConsoleProviderImpl$JdkConsoleImpl.readLine(JdkConsoleProviderImpl.java:106)
      at java.base/java.io.ProxyingConsole.readLine(ProxyingConsole.java:122)
      at Jdk8346805_SignalHandlerJLineTest.main(Jdk8346805_SignalHandlerJLineTest.java:5)

      $ ~/oracle/jdk-22.0.2/bin/java -Djdk.console=java.base Jdk8346805_SignalHandlerJLineTest.java
      asd
      foo
      ^C[SIGINT]

      ^C[SIGINT]

      x
      ```

      A command-line app that reads the terminal is likely to have found System.console() useful, and is also likely to be the kind of app that found this way of installing a SignalHandler to protect itself from accidental control-C killing the app.

            jlahoda Jan Lahoda
            kevinw Kevin Walls
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: