[Winmerge-svn] SF.net SVN: winmerge:[7431] branches/R2_14/Src
Windows visual diff and merge for files and directories
Brought to you by:
christianlist,
grimmdp
From: <ge...@us...> - 2010-11-18 13:52:42
|
Revision: 7431 http://winmerge.svn.sourceforge.net/winmerge/?rev=7431&view=rev Author: gerundt Date: 2010-11-18 13:52:36 +0000 (Thu, 18 Nov 2010) Log Message: ----------- Catch out of memory error when converting byte array to string. Modified Paths: -------------- branches/R2_14/Src/Common/UniFile.cpp branches/R2_14/Src/Common/unicoder.cpp branches/R2_14/Src/Common/unicoder.h branches/R2_14/Src/UniMarkdownFile.cpp Modified: branches/R2_14/Src/Common/UniFile.cpp =================================================================== --- branches/R2_14/Src/Common/UniFile.cpp 2010-11-17 13:42:16 UTC (rev 7430) +++ branches/R2_14/Src/Common/UniFile.cpp 2010-11-18 13:52:36 UTC (rev 7431) @@ -456,7 +456,7 @@ * @param [out] line Line read. * @param [out] eol EOL bytes read (if any). * @param [out] lossy TRUE if there were lossy encoding. - * @return TRUE if there is more lines to read, TRUE when last line is read. + * @return true if there is more lines to read, false when last line is read. */ bool UniMemFile::ReadString(String & line, String & eol, bool * lossy) { @@ -581,7 +581,11 @@ RecordZero(m_txtstats, offset); } } - line = ucr::maketstring((LPCSTR)m_current, eolptr - m_current, m_codepage, lossy); + bool success = ucr::maketstring(line, (LPCSTR)m_current, eolptr - m_current, m_codepage, lossy); + if (!success) + { + return false; + } if (lossy && *lossy) ++m_txtstats.nlosses; if (!eof) Modified: branches/R2_14/Src/Common/unicoder.cpp =================================================================== --- branches/R2_14/Src/Common/unicoder.cpp 2010-11-17 13:42:16 UTC (rev 7430) +++ branches/R2_14/Src/Common/unicoder.cpp 2010-11-18 13:52:36 UTC (rev 7431) @@ -463,18 +463,27 @@ } /** - * @brief Convert series of bytes (8-bit chars) to TCHARs, using specified codepage + * @brief Convert series of bytes (8-bit chars) to TCHARs. * - * TODO: This doesn't inform the caller whether translation was lossy + * @param [out] str String returned. + * @param [in] lpd Original byte array to convert. + * @param [in] len Length of the original byte array. + * @param [in] codepage Codepage used. + * @param [out] lossy Was conversion lossy? + * @return true if conversion succeeds, false otherwise. + * @todo This doesn't inform the caller whether translation was lossy * In fact, this doesn't even know. Probably going to have to make * two passes, the first with MB_ERR_INVALID_CHARS. Ugh. :( */ -String maketstring(const char* lpd, unsigned int len, int codepage, bool * lossy) +bool maketstring(String & str, const char* lpd, unsigned int len, int codepage, bool * lossy) { int defcodepage = getDefaultCodepage(); if (!len) - return _T(""); + { + str.clear(); + return true; + } // 0 is a valid value (CP_ACP)! if (codepage == -1) @@ -485,8 +494,17 @@ // TCHAR is wchar_t, so convert into String (str) DWORD flags = MB_ERR_INVALID_CHARS; int wlen = len * 2 + 6; - String str; - str.resize(wlen); + + try + { + str.resize(wlen); + } + catch (std::bad_alloc) + { + // Not enough memory - exit + return false; + } + LPWSTR wbuff = &*str.begin(); do { @@ -508,26 +526,35 @@ ASSERT(FALSE); --n; } - str.resize(n); - return str; + try + { + str.resize(n); + } + catch (std::bad_alloc) + { + // Not enough memory - exit + return false; + } + return true; } *lossy = true; flags ^= MB_ERR_INVALID_CHARS; } while (flags == 0 && GetLastError() == ERROR_NO_UNICODE_TRANSLATION); str = _T('?'); - return str; + return true; #else if (EqualCodepages(codepage, defcodepage)) { // trivial case, they want the bytes in the file interpreted in our current codepage // Only caveat is that input (lpd) is not zero-terminated - return String(lpd, len); + str = String(lpd, len); + return true; } - String str = CrossConvertToStringA(lpd, len, codepage, defcodepage, lossy); - return str; + str = CrossConvertToStringA(lpd, len, codepage, defcodepage, lossy); + return true; #endif } Modified: branches/R2_14/Src/Common/unicoder.h =================================================================== --- branches/R2_14/Src/Common/unicoder.h 2010-11-17 13:42:16 UTC (rev 7430) +++ branches/R2_14/Src/Common/unicoder.h 2010-11-18 13:52:36 UTC (rev 7431) @@ -50,7 +50,7 @@ String maketchar(unsigned int ch, bool & lossy); int writeBom(void* dest, UNICODESET unicoding); unsigned int get_unicode_char(unsigned char * ptr, UNICODESET unicoding, int codepage = 0); -String maketstring(const char* lpd, unsigned int len, int codepage, bool * lossy); +bool maketstring(String & str, const char* lpd, unsigned int len, int codepage, bool * lossy); String maketchar(unsigned int unich, bool & lossy); String maketchar(unsigned int unich, bool & lossy, unsigned int codepage); unsigned int byteToUnicode(unsigned char ch); Modified: branches/R2_14/Src/UniMarkdownFile.cpp =================================================================== --- branches/R2_14/Src/UniMarkdownFile.cpp 2010-11-17 13:42:16 UTC (rev 7430) +++ branches/R2_14/Src/UniMarkdownFile.cpp 2010-11-18 13:52:36 UTC (rev 7431) @@ -138,7 +138,8 @@ String UniMarkdownFile::maketstring(LPCSTR lpd, UINT len) { bool lossy = false; - String s = ucr::maketstring(lpd, len, m_codepage, &lossy); + String s; + ucr::maketstring(s, lpd, len, m_codepage, &lossy); if (lossy) ++m_txtstats.nlosses; return s; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |