From 6167969572298af47687cbb7ccba1aea202110ac Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Tue, 15 Jan 2008 12:13:54 +0000 Subject: [PATCH] fixed wxHTML parser to not assert on invalid HTML input (unclosed tags) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51223 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/html/htmltag.h | 6 ++---- src/html/htmltag.cpp | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/wx/html/htmltag.h b/include/wx/html/htmltag.h index 40bcf48871..3853333866 100644 --- a/include/wx/html/htmltag.h +++ b/include/wx/html/htmltag.h @@ -126,13 +126,11 @@ public: // returns ending position of _internal_ block of text as iterator // into parser's source string (see wxHtmlParser::GetSource()): // bla bla bla bla bla intenal text* bla bla - wxString::const_iterator GetEndIter1() const - { wxASSERT(m_hasEnding); return m_End1; } + wxString::const_iterator GetEndIter1() const { return m_End1; } // returns end position 2 as iterator // into parser's source string (see wxHtmlParser::GetSource()): // bla bla bla bla bla internal text* bla bla - wxString::const_iterator GetEndIter2() const - { wxASSERT(m_hasEnding); return m_End2; } + wxString::const_iterator GetEndIter2() const { return m_End2; } #if WXWIN_COMPATIBILITY_2_8 // use GetBeginIter(), GetEndIter1() and GetEndIter2() instead diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index d3e277c150..cd17265698 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -246,9 +246,27 @@ void wxHtmlTagsCache::QueryTag(const wxString::const_iterator& at, } while (Cache()[m_CachePos].Key != at); } - *end1 = Cache()[m_CachePos].End1; - *end2 = Cache()[m_CachePos].End2; - *hasEnding = (Cache()[m_CachePos].type == wxHtmlCacheItem::Type_Normal); + + switch ( Cache()[m_CachePos].type ) + { + case wxHtmlCacheItem::Type_Normal: + *end1 = Cache()[m_CachePos].End1; + *end2 = Cache()[m_CachePos].End2; + *hasEnding = true; + break; + + case wxHtmlCacheItem::Type_EndingTag: + wxFAIL_MSG("QueryTag called for ending tag - can't be"); + // but if it does happen, fall through, better than crashing + + case wxHtmlCacheItem::Type_NoMatchingEndingTag: + // If input HTML is invalid and there's no closing tag for this + // one, pretend that it runs all the way to the end of input + *end1 = inputEnd; + *end2 = inputEnd; + *hasEnding = false; + break; + } } -- 2.45.2