Commit ca274c21 authored by Anton Gladky's avatar Anton Gladky

Apply upstream fix: segfault on removing clumps.

parent f96f8d65
From 90640cc8af36602cc0a4b980bc06486c19277adf Mon Sep 17 00:00:00 2001
From: Anton Gladky <gladky.anton@gmail.com>
Date: Mon, 11 Aug 2014 20:25:01 +0200
Subject: [PATCH] Fix crash after clumps removing. Closes LP:1354433
After Clump::del(clumpBody, b), b->clumpId is aways "-1",
so it is wrong to use it later in this->erase(b->clumpId,false).
---
core/BodyContainer.cpp | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/core/BodyContainer.cpp b/core/BodyContainer.cpp
index 7c186da..31d78ad 100644
--- a/core/BodyContainer.cpp
+++ b/core/BodyContainer.cpp
@@ -29,15 +29,12 @@ Body::id_t BodyContainer::insert(shared_ptr<Body>& b){
bool BodyContainer::erase(Body::id_t id, bool eraseClumpMembers){//default is false (as before)
if(!body[id]) return false;
-
const shared_ptr<Body>& b=Body::byId(id);
-
if ((b) and (b->isClumpMember())) {
- const shared_ptr<Body>& clumpBody=Body::byId(b->clumpId);
+ const shared_ptr<Body> clumpBody=Body::byId(b->clumpId);
const shared_ptr<Clump> clump=YADE_PTR_CAST<Clump>(clumpBody->shape);
Clump::del(clumpBody, b);
-
- if (clump->members.size()==0) this->erase(b->clumpId,false); //Clump has no members any more. Remove it
+ if (clump->members.size()==0) this->erase(clumpBody->id,false); //Clump has no members any more. Remove it
}
if ((b) and (b->isClump())){
@@ -46,17 +43,18 @@ bool BodyContainer::erase(Body::id_t id, bool eraseClumpMembers){//default is fa
std::map<Body::id_t,Se3r>& members = clump->members;
FOREACH(MemberMap::value_type& mm, members){
const Body::id_t& memberId=mm.first;
- if (eraseClumpMembers) this->erase(memberId,false); // erase members
- //when the last members is erased, the clump will be erased automatically, see above
- else Body::byId(memberId)->clumpId=Body::id_t(-1); // make members standalones
+ if (eraseClumpMembers) {
+ this->erase(memberId,false); // erase members
+ } else {
+ //when the last members is erased, the clump will be erased automatically, see above
+ Body::byId(memberId)->clumpId=Body::ID_NONE; // make members standalones
+ }
}
}
const shared_ptr<Scene>& scene=Omega::instance().getScene();
for(Body::MapId2IntrT::iterator it=b->intrs.begin(),end=b->intrs.end(); it!=end; ++it) { //Iterate over all body's interactions
scene->interactions->requestErase((*it).second);
}
-
body[id].reset();
-
return true;
}
--
2.0.3
01_remove_google_analytics.patch
02_fix_DEM-PFV.patch
03_fix_segfault_clumps.patch
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment