neilg 2003/08/07 14:21:38 Modified: c/samples/CreateDOMDocument CreateDOMDocument.cpp c/samples/EnumVal EnumVal.cpp c/samples/MemParse MemParse.cpp c/samples/PParse PParse.cpp c/samples/Redirect Redirect.cpp c/samples/SAX2Print SAX2Print.cpp c/samples/SAXPrint SAXPrint.cpp c/samples/SEnumVal SEnumVal.cpp Log: fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. Revision Changes Path 1.17 +6 -2 xml-xerces/c/samples/CreateDOMDocument/CreateDOMDocument.cpp Index: CreateDOMDocument.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/CreateDOMDocument/CreateDOMDocument.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- CreateDOMDocument.cpp 30 May 2003 09:36:34 -0000 1.16 +++ CreateDOMDocument.cpp 7 Aug 2003 21:21:38 -0000 1.17 @@ -144,6 +144,7 @@ } // Watch for special case help request + int errorCode = 0; if (argC > 1) { XERCES_STD_QUALIFIER cout << "\nUsage:\n" @@ -151,8 +152,11 @@ "This program creates a new DOM document from scratch in memory.\n" "It then prints the count of elements in the tree.\n" << XERCES_STD_QUALIFIER endl; + errorCode = 1; + } + if(errorCode) { XMLPlatformUtils::Terminate(); - return 1; + return errorCode; } { 1.21 +8 -2 xml-xerces/c/samples/EnumVal/EnumVal.cpp Index: EnumVal.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/EnumVal/EnumVal.cpp,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- EnumVal.cpp 30 May 2003 09:36:35 -0000 1.20 +++ EnumVal.cpp 7 Aug 2003 21:21:38 -0000 1.21 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.21 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.20 2003/05/30 09:36:35 gareth * Use new macros for iostream.h and std:: issues. * @@ -225,7 +228,6 @@ { XERCES_STD_QUALIFIER cerr << "Error during initialization! Message:\n" << StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl; - XMLPlatformUtils::Terminate(); return 1; } @@ -263,6 +265,7 @@ // Get the starting time and kick off the parse of the indicated // file. Catch any exceptions that might propogate out of it. // + int errorCode = 0; try { parser->parse(xmlFile); @@ -274,8 +277,11 @@ XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << xmlFile << "'\n" << "Exception message is: \n" << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; + errorCode = 4; + } + if(errorCode) { XMLPlatformUtils::Terminate(); - return 4; + return errorCode; } if (!errorCount) { 1.15 +9 -1 xml-xerces/c/samples/MemParse/MemParse.cpp Index: MemParse.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/MemParse/MemParse.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- MemParse.cpp 30 May 2003 09:36:35 -0000 1.14 +++ MemParse.cpp 7 Aug 2003 21:21:38 -0000 1.15 @@ -57,6 +57,9 @@ /* * $Log$ + * Revision 1.15 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.14 2003/05/30 09:36:35 gareth * Use new macros for iostream.h and std:: issues. * @@ -317,6 +320,7 @@ // unsigned long duration; int errorCount = 0; + int errorCode = 0; try { const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis(); @@ -331,7 +335,11 @@ XERCES_STD_QUALIFIER cerr << "\nError during parsing memory stream:\n" << "Exception message is: \n" << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; - return 4; + errorCode = 4; + } + if(errorCode) { + XMLPlatformUtils::Terminate(); + return errorCode; } // Print out the stats that we collected and time taken. 1.16 +9 -2 xml-xerces/c/samples/PParse/PParse.cpp Index: PParse.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/PParse/PParse.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- PParse.cpp 30 May 2003 09:36:35 -0000 1.15 +++ PParse.cpp 7 Aug 2003 21:21:38 -0000 1.16 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.16 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.15 2003/05/30 09:36:35 gareth * Use new macros for iostream.h and std:: issues. * @@ -310,6 +313,7 @@ // for. When it does, we fall out then. // unsigned long duration; + int errorCode = 0; try { // Create a progressive scan token @@ -351,10 +355,13 @@ << "Exception message is: \n" << StrX(toCatch.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; - XMLPlatformUtils::Terminate(); - return 4; + errorCode = 4; } + if(errorCode) { + XMLPlatformUtils::Terminate(); + return errorCode; + } if (!errorCount) { XERCES_STD_QUALIFIER cout << xmlFile << ": " << duration << " ms (" 1.9 +9 -1 xml-xerces/c/samples/Redirect/Redirect.cpp Index: Redirect.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/Redirect/Redirect.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- Redirect.cpp 30 May 2003 09:36:35 -0000 1.8 +++ Redirect.cpp 7 Aug 2003 21:21:38 -0000 1.9 @@ -75,6 +75,9 @@ * to read the contents of 'personal.dtd'. * * $Log$ + * Revision 1.9 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.8 2003/05/30 09:36:35 gareth * Use new macros for iostream.h and std:: issues. * @@ -178,6 +181,7 @@ // unsigned long duration; int errorCount = 0; + int errorCode = 0; try { const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis(); @@ -192,8 +196,12 @@ XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << xmlFile << "'\n" << "Exception message is: \n" << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; + errorCode = 4; + } + + if(errorCode) { XMLPlatformUtils::Terminate(); - return 4; + return errorCode; } // Print out the stats that we collected and time taken. 1.14 +9 -1 xml-xerces/c/samples/SAX2Print/SAX2Print.cpp Index: SAX2Print.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/SAX2Print/SAX2Print.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- SAX2Print.cpp 30 May 2003 09:36:36 -0000 1.13 +++ SAX2Print.cpp 7 Aug 2003 21:21:38 -0000 1.14 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.14 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.13 2003/05/30 09:36:36 gareth * Use new macros for iostream.h and std:: issues. * @@ -335,6 +338,7 @@ // int errorCount = 0; + int errorCode = 0; try { SAX2PrintHandlers handler(encodingName, unRepFlags, expandNamespaces); @@ -349,8 +353,12 @@ XERCES_STD_QUALIFIER cerr << "\nAn error occurred\n Error: " << StrX(toCatch.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; + errorCode = 4; + } + + if(errorCode) { XMLPlatformUtils::Terminate(); - return 4; + return errorCode; } // 1.22 +8 -1 xml-xerces/c/samples/SAXPrint/SAXPrint.cpp Index: SAXPrint.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/SAXPrint/SAXPrint.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- SAXPrint.cpp 30 May 2003 09:36:36 -0000 1.21 +++ SAXPrint.cpp 7 Aug 2003 21:21:38 -0000 1.22 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.22 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.21 2003/05/30 09:36:36 gareth * Use new macros for iostream.h and std:: issues. * @@ -339,6 +342,7 @@ // handler for the parser-> Then parse the file and catch any exceptions // that propogate out // + int errorCode = 0; try { SAXPrintHandlers handler(encodingName, unRepFlags); @@ -353,8 +357,11 @@ XERCES_STD_QUALIFIER cerr << "\nAn error occurred\n Error: " << StrX(toCatch.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; + errorCode = -1; + } + if(errorCode) { XMLPlatformUtils::Terminate(); - return -1; + return errorCode; } // 1.17 +14 -6 xml-xerces/c/samples/SEnumVal/SEnumVal.cpp Index: SEnumVal.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/samples/SEnumVal/SEnumVal.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- SEnumVal.cpp 30 May 2003 09:36:36 -0000 1.16 +++ SEnumVal.cpp 7 Aug 2003 21:21:38 -0000 1.17 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.17 2003/08/07 21:21:38 neilg + * fix segmentation faults that may arise when the parser throws exceptions during document parsing. In general, XMLPlatformUtils::Terminate() should not be called from within a catch statement. + * * Revision 1.16 2003/05/30 09:36:36 gareth * Use new macros for iostream.h and std:: issues. * @@ -200,6 +203,9 @@ // --------------------------------------------------------------------------- int main(int argC, char* argV[]) { + // cannot return out of catch-blocks lest exception-destruction + // result in calls to destroyed memory handler! + int errorCode = 0; // Initialize the XML4C system try { @@ -210,9 +216,12 @@ { XERCES_STD_QUALIFIER cerr << "Error during initialization! Message:\n" << StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl; - XMLPlatformUtils::Terminate(); - return 1; + errorCode = 1; } + if(errorCode) { + XMLPlatformUtils::Terminate(); + return errorCode; + } // Check command line and extract arguments. // We only have one required parameter, which is the file to process @@ -233,13 +242,12 @@ XERCES_STD_QUALIFIER cerr << "\nError during parsing: '" << argV[1] << "'\n" << "Exception message is: \n" << StrX(e.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; - XMLPlatformUtils::Terminate(); - return 3; + errorCode = 3; } XMLPlatformUtils::Terminate(); - return 0; + return errorCode; } void process(char* const xmlFile)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]