Console.readPassword() was failed on Linux s390x platform

Ichiroh Takiguchi takiguc at linux.vnet.ibm.com
Fri Jul 20 06:52:24 UTC 2018


Hello.

I ran ConsTestB on AdoptOpenJDK prebuilt.
===========================
$ ~/jdk8u172-b11/jre/bin/java -showversion ConsoleTestB
openjdk version "1.8.0-adoptopenjdk"
OpenJDK Runtime Environment (build 
1.8.0-adoptopenjdk-jenkins_2018_05_18_21_00-b00)
OpenJDK 64-Bit Zero VM (build 25.71-b00, interpreted mode)

echo false
true
echo true
false
$ ~/jdk-10+46/bin/java -showversion ConsoleTestB
openjdk version "10-adoptopenjdk" 2018-03-20
OpenJDK Runtime Environment (build 
10-adoptopenjdk+0-adhoc.jenkins.openjdk)
Eclipse OpenJ9 VM (build master-2954f9d4, JRE 10 Linux s390x-64 
Compressed References 20180329_15 (JIT enabled, AOT enabled)
OpenJ9   - 2954f9d4
OMR      - 963e23a2
JCL      - 5692cdfa3a based on )
...
echo false
true
echo true
false
===========================

Both build worked fine.

I applied following change.
===========================
diff -r 14708e1acdc3 src/java.base/unix/native/libjava/Console_md.c
--- a/src/java.base/unix/native/libjava/Console_md.c    Tue Jul 03 
09:27:41 2018 +0800
+++ b/src/java.base/unix/native/libjava/Console_md.c    Fri Jul 20 
15:37:59 2018 +0900
@@ -56,7 +56,7 @@
          JNU_ThrowIOExceptionWithLastError(env, "tcgetattr failed");
          return !on;
      }
-    old = (tio.c_lflag & ECHO);
+    old = (tio.c_lflag & ECHO) != 0;
      if (on) {
          tio.c_lflag |= ECHO;
      } else {
===========================

It worked fine.
===========================
$ java ConsoleTestB
...
echo false
true
echo true
false
===========================


On 2018-07-20 03:36, Xueming Shen wrote:
> Hi Ichiroh,
> 
> Does the test case always fail? how about the previous version? The
> Console class was updated slightly in 11 though.
> 
> does "old = (tio.c_lflag & ECHO) != 0" fix the issue as well?
> 
> Please file a issue with appropriate P value. Not sure if it can make 
> 11.
> 
> Thanks,
> Sherman
> 
> 
> 
> old = (tio.c_lflag & ECHO) == ECHO ? JNI_TRUE : JNI_FALSE;
> 
> On 7/19/18, 11:06 AM, Ichiroh Takiguchi wrote:
>> Hello.
>> 
>> I ran following testcase on Linux s390x platform.
>> ------
>> import java.io.Console;
>> 
>> public class ConsoleTestC {
>>   public static void main(String[] args) {
>>     Console console = System.console();
>>     char password[] = console.readPassword("password> ");
>>     System.out.println(password);
>>   }
>> }
>> ------
>> 
>> Test instruction
>> 1. Compile and run ConsoleTestC on terminal
>> $ java ConsoleTestC
>> password>
>> 2. Type "abc", then "abc" is displayed
>> 3. Type "ls", but nothing is displayed
>> 4. Type "stty echo" to change back the setting
>> 
>> I wrote following program for PD.
>> ------
>> import java.io.*;
>> import java.lang.reflect.*;
>> 
>> public class ConsoleTestB {
>>   public static void main(String[] args) throws Exception {
>>     Console console = System.console();
>>     Method echo = Console.class.getDeclaredMethod("echo", 
>> boolean.class);
>>     echo.setAccessible(true);
>>     System.out.println("echo false");
>>     System.out.println(echo.invoke(console, false));
>>     console.reader().read();
>>     System.out.println("echo true");
>>     System.out.println(echo.invoke(console, true));
>>   }
>> }
>> ------
>> 
>> Test instruction
>> 1. Compile and run ConsoleTestB on terminal
>> $ java ConsoleTestB
>> ......
>> echo false
>> false
>> 2. Last output should be "true", so Java could not read echo flag 
>> properly
>> 3. Press return key
>> echo true
>> false
>> $
>> 
>> Console.readPassword() could not read initial echo flag,
>> so move back to "-echo" instead of "echo"
>> 
>> Fix candidate is as follows:
>> ======
>> diff -r 14708e1acdc3 src/java.base/unix/native/libjava/Console_md.c
>> --- a/src/java.base/unix/native/libjava/Console_md.c    Tue Jul 03 
>> 09:27:41 2018 +0800
>> +++ b/src/java.base/unix/native/libjava/Console_md.c    Fri Jul 20 
>> 02:52:38 2018 +0900
>> @@ -56,7 +56,7 @@
>>          JNU_ThrowIOExceptionWithLastError(env, "tcgetattr failed");
>>          return !on;
>>      }
>> -    old = (tio.c_lflag & ECHO);
>> +    old = (tio.c_lflag & ECHO) == ECHO ? JNI_TRUE : JNI_FALSE;
>>      if (on) {
>>          tio.c_lflag |= ECHO;
>>      } else {
>> ======
>> 
>> I'd like to obtain a sponsor for this patch.
>> Could you put it into JDK11 ?
>> 
>> Thanks,
>> Ichiroh Takiguchi
>> IBM Japan, Ltd.
>> 



More information about the core-libs-dev mailing list