[Canna-dev 241] cannasever crashed on SLES8 for AMD64

Zurück zum Archiv-Index

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;



Canna-dev メーリングリストの案内
Zurück zum Archiv-Index