diff --git a/jdk/src/share/classes/java/sql/Date.java b/jdk/src/share/classes/java/sql/Date.java index 39cf98ce93f..7c2356e75c2 100644 --- a/jdk/src/share/classes/java/sql/Date.java +++ b/jdk/src/share/classes/java/sql/Date.java @@ -103,27 +103,46 @@ public class Date extends java.util.Date { * 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; + Date d = null; - if (s == null) throw new java.lang.IllegalArgumentException(); - - 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. *