org.apache.xerces.impl.dv.xs.AbstractDateTimeDV.getDate() wrongly validates 
xsd:dateTime data 2007-02-201T11:01:53.111Z
-----------------------------------------------------------------------------------------------------------------------

                 Key: XERCESJ-1271
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1271
             Project: Xerces2-J
          Issue Type: Bug
          Components: XML Schema Datatypes
         Environment: All
            Reporter: Rajeev Misra


ISO Standards says that xsd:dateTime should be in the form of

  [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]

There is a bug in the implementation of 
org.collaxa.thirdparty.apache.xerces.impl.dv.xs.AbstractDateTimeDV.getDate(String
 buffer, int start, int end, int[] date) method which parses
 2007-02-201T11:01:53.111Z and validates it as a valid xsd:dateTime.

>From  DateTimeDV.parse()  we pass 2007-02-201T11:01:53.111Z in buffer and 
>"end" is index of 'T' which is 11, and start =0 to 
>AbstractDateTimeDV.getDate() function.

Now in getDate() we assume that Date is either in form "-CCYY-MM-DD" or in form 
of "CCYY-MM-DD", This assumption allows getDate() method to parse 
2007-02-201T11:01:53.111Z and return  2007-02-20,  and 2007-02-20 is valid  
date, but  2007-02-201T11:01:53.111Z is not a valid (2007-02-201 is not valid
 date) xsd:dateTime. As per standard '2007-02-201T' is invalid data, we can 
have only two char 'DD' just before 'T' and after CCYY-MM-.
 
Right now in code we are ignoring all data that comes after CCYY-MM-DD and 
before 'T' because we have already assumed that user is passing 2 char DD data 
just before 'T' and after CCYY-MM- which is not true,
 
 This means 2007-02-201T11:01:53.111Z, or "2007-02-2011111T11:01:53.111Z", or 
"2007-02-20garbagedataT11:01:53.111Z" (all invalid xsd:dateTime) are parsed
 as 2007-02-20 and accepted as valid xsd:dateTime.

-----------------------------------------------------------------------------------------------------

Solution is simple, we should check if "stop" variable and "end" are pointing 
to index of 'T' or not. ie.

Change the implementation as
------------------------------------------
        protected int getDate (String buffer, int start, int end, DateTimeData 
date) throws RuntimeException{
                
                start = getYearMonth(buffer, start, end, date);
                
                if (buffer.charAt(start++) !='-') {
                        throw new RuntimeException("CCYY-MM must be followed by 
'-' sign");
                }
                int stop = start + 2;
                /* proposed change to invalidate  2007-02-201T11:01:53.111Z  
and similar invalide xsd:dateTime*/
                if( end != stop)
                {
                        throw new RuntimeException("CCYY-MM-DDT must have 2 
char DD");
                }
                date.day=parseInt(buffer, start, stop);
                return stop;
        }
----------------------------------------------------------

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to