From 0f55d73b69cbfe38fb8922195cc14df9279c67e9 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 9 Dec 2020 23:31:40 +0100 Subject: [PATCH 1/3] fixed quadratic search in GxsUtil check routine --- libretroshare/src/gxs/rsgxsutil.cc | 43 ++++++++++++++---------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index c907ceb22..84d3f2998 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -244,7 +244,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 @@ -267,7 +268,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! @@ -326,30 +328,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 @@ -357,7 +355,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(); From 9a6835bf060d2f4b8746ba7d0e8f56f6e6060035 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 10 Dec 2020 20:15:53 +0100 Subject: [PATCH 2/3] fixed memory leak in RsGenExchange --- libretroshare/src/gxs/rsgenexchange.cc | 4 ++++ libretroshare/src/gxs/rsgxsnotify.h | 1 + 2 files changed, 5 insertions(+) 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/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; From 7b2f7f2e0e121aebde4f42128b6a721f1b7c3d33 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 10 Dec 2020 20:23:23 +0100 Subject: [PATCH 3/3] fixed mem leak in rsgxstunnel.cc --- libretroshare/src/gxs/rsgxsnettunnel.cc | 1 + 1 file changed, 1 insertion(+) 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