You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by su...@apache.org on 2004/03/31 15:50:00 UTC
cvs commit: ws-axis/c/src/soap SoapParserExpat.cpp SoapDeSerializer.cpp
susantha 2004/03/31 05:50:00
Modified: c/src/soap SoapParserExpat.cpp SoapDeSerializer.cpp
Log:
Fixed the server crash when there is no data in the transport
Revision Changes Path
1.12 +2 -2 ws-axis/c/src/soap/SoapParserExpat.cpp
Index: SoapParserExpat.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/soap/SoapParserExpat.cpp,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- SoapParserExpat.cpp 29 Mar 2004 11:29:55 -0000 1.11
+++ SoapParserExpat.cpp 31 Mar 2004 13:50:00 -0000 1.12
@@ -183,7 +183,7 @@
if (m_Events.empty())
{
nStatus = ParseNext();
- if (TRANSPORT_FAILED == nStatus) return NULL;
+ if ((TRANSPORT_FAILED == nStatus) || (TRANSPORT_FINISHED == nStatus)) return NULL;
if (AXIS_FAIL == m_nStatus) return NULL;
}
@@ -196,7 +196,7 @@
{
m_Events.push(m_pLastEvent);
nStatus = ParseNext();
- if (TRANSPORT_FAILED == nStatus) return NULL;
+ if ((TRANSPORT_FAILED == nStatus) || (TRANSPORT_FINISHED == nStatus)) return NULL;
}
else
{
1.35 +95 -5 ws-axis/c/src/soap/SoapDeSerializer.cpp
Index: SoapDeSerializer.cpp
===================================================================
RCS file: /home/cvs/ws-axis/c/src/soap/SoapDeSerializer.cpp,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- SoapDeSerializer.cpp 31 Mar 2004 12:34:19 -0000 1.34
+++ SoapDeSerializer.cpp 31 Mar 2004 13:50:00 -0000 1.35
@@ -77,6 +77,8 @@
#include <axis/server/GDefine.h>
#include <axis/server/Packet.h>
#include <axis/server/AxisTrace.h>
+#include "apr_base64.h"
+#include "HexCoder.h"
#ifdef USE_EXPAT_PARSER
@@ -201,7 +203,11 @@
while (blnConStatus) {
m_pNode = m_pParser->Next();
-
+ if (!m_pNode)
+ {
+ m_nStatus = AXIS_FAIL;
+ return m_nStatus;
+ }
if ((END_ELEMENT == m_pNode->m_type) && (0 == strcmp(m_pNode->m_pchNameOrValue, SoapKeywordMapping::Map(m_nSoapVersion).pchWords[SKW_HEADER]))) {
m_pNode = NULL; /*This is to indicate that node is identified and used */
return m_nStatus;
@@ -351,6 +357,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* just skip wrapper node with type info Ex: <tns:QuoteInfoTypeArray xmlns:tns="http://www.getquote.org/test">*/
+ if (!m_pNode) return Array;
Array.m_Size = GetArraySize(m_pNode);
if (Array.m_Size > 0)
{
@@ -366,6 +373,12 @@
for (; nIndex < Array.m_Size; nIndex++)
{
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <item>*/
+ if (!m_pNode)
+ {
+ free(Array.m_Array);
+ Array.m_Size = 0;
+ return Array;
+ }
pItem = reinterpret_cast<void*>(ptrval+nIndex*itemsize);
if (C_RPC_PROVIDER == GetCurrentProviderType())
{
@@ -379,6 +392,12 @@
m_nStatus = ((AXIS_DESERIALIZE_FUNCT)pDZFunct)(pItem, this);
}
m_pNode = m_pParser->Next(); /* skip end element node too */
+ if (!m_pNode)
+ {
+ free(Array.m_Array);
+ Array.m_Size = 0;
+ return Array;
+ }
}
return Array;
}
@@ -396,6 +415,12 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <phonenumbers>*/
+ if (!m_pNode)
+ {
+ free(Array.m_Array);
+ Array.m_Size = 0;
+ return Array;
+ }
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
/* if this node contain attributes let them be used by the complex type's deserializer */
@@ -550,6 +575,14 @@
{\
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */ \
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <phonenumbers>*/\
+ if (!m_pNode)\
+ {\
+ m_nStatus = AXIS_FAIL;\
+ free(Array.m_Array);\
+ Array.m_Array = 0;\
+ Array.m_Size = 0;\
+ return Array;\
+ }\
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))\
{\
m_pNode = m_pParser->Next(); /* charactor node */\
@@ -600,6 +633,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* just skip wrapper node with type info Ex: <tns:ArrayOfPhoneNumbers xmlns:tns="http://www.getquote.org/test">*/
+ if (!m_pNode) return Array;
Array.m_Size = GetArraySize(m_pNode);
if (Array.m_Size > 0)
{
@@ -682,6 +716,14 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <phonenumbers>*/
+ if (!m_pNode)
+ {
+ m_nStatus = AXIS_FAIL;
+ free(Array.m_Array);
+ Array.m_Array = 0;
+ Array.m_Size = 0;
+ return Array;
+ }
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -785,6 +827,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* just skip wrapper node with type info Ex: <tns:QuoteInfoType xmlns:tns="http://www.getquote.org/test">*/
+ if (!m_pNode) return NULL;
/* type can be checked here */
void* pObject = ((AXIS_OBJECT_CREATE_FUNCT)pCreFunct)(NULL, false, 0);
if (pObject && pDZFunct)
@@ -815,6 +858,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <result>*/
+ if (!m_pNode) return NULL;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
/* if this node contain attributes let them be used by the complex type's deserializer */
@@ -1080,6 +1124,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_BOOLEAN == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1099,6 +1144,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1133,6 +1179,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_INT == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1152,6 +1199,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1185,6 +1233,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_UNSIGNEDINT == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1204,6 +1253,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1237,6 +1287,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_SHORT == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1256,6 +1307,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1290,6 +1342,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_UNSIGNEDSHORT == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1309,6 +1362,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1342,6 +1396,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_BYTE == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1361,6 +1416,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1394,6 +1450,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_UNSIGNEDBYTE == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1413,6 +1470,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1446,6 +1504,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_LONG == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1465,6 +1524,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1498,6 +1558,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_INTEGER == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1517,6 +1578,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1550,6 +1612,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_UNSIGNEDLONG == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1569,6 +1632,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1602,6 +1666,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_FLOAT == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1621,6 +1686,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1654,6 +1720,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_DECIMAL == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1673,6 +1740,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1706,6 +1774,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_DECIMAL == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1725,6 +1794,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1758,6 +1828,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_STRING == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1777,6 +1848,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1811,6 +1883,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_ANYURI == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1830,6 +1903,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1857,6 +1931,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_QNAME == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1876,6 +1951,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1903,6 +1979,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_HEXBINARY == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1922,6 +1999,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1945,16 +2023,18 @@
xsd__base64Binary SoapDeSerializer::DecodeFromBase64Binary(const AxisChar* pValue)
{
xsd__base64Binary value;
- value.__ptr = NULL; /*TODO : allocate memory and decode value and put size */
- value.__size = 0;
+ value.__ptr = (unsigned char*) malloc(strlen(pValue)*2);
+ value.__size = apr_base64_decode_len(pValue);
+ apr_base64_decode_binary(value.__ptr, pValue);
return value;
}
xsd__hexBinary SoapDeSerializer::DecodeFromHexBinary(const AxisChar* pValue)
{
xsd__hexBinary value;
- value.__ptr = NULL; /*TODO : allocate memory and decode value and put size */
- value.__size = 0;
+ value.__size = strlen(pValue)/2;
+ value.__ptr = (unsigned char*) malloc(value.__size);
+ Hex_Decode(value.__ptr, pValue);
return value;
}
@@ -1965,6 +2045,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_BASE64BINARY == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -1984,6 +2065,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2011,6 +2093,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_DATETIME == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2030,6 +2113,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2057,6 +2141,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_DATE == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2076,6 +2161,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2103,6 +2189,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_TIME == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2122,6 +2209,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2149,6 +2237,7 @@
if (RPC_ENCODED == m_nStyle)
{
m_pNode = m_pParser->Next(); /* wrapper node with type info Ex: <i xsi:type="xsd:int">*/
+ if (!m_pNode) return ret;
if (XSD_DURATION == GetXSDType(m_pNode))
{
m_pNode = m_pParser->Next(); /* charactor node */
@@ -2168,6 +2257,7 @@
{
if (!m_pNode) /* if there is an unprocessed node that may be one left from last array deserialization */
m_pNode = m_pParser->Next(); /* wrapper node without type info Ex: <i>*/
+ if (!m_pNode) return ret;
if (0 == strcmp(pName, m_pNode->m_pchNameOrValue))
{
m_pNode = m_pParser->Next(); /* charactor node */