diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index e2712371cff37d0e5fdc25229b8f31883df46c4a..279a2e65804e8a991858090f750a5e5cd886c50a 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -623,6 +623,7 @@ ConversationModule::Impl::fetchNewCommits(const std::string& peer, } { + std::lock_guard<std::mutex> lk(conv->mtx); conv->pending.reset(); // Notify peers that a new commit is there (DRT) @@ -744,7 +745,7 @@ ConversationModule::Impl::handlePendingConversation(const std::string& conversat } if (!commitId.empty()) sendMessageNotification(*conversation, false, commitId); - lk.unlock(); + erasePending(); // Will unlock #ifdef LIBJAMI_TESTABLE conversation->onBootstrapStatus(bootstrapCbTest_); diff --git a/src/jamidht/gitserver.cpp b/src/jamidht/gitserver.cpp index 78f9aa1514fc7f94ed9cef5206a48b4d5294c444..a8762fb58f530d8292c7580d08ee03c43a0490ed 100644 --- a/src/jamidht/gitserver.cpp +++ b/src/jamidht/gitserver.cpp @@ -51,6 +51,14 @@ public: , repository_(repository) , socket_(socket) { + // Check at least if repository is correct + git_repository* repo; + if (git_repository_open(&repo, repository_.c_str()) != 0) { + socket_->shutdown(); + return; + } + git_repository_free(repo); + socket_->setOnRecv([this](const uint8_t* buf, std::size_t len) { std::lock_guard<std::mutex> lk(destroyMtx_); if (isDestroying_) @@ -204,7 +212,8 @@ GitServer::Impl::sendReferenceCapabilities(bool sendVersion) // https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L166 git_repository* repo; if (git_repository_open(&repo, repository_.c_str()) != 0) { - JAMI_WARN("Couldn't open %s", repository_.c_str()); + JAMI_WARNING("Couldn't open {}", repository_); + socket_->shutdown(); return; } GitRepository rep {repo, git_repository_free}; @@ -221,14 +230,16 @@ GitServer::Impl::sendReferenceCapabilities(bool sendVersion) packet.str().size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); + socket_->shutdown(); return; } } git_oid commit_id; if (git_reference_name_to_id(&commit_id, rep.get(), "HEAD") < 0) { - JAMI_ERR("Cannot get reference for HEAD"); + JAMI_ERROR("Cannot get reference for HEAD"); + socket_->shutdown(); return; } currentHead = git_oid_tostr_s(&commit_id); @@ -246,7 +257,7 @@ GitServer::Impl::sendReferenceCapabilities(bool sendVersion) for (std::size_t i = 0; i < refs.count; ++i) { std::string ref = refs.strings[i]; if (git_reference_name_to_id(&commit_id, rep.get(), ref.c_str()) < 0) { - JAMI_WARN("Cannot get reference for %s", ref.c_str()); + JAMI_WARNING("Cannot get reference for {}", ref); continue; } currentHead = git_oid_tostr_s(&commit_id); @@ -263,7 +274,8 @@ GitServer::Impl::sendReferenceCapabilities(bool sendVersion) auto toSend = packet.str(); socket_->write(reinterpret_cast<const unsigned char*>(toSend.c_str()), toSend.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); + socket_->shutdown(); } } @@ -280,7 +292,8 @@ GitServer::Impl::ACKCommon() auto toSend = packet.str(); socket_->write(reinterpret_cast<const unsigned char*>(toSend.c_str()), toSend.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); + socket_->shutdown(); } } } @@ -298,7 +311,8 @@ GitServer::Impl::ACKFirst() auto toSend = packet.str(); socket_->write(reinterpret_cast<const unsigned char*>(toSend.c_str()), toSend.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); + socket_->shutdown(); return false; } } @@ -312,7 +326,8 @@ GitServer::Impl::NAK() // NAK socket_->write(reinterpret_cast<const unsigned char*>(NAK_PKT.data()), NAK_PKT.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); + socket_->shutdown(); return false; } return true; @@ -330,7 +345,7 @@ GitServer::Impl::sendPackData() git_packbuilder* pb_ptr; if (git_packbuilder_new(&pb_ptr, repo.get()) != 0) { - JAMI_WARN("Couldn't open packbuilder for %s", repository_.c_str()); + JAMI_WARNING("Couldn't open packbuilder for {}", repository_); return; } GitPackBuilder pb {pb_ptr, git_packbuilder_free}; @@ -338,7 +353,7 @@ GitServer::Impl::sendPackData() std::string fetched = wantedReference_; git_oid oid; if (git_oid_fromstr(&oid, wantedReference_.c_str()) < 0) { - JAMI_ERR("Cannot get reference for commit %s", wantedReference_.c_str()); + JAMI_ERROR("Cannot get reference for commit {}", wantedReference_); return; } @@ -409,7 +424,7 @@ GitServer::Impl::sendPackData() toSendStr.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); git_buf_dispose(&data); return; } @@ -420,7 +435,7 @@ GitServer::Impl::sendPackData() // And finish by a little FLUSH socket_->write(reinterpret_cast<const uint8_t*>(FLUSH_PKT.data()), FLUSH_PKT.size(), ec); if (ec) { - JAMI_WARN("Couldn't send data for %s: %s", repository_.c_str(), ec.message().c_str()); + JAMI_WARNING("Couldn't send data for {}: {}", repository_, ec.message()); } // Clear sent data