An incomplete fix for the NPE bugs in XSSimpleTypeDecl.java
-----------------------------------------------------------

                 Key: XERCESJ-1550
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1550
             Project: Xerces2-J
          Issue Type: Bug
          Components: Other
            Reporter: Guangtai Liang
            Priority: Critical


The fix revision 318723 was aimed to remove an NPE bug on the "fPattern" in the 
method "getLexicalPatterns" of the file 
"/xerces/java/trunk/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java" , 
but it is incomplete. 
Since the "fPattern" is an class field and also could be null during the 
run-time execution, it should also be null-checked before being dereferenced in 
other methods (e.g., Line 1462 in the method " getActualValue"). 

The buggy code the proposed missing fixes should be made in is as bellows: 

 private Object getActualValue(String content, ValidationContext context, 
ValidatedInfo validatedInfo) throws InvalidDatatypeValueException{

        if (fVariety == VARIETY_ATOMIC) {

            String nvalue; 
            if (context==null ||context.needToNormalize()) {
                nvalue = normalize(content, fWhiteSpace);
            } else {
                nvalue = content;
            }

            // update normalized value
            validatedInfo.normalizedValue = nvalue;

            // validate special kinds of token, in place of old pattern matching
            if (fPatternType != SPECIAL_PATTERN_NONE) {

                boolean seenErr = false;
                if (fPatternType == SPECIAL_PATTERN_NMTOKEN) {
                    // PATTERN "\\c+"
                    seenErr = !XMLChar.isValidNmtoken(nvalue);
                }
                else if (fPatternType == SPECIAL_PATTERN_NAME) {
                    // PATTERN "\\i\\c*"
                    seenErr = !XMLChar.isValidName(nvalue);
                }
                else if (fPatternType == SPECIAL_PATTERN_NCNAME) {
                    // PATTERN "[\\i-[:]][\\c-[:]]*"
                    seenErr = !XMLChar.isValidNCName(nvalue);
                }
                else if (fPatternType == SPECIAL_PATTERN_INTEGER) {
                    // REVISIT: the pattern is not published yet
                    // we only need to worry about the period '.'
                    // other parts are taken care of by the DecimalDV
                    seenErr = nvalue.indexOf('.') >= 0;
                }
                if (seenErr) {
                    throw new 
InvalidDatatypeValueException("cvc-datatype-valid.1.2.1",
                                                            new 
Object[]{nvalue, SPECIAL_PATTERN_STRING[fPatternType]});
                }
            }

            if ( (fFacetsDefined & FACET_PATTERN ) != 0 ) {
                RegularExpression regex;
[Line 1462]   for (int idx = fPattern.size()-1; idx >= 0; idx--) {
                    regex = (RegularExpression)fPattern.elementAt(idx);
                    if (!regex.matches(nvalue)){
                        throw new 
InvalidDatatypeValueException("cvc-pattern-valid",
                                                                new 
Object[]{content, regex});
                    }
                }
            }

            Object avalue = fDVs[fValidationDV].getActualValue(nvalue, context);

            validatedInfo.actualValue = avalue;

            return avalue;

        } else if (fVariety == VARIETY_LIST) {

            String nvalue; 
            if (context==null ||context.needToNormalize()) {
                nvalue = normalize(content, fWhiteSpace);
            } else {
                nvalue = content;
            }

            StringTokenizer parsedList = new StringTokenizer(nvalue);
            int countOfTokens = parsedList.countTokens() ;
            Object[] avalue = new Object[countOfTokens];
            XSSimpleTypeDecl[] memberTypes = new 
XSSimpleTypeDecl[countOfTokens];
            for(int i = 0 ; i < countOfTokens ; i ++){
                // we can't call fItemType.validate(), otherwise 
checkExtraRules()
                // will be called twice: once in fItemType.validate, once in
                // validate method of this type.
                // so we take two steps to get the actual value:
                // 1. fItemType.getActualValue()
                // 2. fItemType.chekcFacets()
                avalue[i] = fItemType.getActualValue(parsedList.nextToken(), 
context, validatedInfo);
                if (context.needFacetChecking() &&
                    (fItemType.fFacetsDefined != 0 && fItemType.fFacetsDefined 
!= FACET_WHITESPACE)) {
                    fItemType.checkFacets(validatedInfo);
                }
                memberTypes[i] = (XSSimpleTypeDecl)validatedInfo.memberType;
            }

            validatedInfo.actualValue = avalue;
            validatedInfo.memberType = null;
            validatedInfo.memberTypes = memberTypes;
            validatedInfo.normalizedValue = nvalue;
  
            return avalue;

        } else { // (fVariety == VARIETY_UNION)
            for(int i = 0 ; i < fMemberTypes.length; i++) {
                try {
                    // we can't call fMemberType[i].validate(), otherwise 
checkExtraRules()
                    // will be called twice: once in fMemberType[i].validate, 
once in
                    // validate method of this type.
                    // so we take two steps to get the actual value:
                    // 1. fMemberType[i].getActualValue()
                    // 2. fMemberType[i].chekcFacets()
                    Object aValue = fMemberTypes[i].getActualValue(content, 
context, validatedInfo);
                    if (context.needFacetChecking() &&
                        (fMemberTypes[i].fFacetsDefined != 0 && 
fMemberTypes[i].fFacetsDefined != FACET_WHITESPACE)) {
                        fMemberTypes[i].checkFacets(validatedInfo);
                    }
                    validatedInfo.memberType = fMemberTypes[i];
                    return aValue;
                } catch(InvalidDatatypeValueException invalidValue) {
                }
            }

            throw new InvalidDatatypeValueException("cvc-datatype-valid.1.2.2",
                                                    new Object[]{content, 
fTypeName});
        }

    }//getActualValue()

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to