8186098: sun/security/pkcs11/KeyStore/SecretKeysBasic.sh failed due to libnss3 version cannot be parsed
authorjjiang
Wed, 24 Jan 2018 23:01:57 -0800
changeset 48665 257d7610663f
parent 48664 ed014587f0e2
child 48666 d626620a1844
8186098: sun/security/pkcs11/KeyStore/SecretKeysBasic.sh failed due to libnss3 version cannot be parsed Summary: Improves the approach on parsing lib version Reviewed-by: weijun, xuelei
test/jdk/sun/security/pkcs11/PKCS11Test.java
--- a/test/jdk/sun/security/pkcs11/PKCS11Test.java	Thu Jan 25 14:12:43 2018 +0800
+++ b/test/jdk/sun/security/pkcs11/PKCS11Test.java	Wed Jan 24 23:01:57 2018 -0800
@@ -31,6 +31,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
 import java.security.AlgorithmParameters;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.KeyPairGenerator;
@@ -387,6 +388,11 @@
         getNSSInfo(nss_library);
     }
 
+    // Try to parse the version for the specified library.
+    // Assuming the library contains either of the following patterns:
+    // $Header: NSS <version>
+    // Version: NSS <version>
+    // Here, <version> stands for NSS version.
     static double getNSSInfo(String library) {
         // look for two types of headers in NSS libraries
         String nssHeader1 = "$Header: NSS";
@@ -417,7 +423,7 @@
                         read = 100 + is.read(data, 100, 900);
                     }
 
-                    s = new String(data, 0, read);
+                    s = new String(data, 0, read, StandardCharsets.US_ASCII);
                     i = s.indexOf(nssHeader1);
                     if (i > 0 || (i = s.indexOf(nssHeader2)) > 0) {
                         found = true;
@@ -443,18 +449,13 @@
 
         // the index after whitespace after nssHeader
         int afterheader = s.indexOf("NSS", i) + 4;
-        int nextSpaceIndex = s.indexOf(' ', afterheader);
-
-        // If the next space is not found,
-        // it has to print the content for further investigation.
-        if (nextSpaceIndex == -1) {
-            System.out.println("===== Content start =====");
-            System.out.println(s);
-            System.out.println("===== Content end =====");
+        String version = String.valueOf(s.charAt(afterheader));
+        for (char c = s.charAt(++afterheader);
+                c == '.' || (c >= '0' && c <= '9');
+                c = s.charAt(++afterheader)) {
+            version += c;
         }
 
-        String version = s.substring(afterheader, nextSpaceIndex);
-
         // If a "dot dot" release, strip the extra dots for double parsing
         String[] dot = version.split("\\.");
         if (dot.length > 2) {
@@ -468,6 +469,9 @@
         try {
             nss_version = Double.parseDouble(version);
         } catch (NumberFormatException e) {
+            System.out.println("===== Content start =====");
+            System.out.println(s);
+            System.out.println("===== Content end =====");
             System.out.println("Failed to parse lib" + library +
                     " version. Set to 0.0");
             e.printStackTrace();