From 447d2774989cd2df249e1d48cf44ef7e1a109a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20M=C3=BCller?= Date: Wed, 20 Nov 2013 00:20:51 +0100 Subject: Fix IRC reported by elubie: windows crash with audio animation There was a bug in how the iterators of STL list was used when erasing during iteration of a list, which was triggered by the STL implementation of MSVC, but hid well with gcc. --- intern/audaspace/intern/AUD_AnimateableProperty.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'intern/audaspace') diff --git a/intern/audaspace/intern/AUD_AnimateableProperty.cpp b/intern/audaspace/intern/AUD_AnimateableProperty.cpp index 6d1a307d868..61adae4b34b 100644 --- a/intern/audaspace/intern/AUD_AnimateableProperty.cpp +++ b/intern/audaspace/intern/AUD_AnimateableProperty.cpp @@ -112,8 +112,12 @@ void AUD_AnimateableProperty::write(const float* data, int position, int count) // otherwise it's not at the end, let's check if some unknown part got filled else { - for(std::list::iterator it = m_unknown.begin(); it != m_unknown.end(); it++) + bool erased = false; + + for(std::list::iterator it = m_unknown.begin(); it != m_unknown.end(); erased ? it : it++) { + erased = false; + // unknown area before position if(it->end < position) continue; @@ -130,9 +134,8 @@ void AUD_AnimateableProperty::write(const float* data, int position, int count) if(position + count > it->end) { // simply delete - std::list::iterator it2 = it; - it++; - m_unknown.erase(it2); + it = m_unknown.erase(it); + erased = true; } // the end is excluded, a second part remains else -- cgit v1.2.3