hw/xwin: Don't allocate one wchar_t too much for unicode text placed on the Windows clipboard

The count of wchar_t returned by MultiByteToWideChar() includes the terminating
null character, so don't add one to it.

Also, reduce the scope of various length variables

Signed-off-by: Colin Harrison <colin.harrison@virgin.net>
Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
This commit is contained in:
Colin Harrison 2014-09-27 11:50:11 +01:00 committed by Jon TURNEY
parent d172cd630d
commit 5920433c3a

View File

@ -44,6 +44,7 @@
#endif #endif
#include <limits.h> #include <limits.h>
#include <wchar.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
@ -208,14 +209,11 @@ winClipboardFlushXEvents(HWND hwnd,
int iReturn; int iReturn;
HGLOBAL hGlobal = NULL; HGLOBAL hGlobal = NULL;
XICCEncodingStyle xiccesStyle; XICCEncodingStyle xiccesStyle;
int iConvertDataLen = 0;
char *pszConvertData = NULL; char *pszConvertData = NULL;
char *pszTextList[2] = { NULL }; char *pszTextList[2] = { NULL };
int iCount; int iCount;
char **ppszTextList = NULL; char **ppszTextList = NULL;
wchar_t *pwszUnicodeStr = NULL; wchar_t *pwszUnicodeStr = NULL;
int iUnicodeLen = 0;
int iReturnDataLen = 0;
Bool fAbort = FALSE; Bool fAbort = FALSE;
Bool fCloseClipboard = FALSE; Bool fCloseClipboard = FALSE;
Bool fSetClipboardData = TRUE; Bool fSetClipboardData = TRUE;
@ -381,7 +379,7 @@ winClipboardFlushXEvents(HWND hwnd,
/* Convert the Unicode string to UTF8 (MBCS) */ /* Convert the Unicode string to UTF8 (MBCS) */
if (data->fUseUnicode) { if (data->fUseUnicode) {
iConvertDataLen = WideCharToMultiByte(CP_UTF8, int iConvertDataLen = WideCharToMultiByte(CP_UTF8,
0, 0,
(LPCWSTR) pszGlobalData, (LPCWSTR) pszGlobalData,
-1, NULL, 0, NULL, NULL); -1, NULL, 0, NULL, NULL);
@ -396,7 +394,6 @@ winClipboardFlushXEvents(HWND hwnd,
} }
else { else {
pszConvertData = strdup(pszGlobalData); pszConvertData = strdup(pszGlobalData);
iConvertDataLen = strlen(pszConvertData) + 1;
} }
/* Convert DOS string to UNIX string */ /* Convert DOS string to UNIX string */
@ -541,7 +538,6 @@ winClipboardFlushXEvents(HWND hwnd,
*/ */
case SelectionNotify: case SelectionNotify:
winDebug("winClipboardFlushXEvents - SelectionNotify\n"); winDebug("winClipboardFlushXEvents - SelectionNotify\n");
{ {
char *pszAtomName; char *pszAtomName;
@ -620,8 +616,7 @@ winClipboardFlushXEvents(HWND hwnd,
/* Conversion succeeded or some unconvertible characters */ /* Conversion succeeded or some unconvertible characters */
if (ppszTextList != NULL) { if (ppszTextList != NULL) {
int i; int i;
int iReturnDataLen = 0;
iReturnDataLen = 0;
for (i = 0; i < iCount; i++) { for (i = 0; i < iCount; i++) {
iReturnDataLen += strlen(ppszTextList[i]); iReturnDataLen += strlen(ppszTextList[i]);
} }
@ -672,12 +667,12 @@ winClipboardFlushXEvents(HWND hwnd,
if (data->fUseUnicode) { if (data->fUseUnicode) {
/* Find out how much space needed to convert MBCS to Unicode */ /* Find out how much space needed to convert MBCS to Unicode */
iUnicodeLen = MultiByteToWideChar(CP_UTF8, int iUnicodeLen = MultiByteToWideChar(CP_UTF8,
0, 0,
pszReturnData, -1, NULL, 0); pszReturnData, -1, NULL, 0);
/* Allocate memory for the Unicode string */ /* NOTE: iUnicodeLen includes space for null terminator */
pwszUnicodeStr = malloc(sizeof(wchar_t) * (iUnicodeLen + 1)); pwszUnicodeStr = malloc(sizeof(wchar_t) * iUnicodeLen);
if (!pwszUnicodeStr) { if (!pwszUnicodeStr) {
ErrorF("winClipboardFlushXEvents - SelectionNotify " ErrorF("winClipboardFlushXEvents - SelectionNotify "
"malloc failed for pwszUnicodeStr, aborting.\n"); "malloc failed for pwszUnicodeStr, aborting.\n");
@ -695,9 +690,10 @@ winClipboardFlushXEvents(HWND hwnd,
/* Allocate global memory for the X clipboard data */ /* Allocate global memory for the X clipboard data */
hGlobal = GlobalAlloc(GMEM_MOVEABLE, hGlobal = GlobalAlloc(GMEM_MOVEABLE,
sizeof(wchar_t) * (iUnicodeLen + 1)); sizeof(wchar_t) * iUnicodeLen);
} }
else { else {
int iConvertDataLen = 0;
pszConvertData = strdup(pszReturnData); pszConvertData = strdup(pszReturnData);
iConvertDataLen = strlen(pszConvertData) + 1; iConvertDataLen = strlen(pszConvertData) + 1;
@ -730,8 +726,7 @@ winClipboardFlushXEvents(HWND hwnd,
/* Copy the returned string into the global memory */ /* Copy the returned string into the global memory */
if (data->fUseUnicode) { if (data->fUseUnicode) {
memcpy(pszGlobalData, wcscpy((wchar_t *)pszGlobalData, pwszUnicodeStr);
pwszUnicodeStr, sizeof(wchar_t) * (iUnicodeLen + 1));
free(pwszUnicodeStr); free(pwszUnicodeStr);
pwszUnicodeStr = NULL; pwszUnicodeStr = NULL;
} }