This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch xerces-3.3
in repository https://gitbox.apache.org/repos/asf/xerces-c.git
The following commit(s) were added to refs/heads/xerces-3.3 by this push:
new 9ca9ee820 XERCESC-2266 - Bugs in grammar deserialization from cache
9ca9ee820 is described below
commit 9ca9ee820dbf12ded5da15411742d41ba80a8cdb
Author: Scott Cantor <[email protected]>
AuthorDate: Thu Aug 13 12:42:30 2026 -0400
XERCESC-2266 - Bugs in grammar deserialization from cache
https://issues.apache.org/jira/browse/XERCESC-2266
---
src/xercesc/internal/XSerializeEngine.cpp | 152 ++++++++++++++++++------------
1 file changed, 91 insertions(+), 61 deletions(-)
diff --git a/src/xercesc/internal/XSerializeEngine.cpp
b/src/xercesc/internal/XSerializeEngine.cpp
index 5804bb09b..e61dbb9b4 100644
--- a/src/xercesc/internal/XSerializeEngine.cpp
+++ b/src/xercesc/internal/XSerializeEngine.cpp
@@ -158,27 +158,27 @@ void XSerializeEngine::write(XSerializable* const
objectToWrite)
XSerializedObjectId_t objIndex = 0;
- if (!objectToWrite) // null pointer
- {
- *this << fgNullObjectTag;
- }
+ if (!objectToWrite) // null pointer
+ {
+ *this << fgNullObjectTag;
+ }
else if (0 != (objIndex = lookupStorePool((void*) objectToWrite)))
- {
+ {
// writing an object reference tag
*this << objIndex;
- }
- else
- {
- // write protoType first
- XProtoType* protoType = objectToWrite->getProtoType();
- write(protoType);
-
- // put the object into StorePool
+ }
+ else
+ {
+ // write protoType first
+ XProtoType* protoType = objectToWrite->getProtoType();
+ write(protoType);
+
+ // put the object into StorePool
addStorePool((void*)objectToWrite);
// ask the object to serialize itself
- objectToWrite->serialize(*this);
- }
+ objectToWrite->serialize(*this);
+ }
}
@@ -187,20 +187,20 @@ void XSerializeEngine::write(XProtoType* const protoType)
ensureStoring();
ensurePointer(protoType);
- XSerializedObjectId_t objIndex = lookupStorePool((void*)protoType);
+ XSerializedObjectId_t objIndex = lookupStorePool((void*)protoType);
if (objIndex)
{
//protoType seen in the store pool
*this << (fgClassMask | objIndex);
- }
- else
- {
- // store protoType
- *this << fgNewClassTag;
- protoType->store(*this);
+ }
+ else
+ {
+ // store protoType
+ *this << fgNewClassTag;
+ protoType->store(*this);
addStorePool((void*)protoType);
- }
+ }
}
@@ -329,32 +329,50 @@ XSerializable* XSerializeEngine::read(XProtoType* const
protoType)
ensureLoading();
ensurePointer(protoType);
- XSerializedObjectId_t objectTag;
- XSerializable* objRet;
+ XSerializedObjectId_t objectTag;
+ XSerializable* objRet;
if (! read(protoType, &objectTag))
- {
+ {
/***
* We hava a reference to an existing object in
* load pool, get it.
*/
objRet = lookupLoadPool(objectTag);
- }
- else
- {
- // create the object from the prototype
- objRet = protoType->fCreateObject(getMemoryManager());
+
+ // Check that provided type matches type in cache.
+ if (objRet && (objRet->getProtoType() != protoType))
+ {
+ XMLCh expected[256];
+ XMLCh actual[256];
+ XMLCh* tmp = XMLString::transcode((char*)protoType->fClassName,
getMemoryManager());
+ XMLString::copyNString(expected, tmp, 255);
+ getMemoryManager()->deallocate(tmp);
+ tmp =
XMLString::transcode((char*)objRet->getProtoType()->fClassName,
getMemoryManager());
+ XMLString::copyNString(actual, tmp, 255);
+ getMemoryManager()->deallocate(tmp);
+ ThrowXMLwithMemMgr2(XSerializationException
+ , XMLExcepts::XSer_ProtoType_Name_Dif
+ , actual
+ , expected
+ , getMemoryManager());
+ }
+ }
+ else
+ {
+ // create the object from the prototype
+ objRet = protoType->fCreateObject(getMemoryManager());
Assert((objRet != 0), XMLExcepts::XSer_CreateObject_Fail);
// put it into load pool
addLoadPool(objRet);
// de-serialize it
- objRet->serialize(*this);
+ objRet->serialize(*this);
- }
+ }
- return objRet;
+ return objRet;
}
bool XSerializeEngine::read(XProtoType* const protoType
@@ -363,29 +381,29 @@ bool XSerializeEngine::read(XProtoType* const
protoType
ensureLoading();
ensurePointer(protoType);
- XSerializedObjectId_t obTag;
+ XSerializedObjectId_t obTag;
*this >> obTag;
// object reference tag found
if (!(obTag & fgClassMask))
- {
- *objectTagRet = obTag;
- return false;
- }
+ {
+ *objectTagRet = obTag;
+ return false;
+ }
- if (obTag == fgNewClassTag)
- {
+ if (obTag == fgNewClassTag)
+ {
// what follows fgNewClassTag is the prototype object info
// for the object anticipated, go and verify the info
XProtoType::load(*this, protoType->fClassName, getMemoryManager());
addLoadPool((void*)protoType);
- }
- else
- {
+ }
+ else
+ {
// what follows class tag is an XSerializable object
- XSerializedObjectId_t classIndex = (obTag & ~fgClassMask);
+ XSerializedObjectId_t classIndex = (obTag & ~fgClassMask);
XSerializedObjectId_t loadPoolSize =
(XSerializedObjectId_t)fLoadPool->size();
if ((classIndex == 0 ) || (classIndex > loadPoolSize))
@@ -404,7 +422,7 @@ bool XSerializeEngine::read(XProtoType* const
protoType
ensurePointer(lookupLoadPool(classIndex));
}
- return true;
+ return true;
}
void XSerializeEngine::read(XMLCh* const toRead
@@ -515,6 +533,12 @@ void XSerializeEngine::readString(XMLCh*& toRead
dataLen = bufferLen++;
}
+ TEST_THROW_ARG2( (dataLen >= bufferLen)
+ , dataLen
+ , bufferLen
+ , XMLExcepts::XSer_LoadBuffer_Violation
+ )
+
toRead = (XMLCh*) getMemoryManager()->allocate(bufferLen * sizeof(XMLCh));
read(toRead, dataLen);
toRead[dataLen] = 0;
@@ -549,6 +573,12 @@ void XSerializeEngine::readString(XMLByte*& toRead
dataLen = bufferLen++;
}
+ TEST_THROW_ARG2( (dataLen >= bufferLen)
+ , dataLen
+ , bufferLen
+ , XMLExcepts::XSer_LoadBuffer_Violation
+ )
+
toRead = (XMLByte*) getMemoryManager()->allocate(bufferLen *
sizeof(XMLByte));
read(toRead, dataLen);
toRead[dataLen] = 0;
@@ -1050,23 +1080,23 @@ bool XSerializeEngine::needToStoreObject(void* const
templateObjectToWrite)
XSerializedObjectId_t objIndex = 0;
- if (!templateObjectToWrite)
- {
- *this << fgNullObjectTag; // null pointer
+ if (!templateObjectToWrite)
+ {
+ *this << fgNullObjectTag; // null pointer
return false;
- }
+ }
else if (0 != (objIndex = lookupStorePool(templateObjectToWrite)))
- {
+ {
*this << objIndex; // write an object reference tag
return false;
- }
- else
- {
+ }
+ else
+ {
*this << fgTemplateObjTag; // write fgTemplateObjTag to
denote that actual
// template object follows
addStorePool(templateObjectToWrite); // put the address into StorePool
return true;
- }
+ }
}
@@ -1074,12 +1104,12 @@ bool XSerializeEngine::needToLoadObject(void**
templateObjectToRead)
{
ensureLoading();
- XSerializedObjectId_t obTag;
+ XSerializedObjectId_t obTag;
*this >> obTag;
- if (obTag == fgTemplateObjTag)
- {
+ if (obTag == fgTemplateObjTag)
+ {
/***
* what follows fgTemplateObjTag is the actual template object
* We need the client application to create a template object
@@ -1087,9 +1117,9 @@ bool XSerializeEngine::needToLoadObject(void**
templateObjectToRead)
* template object
***/
return true;
- }
- else
- {
+ }
+ else
+ {
/***
* We hava a reference to an existing template object, get it.
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]