]> git.pld-linux.org Git - packages/boost.git/commitdiff
- fix SEGV in archive interator (xml archive specific issue).
authorPaweł Sikora <pluto@pld-linux.org>
Thu, 20 Jul 2006 14:16:31 +0000 (14:16 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    boost-archive_iterator_segv.patch -> 1.1

boost-archive_iterator_segv.patch [new file with mode: 0644]

diff --git a/boost-archive_iterator_segv.patch b/boost-archive_iterator_segv.patch
new file mode 100644 (file)
index 0000000..19a70ea
--- /dev/null
@@ -0,0 +1,74 @@
+--- boost_1_33_1/boost/archive/iterators/escape.hpp.orig       2006-07-20 16:13:40.880579250 +0200
++++ boost_1_33_1/boost/archive/iterators/escape.hpp    2006-07-20 16:13:54.897455250 +0200
+@@ -37,7 +37,8 @@
+         BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type,
+         single_pass_traversal_tag,
+         BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type
+-    >{
++    >
++{
+     typedef BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type base_value_type;
+     typedef BOOST_DEDUCED_TYPENAME boost::iterator_reference<Base>::type reference_type;
+     friend class boost::iterator_core_access;
+@@ -53,16 +54,29 @@
+     typedef escape<Derived, Base> this_t;
+     bool equal(const this_t & rhs) const {
+-        return 
+-            NULL == m_bnext
+-            && NULL == m_bend
+-            && this->base_reference() == rhs.base_reference()
+-        ;
++        if(m_full && ! rhs.m_full)
++            rhs.dereference();
++        else
++        if(! m_full && rhs.m_full)
++            dereference();
++        if(m_bnext != rhs.m_bnext)
++            return false;
++        if(this->base_reference() != rhs.base_reference())
++            return false;
++        return true;
++    }
++
++    reference_type dereference_impl() {
++        if(!m_full){
++            m_current_value = static_cast<Derived *>(this)->fill(m_bnext, m_bend);
++            m_full = true;
++        }
++        return m_current_value;
+     }
+     //Access the value referred to 
+     reference_type dereference() const {
+-        return m_current_value;
++        return const_cast<this_t *>(this)->dereference_impl();
+     }
+    void increment(){
+@@ -73,21 +87,21 @@
+         ++(this->base_reference());
+         m_bnext = NULL;
+         m_bend = NULL;
+-        m_current_value = (static_cast<Derived *>(this))->fill(m_bnext, m_bend);
++        m_full = false;
+     }
+     // buffer to handle pending characters
+     const base_value_type *m_bnext;
+     const base_value_type *m_bend;
+-    BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type m_current_value;
+     bool m_full;
++    BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type m_current_value;
+ public:
+     escape(Base base) : 
+         super_t(base),
+         m_bnext(NULL),
+-        m_bend(NULL)
++        m_bend(NULL),
++        m_full(false)
+     {
+-        m_current_value = static_cast<Derived *>(this)->fill(m_bnext, m_bend);
+     }
+ };
This page took 0.118072 seconds and 4 git commands to generate.