OSDN Git Service

[Fix] X11 ドライバの buffer over-read を修正
authortaotao54321 <taotao54321@gmail.com>
Thu, 11 Feb 2021 18:39:34 +0000 (03:39 +0900)
committertaotao54321 <taotao54321@gmail.com>
Thu, 11 Feb 2021 18:39:34 +0000 (03:39 +0900)
Infofnt_text_std() に渡されたバイト列をバッファへコピーする際に
angband_strcpy() を使っているのが原因。
angband_strcpy() は入力文字列の長さを返すが、このとき strlen() 相当の処
理が行われる。しかし、Infofnt_text_std() に渡されるデータは term_win 構
造体内のバイト列であり、これは0終端されていない。よってこれを
angband_strcpy() に渡すのは誤り。

よって、単に memcpy() でコピーする。sbuf のサイズは十分だと仮定する。
もし len が sbuf のサイズより大きいと壊れるが、それは元のコードでも同じ
(iconv() に len を実質そのまま渡しているため)。

src/main-x11.c

index 1c66c9f..ee93b5e 100644 (file)
@@ -911,7 +911,7 @@ static errr Infofnt_text_std(int x, int y, concptr str, int len)
                char *kanji = malloc(outlen);
                char *sp; char *kp = kanji;
                char sbuf[1024];
-               angband_strcpy(sbuf, str, sizeof(sbuf));
+               memcpy(sbuf, str, (size_t)len);
                sp = sbuf;
                iconv(cd, &sp, &inlen, &kp, &outlen);
                iconv_close(cd);