From 95252680a90f1fdcebeb53ef5834fcab5144493b Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 10 Dec 2003 07:48:06 +0000 Subject: [PATCH] tal_string-must-allocate-memory-20031209 The tal_string routines must always allocate memory otherwise they double free strings. --- src/WINNT/talocale/tal_string.cpp | 70 ++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/WINNT/talocale/tal_string.cpp b/src/WINNT/talocale/tal_string.cpp index 59793a6..b9979e5 100644 --- a/src/WINNT/talocale/tal_string.cpp +++ b/src/WINNT/talocale/tal_string.cpp @@ -1491,58 +1491,68 @@ void FreeString (LPCVOID pszString, LPCVOID pszOriginalString) LPSTR StringToAnsi (LPCTSTR pszOriginal) { -#ifndef UNICODE - return (LPSTR)pszOriginal; + if (!pszOriginal) + return NULL; + LPSTR pszTargetA; + int len = lstrlen(pszOriginal); + if ((pszTargetA = AllocateAnsi (1+len)) != NULL) { +#ifdef UNICODE + CopyUnicodeToAnsi (pszTargetA, pszOriginal); #else - if (!pszOriginal) - return NULL; - LPSTR pszTargetA; - if ((pszTargetA = AllocateAnsi (1+lstrlen(pszOriginal))) != NULL) - CopyUnicodeToAnsi (pszTargetA, pszOriginal); - return pszTargetA; + lstrcpy (pszTargetA, (LPSTR)pszOriginal); #endif + } + return pszTargetA; } LPTSTR AnsiToString (LPCSTR pszOriginalA) { -#ifndef UNICODE - return (LPTSTR)pszOriginalA; + if (!pszOriginalA) + return NULL; + LPTSTR pszTarget; + int lenA = lstrlenA(pszOriginalA); + if ((pszTarget = AllocateString (1+lenA)) != NULL) { +#ifdef UNICODE + CopyAnsiToUnicode (pszTarget, pszOriginalA); #else - if (!pszOriginalA) - return NULL; - LPTSTR pszTarget; - if ((pszTarget = AllocateString (1+lstrlenA(pszOriginalA))) != NULL) - CopyAnsiToUnicode (pszTarget, pszOriginalA); - return pszTarget; + lstrcpy (pszTargetA, (LPSTR)pszOriginal); +#endif + } + return pszTarget; #endif } LPWSTR StringToUnicode (LPCTSTR pszOriginal) { + if (!pszOriginal) + return NULL; + LPWSTR pszTargetW; + int len = lstrlen(pszOriginal); + if ((pszTargetW = AllocateUnicode (1+len)) != NULL) { #ifdef UNICODE - return (LPWSTR)pszOriginal; + CopyAnsiToUnicode (pszTargetW, pszOriginal); #else - if (!pszOriginal) - return NULL; - LPWSTR pszTargetW; - if ((pszTargetW = AllocateUnicode (1+lstrlen(pszOriginal))) != NULL) - CopyAnsiToUnicode (pszTargetW, pszOriginal); - return pszTargetW; + lstrcpy ((LPSTR)pszTargetW, (LPSTR)pszOriginal); +#endif + } + return pszTargetW; #endif } LPTSTR UnicodeToString (LPCWSTR pszOriginalW) { + if (!pszOriginalW) + return NULL; + LPTSTR pszTarget; + if ((pszTarget = AllocateString (1+lstrlenW(pszOriginalW))) != NULL) { #ifdef UNICODE - return (LPTSTR)pszOriginalW; + CopyUnicodeToAnsi (pszTarget, pszOriginalW); #else - if (!pszOriginalW) - return NULL; - LPTSTR pszTarget; - if ((pszTarget = AllocateString (1+lstrlenW(pszOriginalW))) != NULL) - CopyUnicodeToAnsi (pszTarget, pszOriginalW); - return pszTarget; + lstrcpyA ((LPSTR)pszTarget, pszOriginalW); +#endif + } + return pszTarget; #endif } -- 1.9.4