From 46bb28d4e40b955e9e7ab130ca6b7c025eb43079 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 2 Jun 2024 18:22:15 +0200 Subject: [PATCH] Avoid throwing exceptions inside XML parser This addresses an issue found in ARM builds on Mac M1. The XML parser makes use of exceptions to stop the parsing. This causes an ABORT on M1/clang for whatever reason. The new implementation requests the reader to stop and stores the exception until it is needed. --- src/img/img/imgStream.cc | 4 ++-- src/tl/tl/tlXMLParser.cc | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/img/img/imgStream.cc b/src/img/img/imgStream.cc index 13c9e2a21..4f6833aca 100644 --- a/src/img/img/imgStream.cc +++ b/src/img/img/imgStream.cc @@ -233,14 +233,14 @@ ImageProxy::get_image () const if (! m_byte_data.empty ()) { std::list::const_iterator s = m_byte_data.begin (); - for (size_t i = 0; i < m_height; ++i) { + for (size_t i = 0; i < m_height && s != m_byte_data.end (); ++i) { string_to_pixels (img.get (), *s++, i, m_width, m_color); } } else { std::list::const_iterator s = m_data.begin (); - for (size_t i = 0; i < m_height; ++i) { + for (size_t i = 0; i < m_height && s != m_data.end (); ++i) { string_to_pixels (img.get (), *s++, i, m_width, m_color); } diff --git a/src/tl/tl/tlXMLParser.cc b/src/tl/tl/tlXMLParser.cc index 7bf20e599..1edba7806 100644 --- a/src/tl/tl/tlXMLParser.cc +++ b/src/tl/tl/tlXMLParser.cc @@ -403,9 +403,15 @@ public: void setDocumentLocator (QXmlLocator *locator); + const tl::XMLLocatedException *exception () const + { + return m_error.get (); + } + private: QXmlLocator *mp_locator; XMLStructureHandler *mp_struct_handler; + std::unique_ptr m_error; }; // -------------------------------------------------------------------------------------------------------- @@ -479,13 +485,17 @@ SAXHandler::characters (const QString &t) bool SAXHandler::error (const QXmlParseException &ex) { - throw tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ()); + m_error.reset (new tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ())); + // stop reading + return false; } bool SAXHandler::fatalError (const QXmlParseException &ex) { - throw tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ()); + m_error.reset (new tl::XMLLocatedException (tl::to_string (ex.message ()), ex.lineNumber (), ex.columnNumber ())); + // stop reading + return false; } bool @@ -765,7 +775,10 @@ XMLParser::parse (XMLSource &source, XMLStructureHandler &struct_handler) mp_data->setContentHandler (&handler); mp_data->setErrorHandler (&handler); - mp_data->parse (source.source (), false /*=not incremental*/); + bool result = mp_data->parse (source.source (), false /*=not incremental*/); + if (! result && handler.exception ()) { + throw tl::XMLLocatedException (*handler.exception ()); + } } bool