aboutsummaryrefslogtreecommitdiff
path: root/libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx')
-rw-r--r--libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx23
1 files changed, 22 insertions, 1 deletions
diff --git a/libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx b/libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx
index dc044fd..ea83451 100644
--- a/libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx
+++ b/libxsde/xsde/cxx/serializer/validating/gmonth-day.cxx
@@ -31,7 +31,28 @@ namespace xsde
unsigned short m = value_.month ();
unsigned short d = value_.day ();
- if (m > 0 && m < 13 && d > 0 && d < 32 &&
+ // Validate day according to the XML Schema 1.1 specification:
+ //
+ // The day value must be no more than 30 if month is one of 4, 6, 9,
+ // or 11, and no more than 29 if month is 2.
+ //
+ unsigned short max_day = 31;
+ switch (m)
+ {
+ case 4:
+ case 6:
+ case 9:
+ case 11:
+ max_day = 30;
+ break;
+ case 2:
+ max_day = 29;
+ break;
+ default:
+ break;
+ }
+
+ if (m > 0 && m < 13 && d > 0 && d <= max_day &&
(!value_.zone_present () || bits::valid_time_zone (value_)))
{
#ifdef XSDE_SNPRINTF