mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-10-01 02:35:48 -04:00
fixed memory leak when receving multi-chunk file lists
This commit is contained in:
parent
5b819ebd7a
commit
a545481daa
@ -1189,7 +1189,11 @@ void p3FileDatabase::tickRecv()
|
||||
{
|
||||
case RS_PKT_SUBTYPE_FILELISTS_SYNC_REQ_ITEM: handleDirSyncRequest( dynamic_cast<RsFileListsSyncRequestItem*>(item) ) ;
|
||||
break ;
|
||||
case RS_PKT_SUBTYPE_FILELISTS_SYNC_RSP_ITEM: handleDirSyncResponse( dynamic_cast<RsFileListsSyncResponseItem*>(item) ) ;
|
||||
case RS_PKT_SUBTYPE_FILELISTS_SYNC_RSP_ITEM:
|
||||
{
|
||||
RsFileListsSyncResponseItem *sitem = dynamic_cast<RsFileListsSyncResponseItem*>(item);
|
||||
handleDirSyncResponse(sitem) ;
|
||||
}
|
||||
break ;
|
||||
default:
|
||||
P3FILELISTS_ERROR() << "(EE) unhandled packet subtype " << item->PacketSubType() << " in " << __PRETTY_FUNCTION__ << std::endl;
|
||||
@ -1322,6 +1326,7 @@ void p3FileDatabase::splitAndSendItem(RsFileListsSyncResponseItem *ritem)
|
||||
}
|
||||
|
||||
// This function should not take memory ownership of ritem, so it makes copies.
|
||||
// The item that is returned is either created (if different from ritem) or equal to ritem.
|
||||
|
||||
RsFileListsSyncResponseItem *p3FileDatabase::recvAndRebuildItem(RsFileListsSyncResponseItem *ritem)
|
||||
{
|
||||
@ -1393,13 +1398,25 @@ RsFileListsSyncResponseItem *p3FileDatabase::recvAndRebuildItem(RsFileListsSyncR
|
||||
return NULL ;
|
||||
}
|
||||
|
||||
void p3FileDatabase::handleDirSyncResponse(RsFileListsSyncResponseItem *sitem)
|
||||
// We employ a trick in this function:
|
||||
// - if recvAndRebuildItem(item) returns the same item, it has not created memory, so the incoming item should be the one to
|
||||
// delete, which is done by the caller in every case.
|
||||
// - if it returns a different item, it means that the item has been created below when collapsing items, so we should delete both.
|
||||
// to do so, we first delete the incoming item, and replace the pointer by the new created one.
|
||||
|
||||
void p3FileDatabase::handleDirSyncResponse(RsFileListsSyncResponseItem*& sitem)
|
||||
{
|
||||
RsFileListsSyncResponseItem *item = recvAndRebuildItem(sitem) ;
|
||||
|
||||
if(!item)
|
||||
return ;
|
||||
|
||||
if(item != sitem)
|
||||
{
|
||||
delete sitem ;
|
||||
sitem = item ;
|
||||
}
|
||||
|
||||
time_t now = time(NULL);
|
||||
|
||||
// check the hash. If anything goes wrong (in the chunking for instance) the hash will not match
|
||||
|
@ -205,7 +205,7 @@ class p3FileDatabase: public p3Service, public p3Config, public ftSearch //, pub
|
||||
uint32_t locked_getFriendIndex(const RsPeerId& pid);
|
||||
|
||||
void handleDirSyncRequest (RsFileListsSyncRequestItem *) ;
|
||||
void handleDirSyncResponse (RsFileListsSyncResponseItem *) ;
|
||||
void handleDirSyncResponse (RsFileListsSyncResponseItem *&) ;
|
||||
|
||||
std::map<RsPeerId,uint32_t> mFriendIndexMap ;
|
||||
std::vector<RsPeerId> mFriendIndexTab;
|
||||
|
Loading…
Reference in New Issue
Block a user