I patched the message.c file for the two functions, but still need you check the release of pStr:
void *CSCPMessage::Set(DWORD dwVarId, BYTE bType, const void *pValue, DWORD dwSize)
{
DWORD dwIndex, dwLength, dwLenWC;
CSCP_DF *pVar;
#if !defined(UNICODE_UCS2) || !defined(UNICODE)
UCS2CHAR *pBuffer;
#endif
// Create CSCP_DF structure
switch(bType)
{
case CSCP_DT_INTEGER:
pVar = (CSCP_DF *)malloc(12);
pVar->df_int32 = *((const DWORD *)pValue);
break;
case CSCP_DT_INT16:
pVar = (CSCP_DF *)malloc(8);
pVar->df_int16 = *((const WORD *)pValue);
break;
case CSCP_DT_INT64:
pVar = (CSCP_DF *)malloc(16);
pVar->df_int64 = *((const QWORD *)pValue);
break;
case CSCP_DT_FLOAT:
pVar = (CSCP_DF *)malloc(16);
pVar->df_real = *((const double *)pValue);
break;
case CSCP_DT_STRING:
dwLength = (DWORD)_tcslen((const TCHAR *)pValue);
//pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
//pVar->df_string.dwLen = dwLength * 2;
#ifdef UNICODE
#ifdef UNICODE_UCS2
pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
pVar->df_string.dwLen = dwLength * 2;
memcpy(pVar->df_string.szValue, pValue, pVar->df_string.dwLen);
#else /* assume UNICODE_UCS4 */
pVar = (CSCP_DF *)malloc(12 + dwLength * 2);
pVar->df_string.dwLen = dwLength * 2;
pBuffer = (UCS2CHAR *)malloc(dwLength * 2 + 2);
ucs4_to_ucs2((WCHAR *)pValue, dwLength, pBuffer, dwLength + 1);
memcpy(pVar->df_string.szValue, pBuffer, pVar->df_string.dwLen);
free(pBuffer);
#endif
#else /* not UNICODE */
dwLenWC = mb_to_ucs2((const char *)pValue, dwLength, NULL, 0);
pBuffer = (UCS2CHAR *)malloc(dwLenWC * 2 + 2);
mb_to_ucs2((const char *)pValue, dwLength, pBuffer, dwLenWC + 1);
pVar = (CSCP_DF *)malloc(12 + dwLenWC * 2);
pVar->df_string.dwLen = dwLenWC* 2;
memcpy(pVar->df_string.szValue, pBuffer, pVar->df_string.dwLen);
free(pBuffer);
#endif
break;
case CSCP_DT_BINARY:
pVar = (CSCP_DF *)malloc(12 + dwSize);
pVar->df_string.dwLen = dwSize;
if ((pVar->df_string.dwLen > 0) && (pValue != NULL))
memcpy(pVar->df_string.szValue, pValue, pVar->df_string.dwLen);
break;
default:
return NULL; // Invalid data type, unable to handle
}
pVar->dwVarId = dwVarId;
pVar->bType = bType;
// Check if variable exists
dwIndex = FindVariable(pVar->dwVarId);
if (dwIndex == INVALID_INDEX) // Add new variable to list
{
m_ppVarList = (CSCP_DF **)realloc(m_ppVarList, sizeof(CSCP_DF *) * (m_dwNumVar + 1));
m_ppVarList[m_dwNumVar] = pVar;
m_dwNumVar++;
}
else // Replace existing variable
{
free(m_ppVarList[dwIndex]);
m_ppVarList[dwIndex] = pVar;
}
return (bType == CSCP_DT_INT16) ? ((void *)((BYTE *)pVar + 6)) : ((void *)((BYTE *)pVar + 8));
}
TCHAR *CSCPMessage::GetVariableStr(DWORD dwVarId, TCHAR *pszBuffer, DWORD dwBufSize)
{
void *pValue;
TCHAR *pStr = NULL;
DWORD dwLen, dwLenMB;
if ((pszBuffer != NULL) && (dwBufSize == 0))
return NULL; // non-sense combination
pValue = Get(dwVarId, CSCP_DT_STRING);
if (pValue != NULL)
{
if (pszBuffer == NULL)
{
#if defined(UNICODE) && defined(UNICODE_UCS4)
pStr = (TCHAR *)malloc(*((DWORD *)pValue) * 2 + 4);
dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
ucs2_to_ucs4((UCS2CHAR *)((BYTE *)pValue + 4), dwLen, pStr, dwLen + 1);
pStr[dwLen] = 0;
#elif defined(UNICODE) && defined(UNICODE_UCS2)
pStr = (TCHAR *)malloc(*((DWORD *)pValue) + 2);
dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
memcpy(pStr, (BYTE *)pValue + 4, dwLen * 2);
pStr[dwLen] = 0;
#else
dwLenMB = ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, NULL, 0);
pStr = (TCHAR *)malloc(dwLenMB + 1);
dwLen = (pszBuffer == NULL) ? dwLenMB : min(dwLenMB, dwBufSize - 1);
ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, pStr, dwLen + 1);
pStr[dwLen] = 0;
#endif
}
else
{
pStr = pszBuffer;
#if defined(UNICODE) && defined(UNICODE_UCS4)
dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
ucs2_to_ucs4((UCS2CHAR *)((BYTE *)pValue + 4), dwLen, pStr, dwLen + 1);
pStr[dwLen] = 0;
#elif defined(UNICODE) && defined(UNICODE_UCS2)
dwLen = (pszBuffer == NULL) ? (*((DWORD *)pValue) / 2) : min(*((DWORD *)pValue) / 2, dwBufSize - 1);
memcpy(pStr, (BYTE *)pValue + 4, dwLen * 2);
pStr[dwLen] = 0;
#else
dwLenMB = ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, NULL, 0);
dwLen = (pszBuffer == NULL) ? dwLenMB : min(dwLenMB, dwBufSize - 1);
ucs2_to_mb((UCS2CHAR *)((BYTE *)pValue + 4), *((DWORD *)pValue) / 2, pStr, dwLen + 1);
pStr[dwLen] = 0;
#endif
}
}
else
{
if (pszBuffer != NULL)
{
pStr = pszBuffer;
pStr[0] = 0;
}
}
return pStr;
}