6898593: java.sql.Date.valueOf no exception if date given is not in the JDBC date escape syntax
Reviewed-by: minqi
--- a/jdk/src/share/classes/java/sql/Date.java Fri Aug 06 11:07:16 2010 -0700
+++ b/jdk/src/share/classes/java/sql/Date.java Tue Aug 10 10:07:33 2010 -0400
@@ -103,27 +103,46 @@
* JDBC date escape format (yyyy-mm-dd)
*/
public static Date valueOf(String s) {
- int year;
- int month;
- int day;
+ final int YEAR_LENGTH = 4;
+ final int MONTH_LENGTH = 2;
+ final int DAY_LENGTH = 2;
+ final int MAX_MONTH = 12;
+ final int MAX_DAY = 31;
int firstDash;
int secondDash;
-
- if (s == null) throw new java.lang.IllegalArgumentException();
+ Date d = null;
- firstDash = s.indexOf('-');
- secondDash = s.indexOf('-', firstDash+1);
- if ((firstDash > 0) & (secondDash > 0) & (secondDash < s.length()-1)) {
- year = Integer.parseInt(s.substring(0, firstDash)) - 1900;
- month = Integer.parseInt(s.substring(firstDash+1, secondDash)) - 1;
- day = Integer.parseInt(s.substring(secondDash+1));
- } else {
+ if (s == null) {
throw new java.lang.IllegalArgumentException();
}
- return new Date(year, month, day);
+ firstDash = s.indexOf('-');
+ secondDash = s.indexOf('-', firstDash + 1);
+
+ if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length() - 1)) {
+ String yyyy = s.substring(0, firstDash);
+ String mm = s.substring(firstDash + 1, secondDash);
+ String dd = s.substring(secondDash + 1);
+ if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH &&
+ dd.length() == DAY_LENGTH) {
+ int year = Integer.parseInt(yyyy);
+ int month = Integer.parseInt(mm);
+ int day = Integer.parseInt(dd);
+
+ if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {
+ d = new Date(year - 1900, month - 1, day);
+ }
+ }
+ }
+ if (d == null) {
+ throw new java.lang.IllegalArgumentException();
+ }
+
+ return d;
+
}
+
/**
* Formats a date in the date escape format yyyy-mm-dd.
* <P>