diff options
author | George Hazan <ghazan@miranda.im> | 2022-06-01 15:31:44 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2022-06-01 15:31:44 +0300 |
commit | b02b456b818424435fac3eb67f703d96a26d5e2b (patch) | |
tree | 70ed7cbd0f4e988983c6f035c21f46425f2c1996 /protocols/ICQ-WIM/src | |
parent | 670812a1dce9840be99f3bde36bb4591328f182b (diff) |
shoud have fixed #2988 (ICQ: crash on canceled filetransfer)
Diffstat (limited to 'protocols/ICQ-WIM/src')
-rw-r--r-- | protocols/ICQ-WIM/src/proto.cpp | 5 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.h | 1 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/server.cpp | 67 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/version.h | 2 |
4 files changed, 43 insertions, 32 deletions
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp index eb6e26e4ff..e08c0984ab 100644 --- a/protocols/ICQ-WIM/src/proto.cpp +++ b/protocols/ICQ-WIM/src/proto.cpp @@ -450,7 +450,10 @@ int CIcqProto::FileCancel(MCONTACT hContact, HANDLE hTransfer) ProtoBroadcastAck(hContact, ACKTYPE_FILE, ACKRESULT_FAILED, hTransfer); auto *ft = (IcqFileTransfer *)hTransfer; - delete ft; + if (ft->pfts.currentFileTime != 0) + ft->m_bCanceled = true; + else + delete ft; return 0; } diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h index 440d4905b4..7231dc3e9b 100644 --- a/protocols/ICQ-WIM/src/proto.h +++ b/protocols/ICQ-WIM/src/proto.h @@ -182,6 +182,7 @@ struct IcqFileTransfer : public MZeroedObject _close(m_fileId); } + bool m_bCanceled = false, m_bStarted = false; int m_fileId = -1; CMStringA m_szHost; CMStringW m_wszFileName, m_wszDescr; diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp index 8ba7cb4aa3..c02628be4a 100644 --- a/protocols/ICQ-WIM/src/server.cpp +++ b/protocols/ICQ-WIM/src/server.cpp @@ -843,6 +843,12 @@ void CIcqProto::OnCheckPassword(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*) void CIcqProto::OnFileContinue(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld) { IcqFileTransfer *pTransfer = (IcqFileTransfer*)pOld->pUserInfo; + if (pTransfer->m_bCanceled) { +LBL_Error: + ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_FAILED, pTransfer); + delete pTransfer; + return; + } switch (pReply->resultCode) { case 200: // final ok @@ -850,44 +856,42 @@ void CIcqProto::OnFileContinue(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld break; default: - ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_FAILED, pTransfer); - delete pTransfer; - return; + goto LBL_Error; } // file transfer succeeded? if (pTransfer->pfts.currentFileProgress == pTransfer->pfts.currentFileSize) { FileReply root(pReply); - if (root.error() == 200) { - ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, pTransfer); + if (root.error() != 200) + goto LBL_Error; - const JSONNode &data = root.data(); - CMStringW wszUrl(data["static_url"].as_mstring()); + ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, pTransfer); - JSONNode bundle, contents; contents.set_name("captionedContent"); - contents << WCHAR_PARAM("caption", pTransfer->m_wszDescr) << WCHAR_PARAM("url", wszUrl); - bundle << CHAR_PARAM("mediaType", "text") << CHAR_PARAM("text", "") << contents; - CMStringW wszParts(FORMAT, L"[%s]", ptrW(json_write(&bundle)).get()); + const JSONNode &data = root.data(); + CMStringW wszUrl(data["static_url"].as_mstring()); - if (!pTransfer->m_wszDescr.IsEmpty()) - wszUrl += L" " + pTransfer->m_wszDescr; + JSONNode bundle, contents; contents.set_name("captionedContent"); + contents << WCHAR_PARAM("caption", pTransfer->m_wszDescr) << WCHAR_PARAM("url", wszUrl); + bundle << CHAR_PARAM("mediaType", "text") << CHAR_PARAM("text", "") << contents; + CMStringW wszParts(FORMAT, L"[%s]", ptrW(json_write(&bundle)).get()); - int id = InterlockedIncrement(&m_msgId); - auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, ICQ_API_SERVER "/im/sendIM", &CIcqProto::OnSendMessage); + if (!pTransfer->m_wszDescr.IsEmpty()) + wszUrl += L" " + pTransfer->m_wszDescr; - auto *pOwn = new IcqOwnMessage(pTransfer->pfts.hContact, id, pReq->m_reqId); - pReq->pUserInfo = pOwn; - { - mir_cslock lck(m_csOwnIds); - m_arOwnIds.insert(pOwn); - } - - pReq << AIMSID(this) << CHAR_PARAM("a", m_szAToken) << CHAR_PARAM("k", appId()) << CHAR_PARAM("mentions", "") << WCHAR_PARAM("message", wszUrl) - << CHAR_PARAM("offlineIM", "true") << WCHAR_PARAM("parts", wszParts) << WCHAR_PARAM("t", GetUserId(pTransfer->pfts.hContact)) << INT_PARAM("ts", TS()); - Push(pReq); + int id = InterlockedIncrement(&m_msgId); + auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_POST, ICQ_API_SERVER "/im/sendIM", &CIcqProto::OnSendMessage); + auto *pOwn = new IcqOwnMessage(pTransfer->pfts.hContact, id, pReq->m_reqId); + pReq->pUserInfo = pOwn; + { + mir_cslock lck(m_csOwnIds); + m_arOwnIds.insert(pOwn); } - else ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_FAILED, pTransfer); + + pReq << AIMSID(this) << CHAR_PARAM("a", m_szAToken) << CHAR_PARAM("k", appId()) << CHAR_PARAM("mentions", "") << WCHAR_PARAM("message", wszUrl) + << CHAR_PARAM("offlineIM", "true") << WCHAR_PARAM("parts", wszParts) << WCHAR_PARAM("t", GetUserId(pTransfer->pfts.hContact)) << INT_PARAM("ts", TS()); + Push(pReq); + delete pTransfer; return; } @@ -909,15 +913,19 @@ void CIcqProto::OnFileContinue(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld void CIcqProto::OnFileInit(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld) { IcqFileTransfer *pTransfer = (IcqFileTransfer*)pOld->pUserInfo; - - FileReply root(pReply); - if (root.error() != 200) { + if (pTransfer->m_bCanceled) { +LBL_Error: ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_FAILED, pTransfer); delete pTransfer; return; } + FileReply root(pReply); + if (root.error() != 200) + goto LBL_Error; + ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_INITIALISING, pTransfer); + pTransfer->pfts.currentFileTime = time(0); const JSONNode &data = root.data(); CMStringW wszHost(data["host"].as_mstring()); @@ -933,7 +941,6 @@ void CIcqProto::OnFileInit(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld) pTransfer->FillHeaders(pReq); Push(pReq); - pTransfer->pfts.currentFileTime = time(0); ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DATA, pTransfer, (LPARAM)&pTransfer->pfts); } diff --git a/protocols/ICQ-WIM/src/version.h b/protocols/ICQ-WIM/src/version.h index 00ea8b47ed..3ed4facd81 100644 --- a/protocols/ICQ-WIM/src/version.h +++ b/protocols/ICQ-WIM/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 96 #define __RELEASE_NUM 1 -#define __BUILD_NUM 8 +#define __BUILD_NUM 9 #include <stdver.h> |