OSDN Git Service

バッファオーバーの可能性に関する修正と、変換失敗時のメッセージ表示追加
authorHabu <habu@users.sourceforge.jp>
Thu, 27 Feb 2014 14:36:04 +0000 (23:36 +0900)
committerHabu <habu@users.sourceforge.jp>
Fri, 28 Feb 2014 12:30:29 +0000 (21:30 +0900)
src/japanese.c

index 5aef589..9e604ee 100644 (file)
@@ -401,26 +401,32 @@ static bool is_utf8_str(cptr str)
  * @param utf8_str ÊÑ´¹¤¹¤ëUTF-8¤Îʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿
  * @param sys_str_buffer ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿
  * @param sys_str_buflen ÊÑ´¹¤·¤¿¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤Îʸ»úÎó¤ò³ÊǼ¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎŤµ
- * @return ¤Ê¤·
+ * @return ÊÑ´¹¤ËÀ®¸ù¤·¤¿¾ì¹çTRUE¡¢¼ºÇÔ¤·¤¿¾ì¹çFALSE¤òÊÖ¤¹
  */
 #ifdef SJIS
 #ifdef WINDOWS
 #include <Windows.h>
-static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
+static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
 {
        LPWSTR utf16buf;
-       int input_str_len = strlen(utf8_str);
-       int len;
+       int input_len = strlen(utf8_str) + 1; /* include termination character */
 
-       C_MAKE(utf16buf, input_str_len, WCHAR);
+       C_MAKE(utf16buf, input_len, WCHAR);
 
-       MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8_str, input_str_len, (LPWSTR)utf16buf, input_str_len);
+       /* UTF-8 -> UTF-16 */
+       if (MultiByteToWideChar( CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
+               C_KILL(utf16buf, input_len, WCHAR);
+               return FALSE;   
+       }
  
-       len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)utf16buf, -1, (LPSTR)sys_str_buffer, sys_str_buflen, NULL, NULL );
-
-       sys_str_buffer[len] = '\0';
+       /* UTF-8 -> SJIS(CP932) */
+       if (WideCharToMultiByte( CP_ACP, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, NULL, NULL ) == 0) {
+               C_KILL(utf16buf, input_len, WCHAR);
+               return FALSE;
+       }
 
-       C_KILL(utf16buf, input_str_len, WCHAR);
+       C_KILL(utf16buf, input_len, WCHAR);
+       return TRUE;
 }
 #endif
 #endif
@@ -429,6 +435,7 @@ static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_bufl
  * @brief ¼õ¤±¼è¤Ã¤¿Ê¸»úÎó¤Îʸ»ú¥³¡¼¥É¤ò¿äÄꤷ¡¢¥·¥¹¥Æ¥à¤Îʸ»ú¥³¡¼¥É¤ØÊÑ´¹¤¹¤ë
  * @param strbuf ÊÑ´¹¤¹¤ëʸ»úÎó¤ò³ÊǼ¤·¤¿¥Ð¥Ã¥Õ¥¡¤Ø¤Î¥Ý¥¤¥ó¥¿¡£
  *               ¥Ð¥Ã¥Õ¥¡¤ÏÊÑ´¹¤·¤¿Ê¸»úÎó¤Ç¾å½ñ¤­¤µ¤ì¤ë¡£
+ *               UTF-8¤«¤éSJIS¤â¤·¤¯¤ÏEUC¤Ø¤ÎÊÑ´¹¤òÁÛÄꤷ¤Æ¤¤¤ë¤Î¤Ç¥Ð¥Ã¥Õ¥¡¤ÎŤµ¤¬Â­¤ê¤Ê¤¯¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¡£
  * @param buflen ¥Ð¥Ã¥Õ¥¡¤ÎŤµ¡£
  * @return ¤Ê¤·
  */
@@ -439,8 +446,11 @@ void guess_convert_to_system_encoding(char* strbuf, int buflen)
        if (is_utf8_str(strbuf)) {
                char* work;
                C_MAKE(work, buflen, char);
-               strncpy(work, strbuf, buflen);
-               utf8_to_sys(work, strbuf, buflen);
+               my_strcpy(work, strbuf, buflen);
+               if (!utf8_to_sys(work, strbuf, buflen)) {
+                       msg_print("·Ù¹ð:ʸ»ú¥³¡¼¥É¤ÎÊÑ´¹¤Ë¼ºÇÔ¤·¤Þ¤·¤¿");
+                       msg_print(NULL);
+               }
                C_KILL(work, buflen, char);
        }
 }