From fbde0c85088a5d0c085f014803b687be108b826c Mon Sep 17 00:00:00 2001
From: George Hazan <george.hazan@gmail.com>
Date: Wed, 6 Mar 2013 15:47:36 +0000
Subject: fix for a crash in Jabber chat rooms with very long topics

git-svn-id: http://svn.miranda-ng.org/main/trunk@3905 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 protocols/JabberG/src/jabber_chat.cpp | 42 ++++++++++++++++++-----------------
 1 file changed, 22 insertions(+), 20 deletions(-)

(limited to 'protocols')

diff --git a/protocols/JabberG/src/jabber_chat.cpp b/protocols/JabberG/src/jabber_chat.cpp
index ad7048fdbf..d33595adeb 100644
--- a/protocols/JabberG/src/jabber_chat.cpp
+++ b/protocols/JabberG/src/jabber_chat.cpp
@@ -1322,8 +1322,7 @@ static void sttNickListHook(CJabberProto* ppro, JABBER_LIST_ITEM* item, GCHOOK*
 
 static void sttLogListHook(CJabberProto* ppro, JABBER_LIST_ITEM* item, GCHOOK* gch)
 {
-	TCHAR szBuffer[ 1024 ];
-	TCHAR szCaption[ 1024 ];
+	TCHAR szCaption[1024], szBuffer[1024];
 	szBuffer[ 0 ] = _T('\0');
 
 	switch(gch->dwData) {
@@ -1353,27 +1352,30 @@ static void sttLogListHook(CJabberProto* ppro, JABBER_LIST_ITEM* item, GCHOOK* g
 
 	case IDM_TOPIC:
 		mir_sntprintf(szCaption, SIZEOF(szCaption), _T("%s %s"), TranslateT("Set topic for"), gch->pDest->ptszID);
-		TCHAR szTmpBuff[ SIZEOF(szBuffer) * 2 ];
-		if (item->itemResource.statusMessage) {
-			int j = 0;
-			for (int i = 0; i < SIZEOF(szTmpBuff); i++) {
-				if (item->itemResource.statusMessage[ i ] != _T('\n') || (i && item->itemResource.statusMessage[ i - 1 ] == _T('\r')))
-					szTmpBuff[ j++ ] = item->itemResource.statusMessage[ i ];
-				else {
-					szTmpBuff[ j++ ] = _T('\r');
-					szTmpBuff[ j++ ] = _T('\n');
+		{	
+			size_t cbLen = 2048 + lstrlen(item->itemResource.statusMessage)*2;
+			mir_ptr<TCHAR> ptszBuf((TCHAR*)mir_alloc( sizeof(TCHAR) * cbLen));
+			if (item->itemResource.statusMessage) {
+				TCHAR *d = ptszBuf;
+				for (int i = 0; i < cbLen; i++) {
+					if (item->itemResource.statusMessage[ i ] != _T('\n') || (i && item->itemResource.statusMessage[ i - 1 ] == _T('\r')))
+						*d++ = item->itemResource.statusMessage[ i ];
+					else {
+						*d++ = _T('\r');
+						*d++ = _T('\n');
+					}
+					if ( !item->itemResource.statusMessage[ i ])
+						break;
 				}
-				if ( !item->itemResource.statusMessage[ i ])
-					break;
+				*d = 0;
 			}
-		}
-		else szTmpBuff[ 0 ] = _T('\0');
-
-		if (ppro->EnterString(szTmpBuff, SIZEOF(szTmpBuff), szCaption, JES_RICHEDIT, "gcTopic_"))
-			ppro->m_ThreadInfo->send(
-				XmlNode(_T("message")) << XATTR(_T("to"), gch->pDest->ptszID) << XATTR(_T("type"), _T("groupchat"))
-					<< XCHILD(_T("subject"), szTmpBuff));
+			else ptszBuf[0] = 0;
 
+			if (ppro->EnterString(ptszBuf, cbLen, szCaption, JES_RICHEDIT, "gcTopic_"))
+				ppro->m_ThreadInfo->send(
+					XmlNode(_T("message")) << XATTR(_T("to"), gch->pDest->ptszID) << XATTR(_T("type"), _T("groupchat"))
+						<< XCHILD(_T("subject"), ptszBuf));
+		}
 		break;
 
 	case IDM_NICK:
-- 
cgit v1.2.3