OSDN Git Service

Fix bugs of corruption during conversion from Shift_JIS to UTF-8.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 1 Jul 2012 13:07:27 +0000 (22:07 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 1 Jul 2012 13:07:27 +0000 (22:07 +0900)
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
codecnv.c
config.h
mbswrapper.c

index 54141c2..e6417d9 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index ce0d191..904a56c 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index a313d1a..f9a9e37 100644 (file)
--- a/codecnv.c
+++ b/codecnv.c
@@ -1517,20 +1517,18 @@ int ConvUTF8NtoSJIS_TruncateToDelimiter(char* pUTF8, int UTF8Length, int* pNewUT
        {\r
                UTF8Length--;\r
                UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
        {\r
                UTF8Length--;\r
                UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, pUTF16, UTF16Length);\r
-               SJISLength = NewSJISLength;\r
                NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
        }\r
        free(pUTF16);\r
        // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り\r
                NewSJISLength = WideCharToMultiByte(CP_ACP, 0, pUTF16, UTF16Length, NULL, 0, NULL, NULL);\r
        }\r
        free(pUTF16);\r
        // UTF-16 LE変換した時に文字数が増減する位置がUTF-8の区切り\r
-       NewUTF16Length = UTF16Length;\r
-       while(UTF8Length > 0 && NewUTF16Length >= UTF16Length)\r
-       {\r
-               UTF8Length--;\r
-               UTF16Length = NewUTF16Length;\r
-               NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
-       }\r
        if(pNewUTF8Length)\r
        {\r
        if(pNewUTF8Length)\r
        {\r
+               NewUTF16Length = UTF16Length;\r
+               while(UTF8Length > 0 && NewUTF16Length >= UTF16Length)\r
+               {\r
+                       UTF8Length--;\r
+                       NewUTF16Length = MultiByteToWideChar(CP_UTF8, 0, pUTF8, UTF8Length, NULL, 0);\r
+               }\r
                if(UTF16Length > 0)\r
                        UTF8Length++;\r
                *pNewUTF8Length = UTF8Length;\r
                if(UTF16Length > 0)\r
                        UTF8Length++;\r
                *pNewUTF8Length = UTF8Length;\r
@@ -1582,7 +1580,6 @@ int ConvUTF8NtoSJIS(CODECONVINFO *cInfo)
                        SrcLength = SrcLength / 2;\r
                }\r
        }\r
                        SrcLength = SrcLength / 2;\r
                }\r
        }\r
-       // UTF-8の場合、不完全な文字は常に変換されない\r
        UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);\r
 \r
        // サイズ0 or バッファサイズより大きい場合は\r
        UTF16Length = MultiByteToWideChar(CP_UTF8, 0, pSrc, SrcLength, NULL, 0);\r
 \r
        // サイズ0 or バッファサイズより大きい場合は\r
index c6365fa..fd266f2 100644 (file)
--- a/config.h
+++ b/config.h
@@ -3,12 +3,6 @@
 #define HAVE_OPENVMS\r
 \r
 // 全体に影響する設定はここに記述する予定\r
 #define HAVE_OPENVMS\r
 \r
 // 全体に影響する設定はここに記述する予定\r
-// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する\r
-#include "mbswrapper.h"\r
-// OpenSSL用ソケットラッパーを使用する\r
-#include "socketwrapper.h"\r
-// プロセスをDLL Injectionから保護する\r
-#include "protectprocess.h"\r
 // 使用するCPUを1個に限定する(マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策)\r
 //#define DISABLE_MULTI_CPUS\r
 // ファイル転送用のネットワークバッファを無効にする(通信中止後にリモートのディレクトリが表示されないバグ対策)\r
 // 使用するCPUを1個に限定する(マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策)\r
 //#define DISABLE_MULTI_CPUS\r
 // ファイル転送用のネットワークバッファを無効にする(通信中止後にリモートのディレクトリが表示されないバグ対策)\r
 /* HP NonStop Server 用のコードを有効にする */\r
 #define HAVE_TANDEM\r
 \r
 /* HP NonStop Server 用のコードを有効にする */\r
 #define HAVE_TANDEM\r
 \r
+// 内部をUTF-8として扱いマルチバイト文字ワイド文字APIラッパーを使用する\r
+#include "mbswrapper.h"\r
+// OpenSSL用ソケットラッパーを使用する\r
+#include "socketwrapper.h"\r
+// プロセスをDLL Injectionから保護する\r
+#include "protectprocess.h"\r
+\r
index 4bc022c..fa04fee 100644 (file)
@@ -715,6 +715,7 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB
        LPCSTR pMultiLimit;\r
        LPWSTR pWideLimit;\r
        DWORD Code;\r
        LPCSTR pMultiLimit;\r
        LPWSTR pWideLimit;\r
        DWORD Code;\r
+       int TempCount;\r
        WCHAR Temp[8];\r
        if(CodePage != CP_UTF8 || dwFlags != 0)\r
                return MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);\r
        WCHAR Temp[8];\r
        if(CodePage != CP_UTF8 || dwFlags != 0)\r
                return MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);\r
@@ -731,8 +732,9 @@ int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiB
                        continue;\r
                if(lpWideCharStr)\r
                {\r
                        continue;\r
                if(lpWideCharStr)\r
                {\r
-                       WideCount += PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code);\r
-                       if(lpWideCharStr >= pWideLimit)\r
+                       TempCount = PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code);\r
+                       WideCount += TempCount;\r
+                       if(TempCount == 0 && lpWideCharStr >= pWideLimit)\r
                        {\r
                                WideCount = 0;\r
                                break;\r
                        {\r
                                WideCount = 0;\r
                                break;\r
@@ -752,6 +754,7 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC
        LPCWSTR pWideLimit;\r
        LPSTR pMultiLimit;\r
        DWORD Code;\r
        LPCWSTR pWideLimit;\r
        LPSTR pMultiLimit;\r
        DWORD Code;\r
+       int TempCount;\r
        CHAR Temp[8];\r
        if(CodePage != CP_UTF8 || dwFlags != 0)\r
                return WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar);\r
        CHAR Temp[8];\r
        if(CodePage != CP_UTF8 || dwFlags != 0)\r
                return WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar);\r
@@ -768,8 +771,9 @@ int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideC
                        continue;\r
                if(lpMultiByteStr)\r
                {\r
                        continue;\r
                if(lpMultiByteStr)\r
                {\r
-                       MultiCount += PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code);\r
-                       if(lpMultiByteStr >= pMultiLimit)\r
+                       TempCount = PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code);\r
+                       MultiCount += TempCount;\r
+                       if(TempCount == 0 && lpMultiByteStr >= pMultiLimit)\r
                        {\r
                                MultiCount = 0;\r
                                break;\r
                        {\r
                                MultiCount = 0;\r
                                break;\r