◀ANSI版開発トップへ
  • 4733 TgaJumpListでバッファオーバーラン
    • 4736 RE: TgaJumpListでバッファオーバーラン
      • 4740 RE2: TgaJumpListでバッファオーバーラン
        • 4743 Re3: TgaJumpListでバッファオーバーラン
          • 4745 Re4: TgaJumpListでバッファオーバーラン
  • [4733] TgaJumpListでバッファオーバーラン げんた 2007年03月13日 00:36

    長い(256文字以上)のクラス名を含むタグジャンプ一覧を作成すると,関数一覧で落ちます.
    理由は,ctagsで作成したファイルをsscanfで読み取っており,何故かクラス名を受けるところまでも_MAX_PATHの長さしか無いためです.ここはsscanfを使わないように作り直す必要があると思います.

    なんで,そんな長いものに出会ったかと言いますと,ctagsがrubyの関数を1行で定義してある場合に関数の終わりを正しく認識できないみたいなのです.ruby-1.8.5のソースに入っているテスト用スクリプトに
    def f; yield; end;
    がずらっと並んでいて,それが全部入れ子になっていると勘違いされるため,長大な関数名ができあがってしまったようです.
    • [4736] RE: TgaJumpListでバッファオーバーラン wakura 2007年03月13日 18:23


      fgetsに指定するバッファがsscanfに指定するバッファより大きいことが原因。

      バッファをすべて1025に変更する。
      fgetsではsizeof(buff)で読み込む。
      これでsscanfはbuff内に収まる。

      sprintfはwsprintfにする。

      fgets(buff,1025,fp)
      1024を超える場合は1025バイト目に終端を書き込む。
      (buff[1024]==0になる)

      wsprintf(buff,format,...)
      1024を超える場合は1025バイト目に終端を書き込む。
      (buff[1024]==0になる)

      パスを扱うバッファを1025で定義してwsprintfを使うようにすれば
      とりあえずバッファオーバーは防げる。
      • [4740] RE2: TgaJumpListでバッファオーバーラン げんた 2007年03月13日 22:43

        >fgetsに指定するバッファがsscanfに指定するバッファより大きいことが原因。
        たしかに,TagJumpを実行する方では全て1024byteのバッファを取っていますから問題が出ないんですね.
        しかし,1文字しか使わないところまで1024バイト取るのがもったいないと思ってしまう私は貧乏性かな.

        ファイルを開いてデータを読む処理で共通に使える,1行の長さを気にせずに読み出せるようなファイル読み出しクラスが欲しいところではありますね.fopen_absexe()なんかも統合できるといいな.
        • [4743] Re3: TgaJumpListでバッファオーバーラン もか 2007年03月14日 21:02

          >ファイルを開いてデータを読む処理で共通に使える,1行の長さを気にせずに読み出せるようなファイル読み出しクラス
          CFileLoadではだめですか??
          • [4745] Re4: TgaJumpListでバッファオーバーラン げんた 2007年03月14日 23:52

            >CFileLoadではだめですか??
            かなりいい線行っているとは思いますが,設定ファイルの読み込みには必ずしも合っていないところもあります.
            例えばfopen_absexe()とかも自動でやってくれるとか,ファイルサイズの途中経過は必要かとか.
            CFileLoadを基本にしてもうちょっとターゲットを広げるか,兄弟クラスにするかといったところでしょうか.