diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index ff6247dee..3d3346198 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -3174,6 +3174,10 @@ void RsGenExchange::processRecvdMessages() for(auto& nxs_msg: msgs_to_store) { RsGxsMsgItem *item = dynamic_cast(mSerialiser->deserialise(nxs_msg->msg.bin_data,&nxs_msg->msg.bin_len)); + + if(!item) + continue; + item->meta = *nxs_msg->metaData; RsGxsMsgChange* c = new RsGxsMsgChange(RsGxsNotify::TYPE_RECEIVED_NEW, item->meta.mGroupId, item->meta.mMsgId,false); diff --git a/libretroshare/src/gxs/rsgxsnettunnel.cc b/libretroshare/src/gxs/rsgxsnettunnel.cc index 968ab0b6f..61e1101f4 100644 --- a/libretroshare/src/gxs/rsgxsnettunnel.cc +++ b/libretroshare/src/gxs/rsgxsnettunnel.cc @@ -556,6 +556,7 @@ void RsGxsNetTunnelService::receiveTurtleData(const RsTurtleGenericTunnelItem *i mTurtle2GxsPeer[turtle_virtual_peer_id] = pid_item->virtual_peer_id ; RsGxsNetTunnelVirtualPeerInfo& vp_info(mVirtualPeers[pid_item->virtual_peer_id]) ; + delete pid_item; vp_info.vpid_status = RsGxsNetTunnelVirtualPeerInfo::RS_GXS_NET_TUNNEL_VP_STATUS_ACTIVE ; // status of the peer vp_info.side = direction; // client/server diff --git a/libretroshare/src/gxs/rsgxsnotify.h b/libretroshare/src/gxs/rsgxsnotify.h index 1e1a5f868..990acfe84 100644 --- a/libretroshare/src/gxs/rsgxsnotify.h +++ b/libretroshare/src/gxs/rsgxsnotify.h @@ -85,6 +85,7 @@ class RsGxsMsgChange : public RsGxsNotify public: RsGxsMsgChange(NotifyType type, const RsGxsGroupId& gid, const RsGxsMessageId& msg_id,bool metaChange) : RsGxsNotify(gid), mMsgId(msg_id), mNewMsgItem(nullptr),NOTIFY_TYPE(type), mMetaChange(metaChange) {} + virtual ~RsGxsMsgChange() override { delete mNewMsgItem ; } RsGxsMessageId mMsgId; RsGxsMsgItem *mNewMsgItem; diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index aef882816..e381b6fe3 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -252,7 +252,8 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD if(currHash == grp->metaData->mHash) { - // get all message ids of group + // Get all message ids of group, store them in msgIds, creating the grp entry at the same time. + if (mds->retrieveMsgIds(grp->grpId, msgIds[grp->grpId]) == 1) { // store the group for retrieveNxsMsgs @@ -275,7 +276,8 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD } } } - else msgIds.erase(msgIds.find(grp->grpId)); + else + msgIds.erase(msgIds.find(grp->grpId)); // could not get them, so group is removed from list. #ifdef RS_DEEP_CHANNEL_INDEX // This should be moved to p3gxschannels. It is really not the place for this here! @@ -334,30 +336,26 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD mds->retrieveNxsMsgs(grps, msgs, false, true); - // check msg ids and messages - GxsMsgReq::iterator msgIdsIt; - for (msgIdsIt = msgIds.begin(); msgIdsIt != msgIds.end(); ++msgIdsIt) + // Check msg ids and messages. Go through all message IDs referred to by the db call + // and verify that the message belongs to the nxs msg data that was just retrieved. + + for(auto& msgIdsIt:msgIds) { - const RsGxsGroupId& grpId = msgIdsIt->first; - std::set &msgIdV = msgIdsIt->second; + const RsGxsGroupId& grpId = msgIdsIt.first; + std::set& msgIdV = msgIdsIt.second; - std::set::iterator msgIdIt; - for (msgIdIt = msgIdV.begin(); msgIdIt != msgIdV.end(); ++msgIdIt) - { - const RsGxsMessageId& msgId = *msgIdIt; - std::vector &nxsMsgV = msgs[grpId]; + std::set nxsMsgS; + std::vector& nxsMsgV = msgs[grpId]; - std::vector::iterator nxsMsgIt; - for (nxsMsgIt = nxsMsgV.begin(); nxsMsgIt != nxsMsgV.end(); ++nxsMsgIt) - { - RsNxsMsg *nxsMsg = *nxsMsgIt; - if (nxsMsg && msgId == nxsMsg->msgId) - { - break; - } - } + // To make the search efficient, we first build a set of msgIds to search in. + // Set build and search are both O(n log(n)). - if (nxsMsgIt == nxsMsgV.end()) + for(auto& nxsMsg:nxsMsgV) + if(nxsMsg) + nxsMsgS.insert(nxsMsg->msgId); + + for (auto& msgId:msgIdV) + if(nxsMsgS.find(msgId) == nxsMsgS.end()) { msgsToDel[grpId].insert(msgId); #ifdef RS_DEEP_CHANNEL_INDEX @@ -365,7 +363,6 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD DeepChannelsIndex::removeChannelPostFromIndex(grpId, msgId); #endif // def RS_DEEP_CHANNEL_INDEX } - } } GxsMsgResult::iterator mit = msgs.begin();