From: Debian Qt/KDE Maintainers Date: Wed, 18 Apr 2018 20:45:31 +0000 (+0100) Subject: xmlpatterns_stack_overflow_fix X-Git-Tag: archive/raspbian/4%4.8.7+dfsg-15+rpi1^2~52 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b5fe17875b9a4181d0b7921b556c0385433de694;p=qt4-x11.git xmlpatterns_stack_overflow_fix commit d1b17740ed4d9b1e3c3ad5898bb8259969dc77df Author: Kamil Rojewski Date: Wed Aug 13 10:38:38 2014 +0200 fix for stack overflow Recursion in item mapping iterator caused a stack overflow for large datasets. Task-number: QTBUG-40153 Change-Id: I693798de0ecfd3a920a3dd270172ce7ec3c13d8d Reviewed-by: Jędrzej Nowacki Gbp-Pq: Name xmlpatterns_stack_overflow_fix.diff --- diff --git a/src/xmlpatterns/iterators/qitemmappingiterator_p.h b/src/xmlpatterns/iterators/qitemmappingiterator_p.h index 4ef8a7073..28c8d3f72 100644 --- a/src/xmlpatterns/iterators/qitemmappingiterator_p.h +++ b/src/xmlpatterns/iterators/qitemmappingiterator_p.h @@ -117,24 +117,28 @@ namespace QPatternist */ virtual TResult next() { - const TSource sourceItem(m_it->next()); - - if(qIsForwardIteratorEnd(sourceItem)) - { - m_current = TResult(); - m_position = -1; - return TResult(); - } - else + while (true) { - m_current = m_mapper->mapToItem(sourceItem, m_context); - if(qIsForwardIteratorEnd(m_current)) - return next(); /* The mapper returned null, so continue with the next in the source. */ - else + const TSource &sourceItem = m_it->next(); + if (qIsForwardIteratorEnd(sourceItem)) { - ++m_position; + m_current = TResult(); + m_position = -1; return m_current; } + else + { + m_current = m_mapper->mapToItem(sourceItem, m_context); + if (qIsForwardIteratorEnd(m_current)) + { + continue; /* The mapper returned null, so continue with the next in the source. */ + } + else + { + ++m_position; + return m_current; + } + } } }