summaryrefslogtreecommitdiff
path: root/protocols/ICQ-WIM/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2022-06-01 15:31:44 +0300
committerGeorge Hazan <ghazan@miranda.im>2022-06-01 15:31:44 +0300
commitb02b456b818424435fac3eb67f703d96a26d5e2b (patch)
tree70ed7cbd0f4e988983c6f035c21f46425f2c1996 /protocols/ICQ-WIM/src
parent670812a1dce9840be99f3bde36bb4591328f182b (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.cpp5
-rw-r--r--protocols/ICQ-WIM/src/proto.h1
-rw-r--r--protocols/ICQ-WIM/src/server.cpp67
-rw-r--r--protocols/ICQ-WIM/src/version.h2
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>