Fixed crash after last commit in p3idservice.cc.

Fixed memory leaks and possible crashs in ::getGroupData
- p3gxschannels
- p3gxscircles
- p3gxsforums
- p3idservice
- p3posted
- p3photoservice


git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6524 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
thunder2 2013-07-21 01:50:13 +00:00
parent 3730645808
commit f5218cdfc3
7 changed files with 143 additions and 109 deletions

View File

@ -1109,7 +1109,6 @@ bool RsGenExchange::getMsgRelatedMeta(const uint32_t &token, GxsMsgRelatedMetaMa
bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem *>& grpItem) bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem *>& grpItem)
{ {
std::list<RsNxsGrp*> nxsGrps; std::list<RsNxsGrp*> nxsGrps;
bool ok = mDataAccess->getGroupData(token, nxsGrps); bool ok = mDataAccess->getGroupData(token, nxsGrps);
@ -1118,7 +1117,7 @@ bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem
std::cerr << "RsGenExchange::getGroupData() RsNxsGrp::len: " << nxsGrps.size(); std::cerr << "RsGenExchange::getGroupData() RsNxsGrp::len: " << nxsGrps.size();
std::cerr << std::endl; std::cerr << std::endl;
if(ok) if(ok)
{ {
for(; lit != nxsGrps.end(); lit++) for(; lit != nxsGrps.end(); lit++)
{ {
@ -1134,7 +1133,7 @@ bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem
if (gItem) if (gItem)
{ {
gItem->meta = *((*lit)->metaData); gItem->meta = *((*lit)->metaData);
grpItem.push_back(gItem); grpItem.push_back(gItem);
} }
else else
{ {
@ -1148,46 +1147,42 @@ bool RsGenExchange::getGroupData(const uint32_t &token, std::vector<RsGxsGrpItem
std::cerr << "RsGenExchange::getGroupData() ERROR deserialising item"; std::cerr << "RsGenExchange::getGroupData() ERROR deserialising item";
std::cerr << std::endl; std::cerr << std::endl;
} }
delete *lit; delete *lit;
} }
} }
return ok; return ok;
} }
bool RsGenExchange::getMsgData(const uint32_t &token, bool RsGenExchange::getMsgData(const uint32_t &token, GxsMsgDataMap &msgItems)
GxsMsgDataMap &msgItems)
{ {
RsStackMutex stack(mGenMtx);
NxsMsgDataResult msgResult;
bool ok = mDataAccess->getMsgData(token, msgResult);
NxsMsgDataResult::iterator mit = msgResult.begin();
RsStackMutex stack(mGenMtx); if(ok)
NxsMsgDataResult msgResult; {
bool ok = mDataAccess->getMsgData(token, msgResult); for(; mit != msgResult.end(); mit++)
NxsMsgDataResult::iterator mit = msgResult.begin(); {
std::vector<RsGxsMsgItem*> gxsMsgItems;
const RsGxsGroupId& grpId = mit->first;
std::vector<RsNxsMsg*>& nxsMsgsV = mit->second;
std::vector<RsNxsMsg*>::iterator vit = nxsMsgsV.begin();
for(; vit != nxsMsgsV.end(); vit++)
{
RsNxsMsg*& msg = *vit;
RsItem* item = NULL;
if(ok) if(msg->msg.bin_len != 0)
{ item = mSerialiser->deserialise(msg->msg.bin_data, &msg->msg.bin_len);
for(; mit != msgResult.end(); mit++)
{
std::vector<RsGxsMsgItem*> gxsMsgItems;
const RsGxsGroupId& grpId = mit->first;
std::vector<RsNxsMsg*>& nxsMsgsV = mit->second;
std::vector<RsNxsMsg*>::iterator vit
= nxsMsgsV.begin();
for(; vit != nxsMsgsV.end(); vit++)
{
RsNxsMsg*& msg = *vit;
RsItem* item = NULL;
if(msg->msg.bin_len != 0)
item = mSerialiser->deserialise(msg->msg.bin_data,
&msg->msg.bin_len);
if (item) if (item)
{ {
RsGxsMsgItem* mItem = dynamic_cast<RsGxsMsgItem*>(item); RsGxsMsgItem* mItem = dynamic_cast<RsGxsMsgItem*>(item);
if (mItem) if (mItem)
{ {
mItem->meta = *((*vit)->metaData); // get meta info from nxs msg mItem->meta = *((*vit)->metaData); // get meta info from nxs msg
gxsMsgItems.push_back(mItem); gxsMsgItems.push_back(mItem);
} }
else else
{ {
@ -1205,12 +1200,12 @@ bool RsGenExchange::getMsgData(const uint32_t &token,
std::cerr << std::endl; std::cerr << std::endl;
#endif #endif
} }
delete msg; delete msg;
}
msgItems[grpId] = gxsMsgItems;
}
} }
return ok; msgItems[grpId] = gxsMsgItems;
}
}
return ok;
} }
bool RsGenExchange::getMsgRelatedData(const uint32_t &token, GxsMsgRelatedDataMap &msgItems) bool RsGenExchange::getMsgRelatedData(const uint32_t &token, GxsMsgRelatedDataMap &msgItems)

View File

@ -175,7 +175,7 @@ bool p3GxsChannels::getGroupData(const uint32_t &token, std::vector<RsGxsChannel
std::vector<RsGxsGrpItem*> grpData; std::vector<RsGxsGrpItem*> grpData;
bool ok = RsGenExchange::getGroupData(token, grpData); bool ok = RsGenExchange::getGroupData(token, grpData);
if(ok) if(ok)
{ {
std::vector<RsGxsGrpItem*>::iterator vit = grpData.begin(); std::vector<RsGxsGrpItem*>::iterator vit = grpData.begin();
@ -194,6 +194,7 @@ bool p3GxsChannels::getGroupData(const uint32_t &token, std::vector<RsGxsChannel
{ {
std::cerr << "p3GxsChannels::getGroupData() ERROR in decode"; std::cerr << "p3GxsChannels::getGroupData() ERROR in decode";
std::cerr << std::endl; std::cerr << std::endl;
delete(*vit);
} }
} }
} }
@ -218,7 +219,7 @@ bool p3GxsChannels::getPostData(const uint32_t &token, std::vector<RsGxsChannelP
GxsMsgDataMap msgData; GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData); bool ok = RsGenExchange::getMsgData(token, msgData);
if(ok) if(ok)
{ {
GxsMsgDataMap::iterator mit = msgData.begin(); GxsMsgDataMap::iterator mit = msgData.begin();
@ -228,11 +229,11 @@ bool p3GxsChannels::getPostData(const uint32_t &token, std::vector<RsGxsChannelP
RsGxsGroupId grpId = mit->first; RsGxsGroupId grpId = mit->first;
std::vector<RsGxsMsgItem*>& msgItems = mit->second; std::vector<RsGxsMsgItem*>& msgItems = mit->second;
std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin(); std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin();
for(; vit != msgItems.end(); vit++) for(; vit != msgItems.end(); vit++)
{ {
RsGxsChannelPostItem* item = dynamic_cast<RsGxsChannelPostItem*>(*vit); RsGxsChannelPostItem* item = dynamic_cast<RsGxsChannelPostItem*>(*vit);
if(item) if(item)
{ {
RsGxsChannelPost msg; RsGxsChannelPost msg;
@ -253,7 +254,7 @@ bool p3GxsChannels::getPostData(const uint32_t &token, std::vector<RsGxsChannelP
std::cerr << "p3GxsChannels::getPostData() ERROR in request"; std::cerr << "p3GxsChannels::getPostData() ERROR in request";
std::cerr << std::endl; std::cerr << std::endl;
} }
return ok; return ok;
} }

View File

@ -370,11 +370,20 @@ bool p3GxsCircles::getGroupData(const uint32_t &token, std::vector<RsGxsCircleGr
for(; vit != grpData.end(); vit++) for(; vit != grpData.end(); vit++)
{ {
RsGxsCircleGroupItem* item = dynamic_cast<RsGxsCircleGroupItem*>(*vit); RsGxsCircleGroupItem* item = dynamic_cast<RsGxsCircleGroupItem*>(*vit);
RsGxsCircleGroup group; if (item)
item->convertTo(group); {
RsGxsCircleGroup group;
item->convertTo(group);
// If its cached - add that info (TODO). // If its cached - add that info (TODO).
groups.push_back(group); groups.push_back(group);
delete(item);
}
else
{
std::cerr << "Not a RsGxsCircleGroupItem, deleting!" << std::endl;
delete *vit;
}
} }
} }

View File

@ -102,11 +102,19 @@ bool p3GxsForums::getGroupData(const uint32_t &token, std::vector<RsGxsForumGrou
for(; vit != grpData.end(); vit++) for(; vit != grpData.end(); vit++)
{ {
RsGxsForumGroupItem* item = dynamic_cast<RsGxsForumGroupItem*>(*vit); RsGxsForumGroupItem* item = dynamic_cast<RsGxsForumGroupItem*>(*vit);
RsGxsForumGroup grp = item->mGroup; if (item)
item->mGroup.mMeta = item->meta; {
grp.mMeta = item->mGroup.mMeta; RsGxsForumGroup grp = item->mGroup;
delete item; item->mGroup.mMeta = item->meta;
groups.push_back(grp); grp.mMeta = item->mGroup.mMeta;
delete item;
groups.push_back(grp);
}
else
{
std::cerr << "Not a GxsForumGrpItem, deleting!" << std::endl;
delete *vit;
}
} }
} }
return ok; return ok;
@ -121,21 +129,21 @@ bool p3GxsForums::getMsgData(const uint32_t &token, std::vector<RsGxsForumMsg> &
{ {
GxsMsgDataMap msgData; GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData); bool ok = RsGenExchange::getMsgData(token, msgData);
if(ok) if(ok)
{ {
GxsMsgDataMap::iterator mit = msgData.begin(); GxsMsgDataMap::iterator mit = msgData.begin();
for(; mit != msgData.end(); mit++) for(; mit != msgData.end(); mit++)
{ {
RsGxsGroupId grpId = mit->first; RsGxsGroupId grpId = mit->first;
std::vector<RsGxsMsgItem*>& msgItems = mit->second; std::vector<RsGxsMsgItem*>& msgItems = mit->second;
std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin(); std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin();
for(; vit != msgItems.end(); vit++) for(; vit != msgItems.end(); vit++)
{ {
RsGxsForumMsgItem* item = dynamic_cast<RsGxsForumMsgItem*>(*vit); RsGxsForumMsgItem* item = dynamic_cast<RsGxsForumMsgItem*>(*vit);
if(item) if(item)
{ {
RsGxsForumMsg msg = item->mMsg; RsGxsForumMsg msg = item->mMsg;
@ -151,7 +159,7 @@ bool p3GxsForums::getMsgData(const uint32_t &token, std::vector<RsGxsForumMsg> &
} }
} }
} }
return ok; return ok;
} }

View File

@ -397,72 +397,78 @@ bool p3IdService::getReputation(const RsGxsId &id, GixsReputation &rep)
bool p3IdService::getGroupData(const uint32_t &token, std::vector<RsGxsIdGroup> &groups) bool p3IdService::getGroupData(const uint32_t &token, std::vector<RsGxsIdGroup> &groups)
{ {
std::vector<RsGxsGrpItem*> grpData;
bool ok = RsGenExchange::getGroupData(token, grpData);
std::vector<RsGxsGrpItem*> grpData; if(ok)
bool ok = RsGenExchange::getGroupData(token, grpData); {
std::vector<RsGxsGrpItem*>::iterator vit = grpData.begin();
if(ok) for(; vit != grpData.end(); vit++)
{ {
std::vector<RsGxsGrpItem*>::iterator vit = grpData.begin(); RsGxsIdGroupItem* item = dynamic_cast<RsGxsIdGroupItem*>(*vit);
if (item)
for(; vit != grpData.end(); vit++)
{
RsGxsIdGroupItem* item = dynamic_cast<RsGxsIdGroupItem*>(*vit);
RsGxsIdGroup group = item->group;
group.mMeta = item->meta;
// Decode information from serviceString.
SSGxsIdGroup ssdata;
if (ssdata.load(group.mMeta.mServiceString))
{ {
group.mPgpKnown = ssdata.pgp.idKnown; RsGxsIdGroup group = item->group;
group.mPgpId = ssdata.pgp.pgpId; group.mMeta = item->meta;
// Decode information from serviceString.
SSGxsIdGroup ssdata;
if (ssdata.load(group.mMeta.mServiceString))
{
group.mPgpKnown = ssdata.pgp.idKnown;
group.mPgpId = ssdata.pgp.pgpId;
#ifdef DEBUG_IDS #ifdef DEBUG_IDS
std::cerr << "p3IdService::getGroupData() Success decoding ServiceString"; std::cerr << "p3IdService::getGroupData() Success decoding ServiceString";
std::cerr << std::endl; std::cerr << std::endl;
std::cerr << "\t mGpgKnown: " << group.mPgpKnown; std::cerr << "\t mGpgKnown: " << group.mPgpKnown;
std::cerr << std::endl; std::cerr << std::endl;
std::cerr << "\t mGpgId: " << group.mPgpId; std::cerr << "\t mGpgId: " << group.mPgpId;
std::cerr << std::endl; std::cerr << std::endl;
#endif // DEBUG_IDS #endif // DEBUG_IDS
}
else
{
group.mPgpKnown = false;
group.mPgpId = "";
std::cerr << "p3IdService::getGroupData() Failed to decode ServiceString";
std::cerr << std::endl;
}
groups.push_back(group);
delete(item);
} }
else else
{ {
group.mPgpKnown = false; std::cerr << "Not a Id Item, deleting!" << std::endl;
group.mPgpId = ""; delete(*vit);
std::cerr << "p3IdService::getGroupData() Failed to decode ServiceString";
std::cerr << std::endl;
} }
}
}
groups.push_back(group); return ok;
}
delete *vit ;
}
return ok;
} }
bool p3IdService::getMsgData(const uint32_t &token, std::vector<RsGxsIdOpinion> &opinions) bool p3IdService::getMsgData(const uint32_t &token, std::vector<RsGxsIdOpinion> &opinions)
{ {
GxsMsgDataMap msgData; GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData); bool ok = RsGenExchange::getMsgData(token, msgData);
if(ok) if(ok)
{ {
GxsMsgDataMap::iterator mit = msgData.begin(); GxsMsgDataMap::iterator mit = msgData.begin();
for(; mit != msgData.end(); mit++) for(; mit != msgData.end(); mit++)
{ {
RsGxsGroupId grpId = mit->first; RsGxsGroupId grpId = mit->first;
std::vector<RsGxsMsgItem*>& msgItems = mit->second; std::vector<RsGxsMsgItem*>& msgItems = mit->second;
std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin(); std::vector<RsGxsMsgItem*>::iterator vit = msgItems.begin();
for(; vit != msgItems.end(); vit++) for(; vit != msgItems.end(); vit++)
{ {
RsGxsIdOpinionItem* item = dynamic_cast<RsGxsIdOpinionItem*>(*vit); RsGxsIdOpinionItem* item = dynamic_cast<RsGxsIdOpinionItem*>(*vit);
if (item) if (item)
{ {
RsGxsIdOpinion opinion = item->opinion; RsGxsIdOpinion opinion = item->opinion;

View File

@ -207,18 +207,25 @@ bool p3PhotoService::getAlbum(const uint32_t& token, std::vector<RsPhotoAlbum>&
for(; vit != grpData.end(); vit++) for(; vit != grpData.end(); vit++)
{ {
RsGxsPhotoAlbumItem* item = dynamic_cast<RsGxsPhotoAlbumItem*>(*vit); RsGxsPhotoAlbumItem* item = dynamic_cast<RsGxsPhotoAlbumItem*>(*vit);
RsPhotoAlbum album = item->album; if (item)
item->album.mMeta = item->meta; {
album.mMeta = item->album.mMeta; RsPhotoAlbum album = item->album;
delete item; item->album.mMeta = item->meta;
albums.push_back(album); album.mMeta = item->album.mMeta;
delete item;
albums.push_back(album);
}
else
{
std::cerr << "Not a RsGxsPhotoAlbumItem, deleting!" << std::endl;
delete *vit;
}
} }
} }
return ok; return ok;
} }
bool p3PhotoService::getPhoto(const uint32_t& token, PhotoResult& photos) bool p3PhotoService::getPhoto(const uint32_t& token, PhotoResult& photos)
{ {
GxsMsgDataMap msgData; GxsMsgDataMap msgData;
@ -240,14 +247,14 @@ bool p3PhotoService::getPhoto(const uint32_t& token, PhotoResult& photos)
if(item) if(item)
{ {
RsPhotoPhoto photo = item->photo; RsPhotoPhoto photo = item->photo;
photo.mMeta = item->meta; photo.mMeta = item->meta;
photos[grpId].push_back(photo); photos[grpId].push_back(photo);
delete item; delete item;
}else }else
{ {
std::cerr << "Not a photo Item, deleting!" << std::endl; std::cerr << "Not a photo Item, deleting!" << std::endl;
delete *vit; delete *vit;
} }
} }
} }

View File

@ -179,11 +179,19 @@ bool p3Posted::getGroupData(const uint32_t &token, std::vector<RsPostedGroup> &g
for(; vit != grpData.end(); vit++) for(; vit != grpData.end(); vit++)
{ {
RsGxsPostedGroupItem* item = dynamic_cast<RsGxsPostedGroupItem*>(*vit); RsGxsPostedGroupItem* item = dynamic_cast<RsGxsPostedGroupItem*>(*vit);
RsPostedGroup grp = item->mGroup; if (item)
item->mGroup.mMeta = item->meta; {
grp.mMeta = item->mGroup.mMeta; RsPostedGroup grp = item->mGroup;
delete item; item->mGroup.mMeta = item->meta;
groups.push_back(grp); grp.mMeta = item->mGroup.mMeta;
delete item;
groups.push_back(grp);
}
else
{
std::cerr << "Not a RsGxsPostedGroupItem, deleting!" << std::endl;
delete *vit;
}
} }
} }
return ok; return ok;
@ -194,7 +202,7 @@ bool p3Posted::getPostData(const uint32_t &token, std::vector<RsPostedPost> &msg
GxsMsgDataMap msgData; GxsMsgDataMap msgData;
bool ok = RsGenExchange::getMsgData(token, msgData); bool ok = RsGenExchange::getMsgData(token, msgData);
time_t now = time(NULL); time_t now = time(NULL);
if(ok) if(ok)
{ {
GxsMsgDataMap::iterator mit = msgData.begin(); GxsMsgDataMap::iterator mit = msgData.begin();
@ -208,7 +216,7 @@ bool p3Posted::getPostData(const uint32_t &token, std::vector<RsPostedPost> &msg
for(; vit != msgItems.end(); vit++) for(; vit != msgItems.end(); vit++)
{ {
RsGxsPostedPostItem* item = dynamic_cast<RsGxsPostedPostItem*>(*vit); RsGxsPostedPostItem* item = dynamic_cast<RsGxsPostedPostItem*>(*vit);
if(item) if(item)
{ {
RsPostedPost msg = item->mPost; RsPostedPost msg = item->mPost;