Blocks :
|
|
Duplicate :
|
|
Relates :
|
JDK-8171319 introduced the following code: private String withWeak(PublicKey key) { if (DISABLED_CHECK.permits(SIG_PRIMITIVE_SET, key)) { return String.format(rb.getString("key.bit"), KeyUtil.getKeySize(key), key.getAlgorithm()); } else { return String.format(rb.getString("key.bit.weak"), KeyUtil.getKeySize(key), key.getAlgorithm()); } } That is the format is determined by rb.getString("key.bit.weak") or rb.getString("key.bit"). For example for -Duser.language=en, these formats are: %d-bit %s key and %d-bit %s key (weak) Thus, in English this expects an integer as first argument and a String as the second. In some languages however, the formats returned by rb.getString("key.bit.weak") and rb.getString("key.bit") return different format strings: E.g. String and then Integer in French or Spanish. Attached is a simple reproducer. It fails with -Duser.language=es with: $ javac TestKeyTool $ java -Duser.language=es TestKeyTool DEBUG: Format is: Clave %s de %d bits (d��bil) Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.String at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302) at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793) at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747) at java.util.Formatter.format(Formatter.java:2520) at java.util.Formatter.format(Formatter.java:2455) at java.lang.String.format(String.java:2940) at TestKeyTool.main(TestKeyTool.java:11) Expected: Ordering of format is the same as in English: Integer then String. For example in English the reproducer prints: $ java -Duser.language=en TestKeyTool DEBUG: Format is: %d-bit %s key (weak) 23-bit foo key (weak) DEBUG: Format is: %d-bit %s key 23-bit foo key
|