From e772a0febc29babe3826011e226f20af0125aab6 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 26 Mar 2023 18:29:52 +0300 Subject: Telegram: fix for a possible crash --- protocols/Telegram/src/avatars.cpp | 66 +++++++++++++++++++++++--------------- protocols/Telegram/src/proto.cpp | 2 +- protocols/Telegram/src/proto.h | 5 ++- protocols/Telegram/src/utils.cpp | 11 +++++-- 4 files changed, 53 insertions(+), 31 deletions(-) (limited to 'protocols/Telegram') diff --git a/protocols/Telegram/src/avatars.cpp b/protocols/Telegram/src/avatars.cpp index 7e1d117ed7..66d0710cbc 100644 --- a/protocols/Telegram/src/avatars.cpp +++ b/protocols/Telegram/src/avatars.cpp @@ -77,6 +77,17 @@ INT_PTR CTelegramProto::SvcSetMyAvatar(WPARAM, LPARAM) ///////////////////////////////////////////////////////////////////////////////////////// +TG_FILE_REQUEST* CTelegramProto::PopFile(const char *pszUniqueId) +{ + mir_cslock lck(m_csFiles); + + for (auto &it : m_arFiles) + if (it->m_uniqueId == pszUniqueId) + return it; + + return nullptr; +} + void CTelegramProto::ProcessFile(TD::updateFile *pObj) { if (auto *pFile = pObj->file_.get()) { @@ -85,38 +96,41 @@ void CTelegramProto::ProcessFile(TD::updateFile *pObj) Utf2T wszExistingFile(pFile->local_->path_.c_str()); - for (auto &it : m_arFiles) { - if (it->m_uniqueId == pFile->remote_->unique_id_.c_str()) { - CMStringW wszFullName = it->m_destPath + L"\\" + it->m_fileName; - - if (it->m_type == it->AVATAR) { - if (it->m_fileName.Right(5).MakeLower() == L".webp") { - if (auto *pImage = FreeImage_LoadU(FIF_WEBP, wszExistingFile)) { - wszFullName.Truncate(wszFullName.GetLength() - 5); - wszFullName += L".png"; - FreeImage_SaveU(FIF_PNG, pImage, wszFullName); - FreeImage_Unload(pImage); - } + if (auto *F = PopFile(pFile->remote_->unique_id_.c_str())) { + CMStringW wszFullName = F->m_destPath + L"\\" + F->m_fileName; + + if (F->m_type == F->AVATAR) { + if (F->m_fileName.Right(5).MakeLower() == L".webp") { + if (auto *pImage = FreeImage_LoadU(FIF_WEBP, wszExistingFile)) { + wszFullName.Truncate(wszFullName.GetLength() - 5); + wszFullName += L".png"; + FreeImage_SaveU(FIF_PNG, pImage, wszFullName); + FreeImage_Unload(pImage); } - else MoveFileW(wszExistingFile, wszFullName); - - SMADD_CONT cont = { 1, m_szModuleName, wszFullName }; - CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont)); - m_arFiles.removeItem(&it); } - else { // FILE - it->pfts.currentFileProgress = pFile->local_->downloaded_size_; - ProtoBroadcastAck(it->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DATA, it, (LPARAM)&it->pfts); + else MoveFileW(wszExistingFile, wszFullName); + + SMADD_CONT cont = { 1, m_szModuleName, wszFullName }; + CallService(MS_SMILEYADD_LOADCONTACTSMILEYS, 0, LPARAM(&cont)); - if (pFile->local_->is_downloading_completed_) { - MoveFileW(wszExistingFile, wszFullName); - ProtoBroadcastAck(it->pfts.hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, it); + mir_cslock lck(m_csFiles); + m_arFiles.remove(F); + } + else { // FILE + F->pfts.currentFileProgress = pFile->local_->downloaded_size_; + ProtoBroadcastAck(F->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DATA, F, (LPARAM)&F->pfts); - m_arFiles.removeItem(&it); - } + if (pFile->local_->is_downloading_completed_) { + MoveFileW(wszExistingFile, wszFullName); + ProtoBroadcastAck(F->pfts.hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, F); + + mir_cslock lck(m_csFiles); + m_arFiles.remove(F); } - return; } + + delete F; + return; } for (auto &it : m_arUsers) { diff --git a/protocols/Telegram/src/proto.cpp b/protocols/Telegram/src/proto.cpp index 586d27feb9..6a82a00347 100644 --- a/protocols/Telegram/src/proto.cpp +++ b/protocols/Telegram/src/proto.cpp @@ -35,7 +35,7 @@ static int CompareSuperGroups(const TG_SUPER_GROUP *p1, const TG_SUPER_GROUP *p2 CTelegramProto::CTelegramProto(const char* protoName, const wchar_t* userName) : PROTO(protoName, userName), m_impl(*this), - m_arFiles(1), + m_arFiles(1, PtrKeySortT), m_arChats(100, CompareChats), m_arUsers(100, CompareUsers), m_arRequests(10, CompareRequests), diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h index 42bf428802..4963a02cde 100644 --- a/protocols/Telegram/src/proto.h +++ b/protocols/Telegram/src/proto.h @@ -175,7 +175,10 @@ class CTelegramProto : public PROTO CMStringA m_szFullPhone; OBJLIST m_arRequests; - OBJLIST m_arFiles; + + mir_cs m_csFiles; + LIST m_arFiles; + TG_FILE_REQUEST* PopFile(const char *pszUniqueId); static INT_PTR CALLBACK EnterEmail(void *param); static INT_PTR CALLBACK EnterEmailCode(void *param); diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp index a9213d55ac..5686e1aad1 100644 --- a/protocols/Telegram/src/utils.cpp +++ b/protocols/Telegram/src/utils.cpp @@ -236,10 +236,12 @@ CMStringA CTelegramProto::GetMessageText(TG_USER *pUser, TD::MessageContent *pBo pRequest->pfts.flags = PFTS_UNICODE; pRequest->pfts.hContact = pUser->hContact; pRequest->pfts.currentFileSize = pFile->size_; - m_arFiles.insert(pRequest); + { + mir_cslock lck(m_csFiles); + m_arFiles.insert(pRequest); + } auto *pszFileName = pDoc->document_->file_name_.c_str(); - PROTORECVFILE pre = {}; pre.fileCount = 1; pre.timestamp = time(0); @@ -273,7 +275,10 @@ CMStringA CTelegramProto::GetMessageText(TG_USER *pUser, TD::MessageContent *pBo CreateDirectoryW(pRequest->m_destPath, 0); pRequest->m_fileName.Format(L"STK{%S}.%S", pFileId, pwszFileExt); - m_arFiles.insert(pRequest); + { + mir_cslock lck(m_csFiles); + m_arFiles.insert(pRequest); + } SendQuery(new TD::downloadFile(pFile->id_, 10, 0, 0, true)); return CMStringA(FORMAT, "STK{%s}", pFileId); -- cgit v1.2.3