[ http://issues.apache.org/jira/browse/XALANC-463?page=history ]

Rene van Hoek updated XALANC-463:
---------------------------------

    Attachment: Xalan19Transform.zip

The zip file 'Xalan19Transform.zip' contains the source-code, XML and XSL files.


> Transforming an XML DOM document encapsulated within an 
> XercesDOMWrapperParsedSource object triggers an invalid heap pointer 
> exception if  XSL opens other XML document with 'document()' function.
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: XALANC-463
>          URL: http://issues.apache.org/jira/browse/XALANC-463
>      Project: XalanC
>         Type: Bug
>   Components: XalanC
>     Versions: 1.9
>  Environment: Xerces 2.6 (9/30/2004)
> Xalan 1.9 (12/22/2004)
> Os: Windows 2000 Advanced Server
> Compiler: Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 
> for 80x86
> Linker: Microsoft (R) Incremental Linker Version 7.10.3077
>     Reporter: Rene van Hoek
>     Priority: Critical
>  Attachments: Xalan19Transform.zip
>
> Transforming an XML DOM document encapsulated within an 
> XercesDOMWrapperParsedSource object triggers an invalid heap pointer 
> exception if  XSL opens other XML document with 'document()' function.
> The XML is parsed and stored in an XercesDOMWrapperParsedSource object.
> The XSL style-sheet opens with the function 'document()' an other XML 
> document. 
> The transformation itself goes ok. When the destructors are called, an 
> 'delete' is deleting memory in a wrong heap.
> The behaviour does not occur with Xalan 1.8
> The behaviour does not occur when the XSL style-sheet does not open an other 
> XML document.
> The behaviour does not occur when the XML is not stored in an 
> XercesDOMWrapperParsedSource object.
> source-code:
> =================
> #include <xalanc/Include/PlatformDefinitions.hpp>
> #if defined(XALAN_CLASSIC_IOSTREAMS)
> #include <iostream.h>
> #else
> #include <iostream>
> #endif
> #include <xercesc/util/PlatformUtils.hpp>
> #include <xercesc/parsers/XercesDOMParser.hpp>
> #include <xercesc/dom/DOMDocument.hpp>
> #include <xalanc/XalanTransformer/XalanTransformer.hpp>
> #include <xalanc/XalanTransformer/XercesDOMWrapperParsedSource.hpp>
> #include <xalanc/XalanTransformer/XalanParsedSource.hpp>
> #include <xalanc/XercesParserLiaison/XercesParserLiaison.hpp>
> #include <xalanc/XercesParserLiaison/XercesDOMSupport.hpp>
> int
> main(
>                       int             argc,
>                       char*   argv[])
> {
>       XALAN_USING_STD(cerr)
>       XALAN_USING_STD(cout)
>       XALAN_USING_STD(endl)
>     if (argc < 3 || argc > 3)
>       {
>               cerr << "Usage: XalanTransform XMLFileName XSLFileName " << 
> endl;
>               return -1;
>       }
>       int             theResult = -1;
>       try
>       {
>               XALAN_USING_XERCES(XMLPlatformUtils)
>     XALAN_USING_XERCES(XercesDOMParser)
>     XALAN_USING_XERCES(DOMDocument)
>               XALAN_USING_XALAN(XalanTransformer)
>     XALAN_USING_XALAN(XercesParserLiaison)
>     XALAN_USING_XALAN(XercesDOMSupport)
>     XALAN_USING_XALAN(XercesDOMWrapperParsedSource)    
>   
>     XALAN_USING_XALAN(XalanParsedSource)
>     XALAN_USING_XALAN(XalanParsedSourceHelper)
>               // Call the static initializer for Xerces.
>               XMLPlatformUtils::Initialize();
>               // Initialize Xalan.
>               XalanTransformer::initialize();
>               { 
>       DOMDocument* parsedXml = NULL;
>       XercesDOMParser parser;
>       parser.parse(argv[1]);
>             
>       parsedXml = parser.getDocument();
>       XercesDOMSupport    theDOMSupport;
>       XercesParserLiaison theLiaison(theDOMSupport);        
>       XercesDOMWrapperParsedSource theSource(parsedXml, theLiaison, 
> theDOMSupport);
>                       // Create a XalanTransformer.
>                       XalanTransformer theXalanTransformer;
>                       
>                       // Do the transform.
>                       theResult = theXalanTransformer.transform(theSource, 
> argv[2], cout);
>       
>                       if(theResult != 0)
>                       {
>                               cerr << "Error: " << 
> theXalanTransformer.getLastError() << endl;
>                       }
>                       
>               }
>               // Terminate Xalan...
>               XalanTransformer::terminate();
>               // Terminate Xerces...
>               XMLPlatformUtils::Terminate();
>               // Clean up the ICU, if it's integrated...
>               XalanTransformer::ICUCleanUp();
>       }
>       catch(...)
>       {
>               cerr << "An unknown error occurred!" << endl;
>       }
>       return theResult;
> }
> XSL-file:
> ===========
> <?xml version="1.0" ?> 
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
> version="1.0">
> <xsl:output method="xml" version="1.0"/>
> <xsl:template match="/">
> <xsl:variable name="org_doc"><xsl:value-of 
> select="./questionnaire/current_response_doc"/></xsl:variable>
> <xsl:variable name="org" select="document($org_doc)"></xsl:variable>
> <xsl:variable name="upd" select="/"></xsl:variable>
> <xsl:variable name="upd_q_ids" select="$upd//question/@id"/>
> <xsl:element name="questionnaire">
> <xsl:attribute name="id"><xsl:value-of 
> select="$upd/questionnaire/@id"/></xsl:attribute>
> <xsl:attribute name="questionnaire_session_id"><xsl:value-of 
> select="$upd/questionnaire/@questionnaire_session_id"/></xsl:attribute>
> <respondent-tracking>    
>     <xsl:copy-of select="$org/questionnaire/respondent-tracking//posting"/>
>     <xsl:copy-of select="$upd/questionnaire/posting"/>
> </respondent-tracking>
> <responses>
> <respondent_id><xsl:value-of 
> select="$upd/questionnaire/responses/respondent_id"/></respondent_id>
> <xsl:copy-of select="$org//question[not(@id = $upd_q_ids)]"/>
> <xsl:copy-of select="$upd//question"/>
> </responses>
> </xsl:element>
> </xsl:template>
> </xsl:stylesheet>
> XML-file parsed in program:
> =============================
> <?xml version="1.0" encoding="UTF-8"?>
> <questionnaire id="1" questionnaire_session_id="1">
>     <current_response_doc>response_org.xml</current_response_doc>
>     <respondent-tracking>       
>     </respondent-tracking>
>     <responses>
>         <respondent_id>{aa-bcd-23-0}</respondent_id>        
>         <question id="{q-aa-4}">
>             <answer id="{q-aa-4_a-1}">
>                 <text/>
>             </answer>
>         </question>
>     </responses>
> </questionnaire>
> XML-file opened in XSL-sheet with 'document()' function
> ==========================================================
> <?xml version="1.0" encoding="UTF-8"?>
> <questionnaire id="1" questionnaire_session_id="1">
>     <respondent-tracking>        
>     </respondent-tracking>
>     <responses>
>         <respondent_id>{aa-bcd-23-0}</respondent_id>
>         <question id="{q-aa-5}">
>             <answer id="{q-aa-5_a-4}">
>                 <text/>
>             </answer>
>         </question>           
>     </responses>
> </questionnaire>
> Call stack:
> ================
> >     msvcr71d.dll!operator delete(void * pUserData=0x006a5d80)  Line 52 + 
> > 0x51       C++
>       xerces-c_2_6D.dll!120b1d10()    
>       Xalan-C_1_9D.dll!xalanc_1_9::XercesParserLiaison::reset()  Line 140 + 
> 0x28      C++
>       
> Xalan-C_1_9D.dll!xalanc_1_9::XercesParserLiaison::~XercesParserLiaison()  
> Line 116      C++
>       
> Xalan-C_1_9D.dll!xalanc_1_9::XercesDOMParsedSourceHelper::~XercesDOMParsedSourceHelper()
>   Line 60 + 0xb C++
>       Xalan-C_1_9D.dll!xalanc_1_9::XercesDOMParsedSourceHelper::`vector 
> deleting destructor'()  + 0x57        C++
>       
> Xalan-C_1_9D.dll!xalanc_1_9::XalanMemMgrAutoPtr<xalanc_1_9::XalanParsedSourceHelper,1>::MemMgrAutoPtrData::deallocate()
>   Line 83 + 0x14 C++
>       
> Xalan-C_1_9D.dll!xalanc_1_9::XalanMemMgrAutoPtr<xalanc_1_9::XalanParsedSourceHelper,1>::~XalanMemMgrAutoPtr<xalanc_1_9::XalanParsedSourceHelper,1>()
>   Line 146  C++
>       Xalan-C_1_9D.dll!xalanc_1_9::XalanTransformer::doTransform(const 
> xalanc_1_9::XalanParsedSource & theParsedXML={...}, const 
> xalanc_1_9::XalanCompiledStylesheet * theCompiledStylesheet=0x0066ac38, const 
> xalanc_1_9::XSLTInputSource * theStylesheetSource=0x00000000, const 
> xalanc_1_9::XSLTResultTarget & theResultTarget={...})  Line 1307 + 0x93    C++
>       Xalan-C_1_9D.dll!xalanc_1_9::XalanTransformer::transform(const 
> xalanc_1_9::XalanParsedSource & theParsedXML={...}, const 
> xalanc_1_9::XalanCompiledStylesheet * theCompiledStylesheet=0x0066ac38, const 
> xalanc_1_9::XSLTResultTarget & theResultTarget={...})  Line 188  C++
>       Xalan19Transform.exe!main(int argc=3, char * * argv=0x003a6890)  Line 
> 104 + 0x5b        C++
>       Xalan19Transform.exe!mainCRTStartup()  Line 398 + 0x11  C
>       KERNEL32.DLL!7c59893d() 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


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

Reply via email to