発行番号: Cente101-0112
Rev: 第1版
発行日: 2021/05/28
【題名】
ディレクトリキャッシュ機能使用時にディレクトリの作成/拡張を行うと、キャッシュ内の古い情報を参照してしまう不具合について
【適用製品】
Cente FileSystem Ver5.50 ~ Ver6.41
【影響API】
open, fopen_uni, rename, rename_uni, move, move_uni, mkdir, mkdir_uni, ct_divide, ct_divide_uni
【現象】
mkdir, mkdir_uni で作成したディレクトリ下に fopen や mkdir によって、ファイル/ディレクトリを作成しようとすると「CT_ENTRY_ERR -71(ディレクトリエントリの情報異常)」エラーが発生します。
【原因】
ディレクトリキャッシュ機能を使用した際の、mkdir の処理に問題がありました。
ディレクトリキャッシュ機能を使用した場合は、基本的にキャッシュメモリのアクセスを行い、キャッシュの情報が常に最新の情報である必要がありますが、実メモリの情報よりキャッシュの情報が古い情報になってしまう場合があります。
以下の条件を全て満たした場合に発生いたします。
①ini_blk_cache_dir によるディレクトリキャッシュ機能を有効にした場合
②remove、rmdir によってファイル、ディレクトリを削除した場合
③ ②で使用していたクラスタを mkdir によるディレクトリの作成時や、「影響API」にてディレクトリ領域の拡張が行われた際に再利用した場合
④ ②で使用していたセクタ情報がキャッシュに残っていた場合
⑤メディアの使用状況がフラグメンテーションが発生している、FAT領域の空き検索において検索が1巡をした、などの状況だった場合
※Cente FileSystemでは空きクラスタをポインタで管理しており、その情報インクリメントしていくため、一度使用(削除)されたクラスタは、空きがすぐに見つからなかった場合のみに使用されます。
mkdir を実行した場合は、取得したクラスタ(セクタ)を初期化しますが、実メモリへの書き込みと同時にキャッシュ情報の更新を行っておりませんでした。すでに対象のセクタ情報がキャッシュに取り込まれていた場合には、最新の情報に更新する必要がありました。
「影響API」にてディレクトリ領域の拡張が行われるケースにおいても同様の問題がありました。このケースでは誤ったエントリ情報をディレクトリエントリに書き込んでしまう可能性があります。
《参照してしまう古い情報が別ディレクトリのディレクトリエントリ領域情報だった場合》
・ディレクトリエントリ領域の開始セクタ情報であれば、その情報をそのまま使用します。初期化はされていませんが、削除済みの情報のため表面上、問題にはなりません。(Centeで使用していないdotエントリ内のクラスタ番号情報が不一致になる可能性はあります)
・ディレクトリエントリ領域の途中のセクタ情報であれば、その領域にfopen, mkdir を実行すると、ドット(.)、ドットドット(..)エントリが存在しないため、異常と検出され「-71」エラーを戻します。readdir では表面上問題なく、読み出すエントリ情報が存在しないということでNULLを戻します。
【回避方法】
メタデータ保護機能を”無効”にした状態で運用する。
■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。