• R/O
  • HTTP
  • SSH
  • HTTPS

hengband: Commit

変愚蛮怒のメインリポジトリです


Commit MetaInfo

Revision6be94b743ecfd7d14feca82d3f1792dd02527720 (tree)
Time2014-02-28 21:30:29
AuthorHabu <habu@user...>
CommiterHabu

Log Message

バッファオーバーの可能性に関する修正と、変換失敗時のメッセージ表示追加

Change Summary

Incremental Difference

--- a/src/japanese.c
+++ b/src/japanese.c
@@ -401,26 +401,32 @@ static bool is_utf8_str(cptr str)
401401 * @param utf8_str 変換するUTF-8の文字列へのポインタ
402402 * @param sys_str_buffer 変換したシステムの文字コードの文字列を格納するバッファへのポインタ
403403 * @param sys_str_buflen 変換したシステムの文字コードの文字列を格納するバッファの長さ
404- * @return なし
404+ * @return 変換に成功した場合TRUE、失敗した場合FALSEを返す
405405 */
406406 #ifdef SJIS
407407 #ifdef WINDOWS
408408 #include <Windows.h>
409-static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
409+static bool utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_buflen)
410410 {
411411 LPWSTR utf16buf;
412- int input_str_len = strlen(utf8_str);
413- int len;
412+ int input_len = strlen(utf8_str) + 1; /* include termination character */
414413
415- C_MAKE(utf16buf, input_str_len, WCHAR);
414+ C_MAKE(utf16buf, input_len, WCHAR);
416415
417- MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)utf8_str, input_str_len, (LPWSTR)utf16buf, input_str_len);
416+ /* UTF-8 -> UTF-16 */
417+ if (MultiByteToWideChar( CP_UTF8, 0, utf8_str, input_len, utf16buf, input_len) == 0) {
418+ C_KILL(utf16buf, input_len, WCHAR);
419+ return FALSE;
420+ }
418421
419- len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)utf16buf, -1, (LPSTR)sys_str_buffer, sys_str_buflen, NULL, NULL );
420-
421- sys_str_buffer[len] = '\0';
422+ /* UTF-8 -> SJIS(CP932) */
423+ if (WideCharToMultiByte( CP_ACP, 0, utf16buf, -1, sys_str_buffer, sys_str_buflen, NULL, NULL ) == 0) {
424+ C_KILL(utf16buf, input_len, WCHAR);
425+ return FALSE;
426+ }
422427
423- C_KILL(utf16buf, input_str_len, WCHAR);
428+ C_KILL(utf16buf, input_len, WCHAR);
429+ return TRUE;
424430 }
425431 #endif
426432 #endif
@@ -429,6 +435,7 @@ static void utf8_to_sys(cptr utf8_str, char* sys_str_buffer, size_t sys_str_bufl
429435 * @brief 受け取った文字列の文字コードを推定し、システムの文字コードへ変換する
430436 * @param strbuf 変換する文字列を格納したバッファへのポインタ。
431437 * バッファは変換した文字列で上書きされる。
438+ * UTF-8からSJISもしくはEUCへの変換を想定しているのでバッファの長さが足りなくなることはない。
432439 * @param buflen バッファの長さ。
433440 * @return なし
434441 */
@@ -439,8 +446,11 @@ void guess_convert_to_system_encoding(char* strbuf, int buflen)
439446 if (is_utf8_str(strbuf)) {
440447 char* work;
441448 C_MAKE(work, buflen, char);
442- strncpy(work, strbuf, buflen);
443- utf8_to_sys(work, strbuf, buflen);
449+ my_strcpy(work, strbuf, buflen);
450+ if (!utf8_to_sys(work, strbuf, buflen)) {
451+ msg_print("警告:文字コードの変換に失敗しました");
452+ msg_print(NULL);
453+ }
444454 C_KILL(work, buflen, char);
445455 }
446456 }
Show on old repository browser