From a2f250dd4ff71d4fd529047d9af93eeebc08977c Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Tue, 5 Sep 2017 09:24:55 +0200 Subject: [PATCH] + fixing crash in case of wrong Encoding (detection) --- src/Edit.c | 81 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/src/Edit.c b/src/Edit.c index 428610954..2e68a4745 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -1623,22 +1623,32 @@ BOOL EditLoadFile( Encoding_SciSetCodePage(hwnd,*iEncoding); lpDataUTF8 = GlobalAlloc(GPTR,(cbData * 3) + 2); - cbData = WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, + + DWORD convCnt = (DWORD)WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, (bBOM) ? (cbData)/sizeof(WCHAR) : cbData/sizeof(WCHAR) + 1,lpDataUTF8,(int)GlobalSize(lpDataUTF8),NULL,NULL); - if (cbData == 0) { + if (convCnt == 0) { *pbUnicodeErr = TRUE; - cbData = WideCharToMultiByte(CP_ACP,0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, + convCnt = (DWORD)WideCharToMultiByte(CP_ACP,0,(bBOM) ? (LPWSTR)lpData + 1 : (LPWSTR)lpData, (-1),lpDataUTF8,(int)GlobalSize(lpDataUTF8),NULL,NULL); } - GlobalFree(lpData); - Encoding_SciSetCodePage(hwnd,*iEncoding); - EditSetNewText(hwnd,"",0); - FileVars_Init(lpDataUTF8,cbData-1,&fvCurFile); - EditSetNewText(hwnd,lpDataUTF8,cbData-1); - *iEOLMode = EditDetectEOLMode(hwnd,lpDataUTF8,cbData-1); - GlobalFree(lpDataUTF8); + if (convCnt != 0) { + GlobalFree(lpData); + Encoding_SciSetCodePage(hwnd,*iEncoding); + EditSetNewText(hwnd,"",0); + FileVars_Init(lpDataUTF8,convCnt - 1,&fvCurFile); + EditSetNewText(hwnd,lpDataUTF8,convCnt - 1); + *iEOLMode = EditDetectEOLMode(hwnd,lpDataUTF8,convCnt - 1); + GlobalFree(lpDataUTF8); + } + else { + GlobalFree(lpDataUTF8); + GlobalFree(lpData); + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); + return FALSE; + } } else { @@ -1672,11 +1682,6 @@ BOOL EditLoadFile( } else { - - UINT uCodePage = CP_UTF8; - LPWSTR lpDataWide; - int cbDataWide; - if (iSrcEnc != CPI_NONE) *iEncoding = iSrcEnc; else { @@ -1698,23 +1703,39 @@ BOOL EditLoadFile( if ((mEncoding[*iEncoding].uFlags & NCP_8BIT && mEncoding[*iEncoding].uCodePage != CP_UTF7) || (mEncoding[*iEncoding].uCodePage == CP_UTF7 && IsUTF7(lpData,cbData))) { - uCodePage = mEncoding[*iEncoding].uCodePage; + UINT uCodePage = mEncoding[*iEncoding].uCodePage; - lpDataWide = GlobalAlloc(GPTR,cbData * 2 + 16); - cbDataWide = MultiByteToWideChar(uCodePage,0,lpData,cbData,lpDataWide,(int)GlobalSize(lpDataWide)/sizeof(WCHAR)); + LPWSTR lpDataWide = GlobalAlloc(GPTR,cbData * 2 + 16); + int cbDataWide = MultiByteToWideChar(uCodePage,0,lpData,cbData,lpDataWide,(int)GlobalSize(lpDataWide)/sizeof(WCHAR)); + if (cbDataWide != 0) + { + GlobalFree(lpData); + lpData = GlobalAlloc(GPTR,cbDataWide * 3 + 16); - GlobalFree(lpData); - lpData = GlobalAlloc(GPTR,cbDataWide * 3 + 16); - - Encoding_SciSetCodePage(hwnd,*iEncoding); - cbData = WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL); - - GlobalFree(lpDataWide); - EditSetNewText(hwnd,"",0); - EditSetNewText(hwnd,lpData,cbData); - *iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData); - - GlobalFree(lpData); + Encoding_SciSetCodePage(hwnd,*iEncoding); + cbData = WideCharToMultiByte(Encoding_SciGetCodePage(hwnd),0,lpDataWide,cbDataWide,lpData,(int)GlobalSize(lpData),NULL,NULL); + if (cbData != 0) { + GlobalFree(lpDataWide); + EditSetNewText(hwnd,"",0); + EditSetNewText(hwnd,lpData,cbData); + *iEOLMode = EditDetectEOLMode(hwnd,lpData,cbData); + GlobalFree(lpData); + } + else { + GlobalFree(lpDataWide); + GlobalFree(lpData); + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); + return FALSE; + } + } + else { + GlobalFree(lpDataWide); + GlobalFree(lpData); + Encoding_Source(CPI_NONE); + Encoding_SrcWeak(CPI_NONE); + return FALSE; + } } else { *iEncoding = Encoding_IsValid(iSrcEnc) ? iSrcEnc : iDefaultEncoding;