8250678: ModuleDescriptor.Version parsing treats empty segments inconsistently
yano-masanori at fujitsu.com
yano-masanori at fujitsu.com
Wed Nov 4 09:03:21 UTC 2020
Hello.
I would like to contribute for JDK-8250678.
The 'parse' method of ModuleDescriptor.Version class behaves incorrectly
when the input string contains consecutive delimiters.
The 'parse' method treats strings as three sections, but the parsing method
differs between the method for the version sections and the ones for others.
In version sections, the 'parse' method takes a single character in a loop and
determines whether it is a delimiter. In pre and build sections, the parse method
takes two characters in a loop and determines whether the second character is the delimiter.
Therefore, if the string contains a sequence of delimiters in pre or build section,
the 'parse' method treats character at the odd-numbered position as a token and
the one at even-numbered as a delimiter
A string containing consecutive delimiters is an incorrect version string,
but this behavior does not follow the API specification.
https://download.java.net/java/early_access/jdk16/docs/api/java.base/java/lang/module/ModuleDescriptor.Version.html
Therefore, I propose to fix the parsing method of the pre section and
the build section in the same way as the version.
Please sponsor the following change.
diff -r bdc20ee1a68d src/java.base/share/classes/java/lang/module/ModuleDescriptor.java
--- a/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java Fri Sep 04 23:51:26 2020 -0400
+++ b/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java Wed Oct 28 17:06:47 2020 +0900
@@ -1053,13 +1053,6 @@
while (i < n) {
c = v.charAt(i);
- if (c >= '0' && c <= '9')
- i = takeNumber(v, i, pre);
- else
- i = takeString(v, i, pre);
- if (i >= n)
- break;
- c = v.charAt(i);
if (c == '.' || c == '-') {
i++;
continue;
@@ -1068,6 +1061,10 @@
i++;
break;
}
+ if (c >= '0' && c <= '9')
+ i = takeNumber(v, i, pre);
+ else
+ i = takeString(v, i, pre);
}
if (c == '+' && i >= n)
@@ -1075,17 +1072,14 @@
while (i < n) {
c = v.charAt(i);
+ if (c == '.' || c == '-' || c == '+') {
+ i++;
+ continue;
+ }
if (c >= '0' && c <= '9')
i = takeNumber(v, i, build);
else
i = takeString(v, i, build);
- if (i >= n)
- break;
- c = v.charAt(i);
- if (c == '.' || c == '-' || c == '+') {
- i++;
- continue;
- }
}
this.version = v;
diff -r bdc20ee1a68d test/jdk/java/lang/module/VersionTest.java
--- a/test/jdk/java/lang/module/VersionTest.java Fri Sep 04 23:51:26 2020 -0400
+++ b/test/jdk/java/lang/module/VersionTest.java Wed Oct 28 17:06:47 2020 +0900
@@ -148,6 +148,8 @@
{ "1", "1.0.0" },
{ "1.0", "1.0.0" },
{ "1.0-beta", "1.0.0-beta" },
+ { "1.0-1.1", "1.0-1..1" },
+ { "1.0-1+1", "1.0-1.+1" },
};
}
Regards,
Masanori Yano
More information about the core-libs-dev
mailing list