Infofnt_text_std() に渡されたバイト列をバッファへコピーする際に
angband_strcpy() を使っているのが原因。
angband_strcpy() は入力文字列の長さを返すが、このとき strlen() 相当の処
理が行われる。しかし、Infofnt_text_std() に渡されるデータは term_win 構
造体内のバイト列であり、これは0終端されていない。よってこれを
angband_strcpy() に渡すのは誤り。
よって、単に memcpy() でコピーする。sbuf のサイズは十分だと仮定する。
もし len が sbuf のサイズより大きいと壊れるが、それは元のコードでも同じ
(iconv() に 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);