8194879: Runtime.Version parses string which does not conform to spec without throwing IAE
Reviewed-by: alanb, iris, rriggs
--- a/src/java.base/share/classes/java/lang/Runtime.java Wed Jan 17 15:17:50 2018 -0800
+++ b/src/java.base/share/classes/java/lang/Runtime.java Wed Jan 17 16:15:15 2018 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1099,16 +1099,23 @@
m.group(VersionPattern.OPT_GROUP));
// empty '+'
- if ((m.group(VersionPattern.PLUS_GROUP) != null)
- && !build.isPresent()) {
- if (optional.isPresent()) {
- if (pre.isPresent())
- throw new IllegalArgumentException("'+' found with"
- + " pre-release and optional components:'" + s
- + "'");
+ if (!build.isPresent()) {
+ if (m.group(VersionPattern.PLUS_GROUP) != null) {
+ if (optional.isPresent()) {
+ if (pre.isPresent())
+ throw new IllegalArgumentException("'+' found with"
+ + " pre-release and optional components:'" + s
+ + "'");
+ } else {
+ throw new IllegalArgumentException("'+' found with neither"
+ + " build or optional components: '" + s + "'");
+ }
} else {
- throw new IllegalArgumentException("'+' found with neither"
- + " build or optional components: '" + s + "'");
+ if (optional.isPresent() && !pre.isPresent()) {
+ throw new IllegalArgumentException("optional component"
+ + " must be preceeded by a pre-release component"
+ + " or '+': '" + s + "'");
+ }
}
}
return new Version(List.of(version), pre, build, optional);
--- a/test/jdk/java/lang/Runtime/Version/Basic.java Wed Jan 17 15:17:50 2018 -0800
+++ b/test/jdk/java/lang/Runtime/Version/Basic.java Wed Jan 17 16:15:15 2018 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,7 @@
/*
* @test
* @summary Unit test for java.lang.Runtime.Version
- * @bug 8072379 8144062 8161236 8160956
+ * @bug 8072379 8144062 8161236 8160956 8194879
*/
import java.lang.Runtime.Version;
@@ -115,6 +115,7 @@
tryCatch("9-pre+-opt", IAE);
tryCatch("1.4142+-", IAE);
tryCatch("2.9979+-%", IAE);
+ tryCatch("10--ea", IAE);
//// Test for Runtime.version()
testVersion();