From 62481f34014630323c452cb845aceea12affc2ac Mon Sep 17 00:00:00 2001
From: Alberto Massari <amassari@apache.org>
Date: Tue, 28 Sep 2010 18:33:53 +0000
Subject: [PATCH] Normalize the attribute values before collapsing whitespace,
 or the special characters used to signal the usage of an entity reference
 inside an attribute value will remain in the value of xsi:type and xsi:nill
 (XERCESC-1945)

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@1002312 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/internal/IGXMLScanner2.cpp           | 11 +++++++----
 src/xercesc/internal/SGXMLScanner.cpp            | 11 +++++++----
 .../XSTSHarness/regression/XERCESC-1945/test.xml |  7 +++++++
 .../XSTSHarness/regression/XERCESC-1945/test.xsd |  9 +++++++++
 tests/src/XSTSHarness/regression/Xerces.testSet  | 16 ++++++++++++++++
 5 files changed, 46 insertions(+), 8 deletions(-)
 create mode 100644 tests/src/XSTSHarness/regression/XERCESC-1945/test.xml
 create mode 100644 tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd

diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index 29cb7b7ca..cdd931be1 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -1697,7 +1697,8 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
 
                             // normalize the attribute according to schema whitespace facet
                             DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME);
-                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true);
+                            normalizeAttRawValue(SchemaSymbols::fgXSI_TYPE, valuePtr, fXsiType);
+                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiType.getRawBuffer(), fXsiType, true);
                             if (!fXsiType.isEmpty()) {
                                 int colonPos = -1;
                                 unsigned int uriId = resolveQName (
@@ -1712,16 +1713,18 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
                         else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
                         {
                             // normalize the attribute according to schema whitespace facet
-                            XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer();
+                            XMLBufBid bbXsi(&fBufMgr);
+                            XMLBuffer& fXsiNil = bbXsi.getBuffer();
+
                             DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN);
-                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true);
+                            normalizeAttRawValue(SchemaSymbols::fgATT_NILL, valuePtr, fXsiNil);
+                            ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiNil.getRawBuffer(), fXsiNil, true);
                             if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE))
                                 ((SchemaValidator*)fValidator)->setNillable(true);
                             else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE))
                                 ((SchemaValidator*)fValidator)->setNillable(false);
                             else
                                 emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr);
-                            fBufMgr.releaseBuffer(fXsiNil);
                         }
                     }
                 }
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index f16414e8e..35c089b6e 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -3524,7 +3524,8 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
 
                         // normalize the attribute according to schema whitespace facet
                         DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_QNAME);
-                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiType, true);
+                        normalizeAttRawValue(SchemaSymbols::fgXSI_TYPE, valuePtr, fXsiType);
+                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiType.getRawBuffer(), fXsiType, true);
                         if (!fXsiType.isEmpty()) {
                             int colonPos = -1;
                             unsigned int uriId = resolveQName (
@@ -3539,16 +3540,18 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
                     else if (XMLString::equals(suffPtr, SchemaSymbols::fgATT_NILL))
                     {
                         // normalize the attribute according to schema whitespace facet
-                        XMLBuffer& fXsiNil = fBufMgr.bidOnBuffer();
+                        XMLBufBid bbXsi(&fBufMgr);
+                        XMLBuffer& fXsiNil = bbXsi.getBuffer();
+
                         DatatypeValidator* tempDV = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_BOOLEAN);
-                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, valuePtr, fXsiNil, true);
+                        normalizeAttRawValue(SchemaSymbols::fgATT_NILL, valuePtr, fXsiNil);
+                        ((SchemaValidator*) fValidator)->normalizeWhiteSpace(tempDV, fXsiNil.getRawBuffer(), fXsiNil, true);
                         if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_TRUE))
                             ((SchemaValidator*)fValidator)->setNillable(true);
                         else if(XMLString::equals(fXsiNil.getRawBuffer(), SchemaSymbols::fgATTVAL_FALSE))
                             ((SchemaValidator*)fValidator)->setNillable(false);
                         else
                             emitError(XMLErrs::InvalidAttValue, fXsiNil.getRawBuffer(), valuePtr);
-                        fBufMgr.releaseBuffer(fXsiNil);
                     }
                 }
             }
diff --git a/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml
new file mode 100644
index 000000000..df5e3ff94
--- /dev/null
+++ b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<p xsi:type="&#10;&#9;Person&#13;" 
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+   xsi:noNamespaceSchemaLocation="test.xsd">
+   <name>John Doe</name>
+</p>
+
diff --git a/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd
new file mode 100644
index 000000000..24b5b5578
--- /dev/null
+++ b/tests/src/XSTSHarness/regression/XERCESC-1945/test.xsd
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+	<xsd:complexType name="Person">
+		<xsd:sequence>
+			<xsd:element name="name"/>
+		</xsd:sequence>
+	</xsd:complexType>
+</xsd:schema>
+
diff --git a/tests/src/XSTSHarness/regression/Xerces.testSet b/tests/src/XSTSHarness/regression/Xerces.testSet
index beb9616a9..88e468082 100644
--- a/tests/src/XSTSHarness/regression/Xerces.testSet
+++ b/tests/src/XSTSHarness/regression/Xerces.testSet
@@ -826,4 +826,20 @@
       <current status="accepted" date="2010-08-09"/>
     </instanceTest>
   </testGroup>
+  <testGroup name="XERCESC-1945">
+    <annotation>
+      <documentation>Whitespace in xsi:type</documentation>
+    </annotation>
+    <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-1945"/>
+    <schemaTest name="XERCESC-1945-1">
+      <schemaDocument xlink:href="./XERCESC-1945/test.xsd"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2010-09-28"/>
+    </schemaTest>
+    <instanceTest name="XERCESC-1945-2">
+      <instanceDocument xlink:href="./XERCESC-1945/test.xml"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2010-09-28"/>
+    </instanceTest>
+  </testGroup>
 </testSet>
-- 
GitLab