GnuPGのバグっぽいな

この前、GnuPG の鍵生成のためのユーザーID に日本語の文字列を突っ込むテストをしていたところで文字化けが発生していた。これに関してソースコードを追っかけていたところ、バグらしきものが見つかった。
なお、ユーザーID の件とは実は関係がない。近くのコードを見ていたら、あれ? という部分が見つかったのだ。

ここでは、GnuPG 1.4.9 のソースを使う。
問題の箇所は GnuPG の g10/status.c の 644行目から始まる cpr_get_utf8 という関数。
コンソールその他から入力された文字列を UTF8 に変換して取り込むようになっている。

ここで、OS が Windows であることを前提に、このコードの「コンソールその他から入力された文字列」を得る部分を追いかけていくと、すぐ上の cpr_get 関数を呼び出している。cpr_get は util/ttyio.c の tty_get を呼び出し、tty_get は その上の方にある do_get を呼び出している。
そして、この do_get 関数の中で、コンソールからの入力文字列を検査しており、文字コード 0xa0 以上の入力値は受け付けないようになっている。マルチバイト文字列の2バイト目がこれにひっかかってしまうのだ。
これではコンソールから日本語の文字列を入力することができない。2バイト文字の1バイト目だけが通ってしまうので、2バイト文字の1バイト目だけが連続するという異常な文字列が生成されてしまう。

ここでもう一度、cpr_get_utf8 という関数を思い出してみると、そもそも2バイト文字が入力できない仕様になっているので、それを UTF8 に変換する関数は意味を成さないことになる。論理的に矛盾しているのだ。

この問題に関しては、GnuPG の作者が2バイト文字を受け付けたいのか、受け付けたくないのか、そのあたりの考えがはっきりしないので、安易なパッチを作るわけにはいかない。

ちなみにコンソールから日本語のユーザーID を入力すると文字化けしてしまった件も、この「0xa0以上の入力値を受け付けない」仕様が原因だった。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック