Mitsuru Chinen
mchin****@yamat*****
2003年 9月 11日 (木) 20:14:03 JST
はじめまして、日本IBMの知念と申します。 業務上、AMD64上で canna を使う機会があり、その時に生じた問題と その対処法について報告させていただきます。 [環境] OS : SuSE Linux Enterprise 8 for AMD64 Canna Version : Canna 3.6p3 [問題] 文字列を変換する際、変換途中の文字列において変換範囲を C-i, C-o 等で変更し確定すると、cannaserver が落ちます。 [原因] ./lib/RK/fq.c の readNV() において、一旦自動変数 struct NV nv にデータを入れていき、最後に struct NV *vn の指すメモリ上に そのデータの代入がなされています。 この nv の各メンバに値を入れていく際、nv のメンバ中のポインタが、 別の nv のメンバのアドレスを保有してしまう部分があります。 例) nv.head.left = nv.head.right = &nv.head; nv は自動変数であるため、この指しているアドレスはスタック上の アドレスになるわけですが、これがそのまま *vn に代入されています。 このため、あとで他の関数において(_RkRegisterNV())、*vn の代入された アドレスを用いると、すでに変更されたスタック上のアドレスを参照 してしまい、cannaserver が落ちてしまいます。 [対処法] (すいません、弊社は外部にパッチを出すのに非常に時間がかかる 手続きを踏まねばならないので、対処法だけ提示させていただきます。) 当方で考えた対処法は、nv を頭から使わず、*vnのメンバに直接値を 代入していくことです。(nv.sz を vn->sz をしたりなど。) これにより *vn のメンバ中のポインタが、スタック上のアドレスを 指すことを避けることができます。 以上、よろしくお願いします。 ------- Mitsuru Chinen // AP Linux Technology Center, IBM;