Cente FileSystem

ファイル及びディレクトリ検索にて大文字/小文字の区別をしていた処理について

発行番号: Cente101-0116
Rev: 第1版
発行日: 2022/11/14

【題名】
ファイル及びディレクトリ検索にて大文字/小文字の区別をしていた処理について

【適用製品】
Cente FileSystem Ver6.42

【影響API】
readdir_wc_uni, readdir_wc

【現象】
検索するファイル及びディレクトリ名に半角英字で検索した際、
大文字及び小文字は区別せず検索するべきですが、区別して検索を行っていました。

【原因】
半角英字の検索の際、完全一致するファイル及びディレクトリを検索するようになっていました。

【回避方法】
検索したいファイルまたはディレクトリを大文字または小文字の一致する半角英字で検索を行う

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

ログ管理チェックディスク機能の有効/無効設定組合せによる誤処理について

発行番号: Cente101-0115
Rev: 第1版
発行日: 2022/05/02

【題名】
ログ管理チェックディスク機能の有効/無効設定組合せによる誤処理について

【適用製品】
Cente FileSystem Ver6.40 ~ Ver6.42

【影響API】
ini_lmchkdsk、ini_lmchkdsk_uni、fclose、fflush、fputc、fputs、fwrite、rename、rename_uni、remove、remove_uni、move、move_uni、chg_attr、chg_attr_uni、chg_attrfp、chg_tstamp_uni、chg_tstampfp、chg_filelen

【現象】
LM_CHKDSK(LM_CHKDSK_UNI)マクロを有効(1)に設定した場合、
ini_lmchkdsk(ini_lmchkdsk_uni)を実行していないドライブは、
無効(0)に設定した際と同じ動作になるべきですが、
ログ管理チェックディスク機能の一部の処理が動作してしまい、APIの処理速度が遅くなることがあります。

また合わせてキャッシュ機能有効で且つSAVE_CACHEマクロを無効(0)に設定した場合は、
ini_lmchkdsk(ini_lmchkdsk_uni)を実行したドライブにおいて、
API内部でエラーを検出できずにAPIから正常(0)が戻されてしまうことや、
「-301 管理領域破損エラー」が戻される可能性があります。

【原因】
ログ管理チェックディスク機能有効時は、FileSystem内部で管理しているフラグ情報により
ドライブ毎に機能が有効/無効かを判断していますが、フラグ情報を参照する処理が抜けている箇所があり、
無効ドライブに対してもログ管理チェックディスクの処理が一部動作しておりました。

またSAVE_CACHEマクロを無効(0)に設定した場合の処理において、エラー判定処理が抜けている箇所があり、
正常/異常を正しく戻すことができておりませんでした。またセーブキャッシュが行われず、
メモリデバイスに「LMREPAIR」のログ管理ファイルを正しく作成することができておりませんでした。

【回避方法】
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

独自APIでのディレクトリ検索時、エラーコード「CT_NOT_INI_D」が戻される不具合について

発行番号: Cente101-0114
Rev: 第1版
発行日: 2021/10/15

【題名】
独自APIでのディレクトリ検索時、エラーコード「CT_NOT_INI_D」が戻される不具合について

【適用製品】
Cente FileSystem Ver6.42

【影響API】
rmdir_all, rmdir_all_uni, dinfo, dinfo_uni

【現象】
以下全ての条件を満たした状態で【影響API】を実行した場合、『CT_NOT_INI_D:-17 初期化(ini_disk)されていない』エラーが発生します。
(1)fs_cfg.h内の FS_DINFO、FS_DINFO_UNI、FS_RMDIR_ALL、FS_RMDIR_ALL_UNIマクロの何れかを有効
(2)fs_cfg.h内の FS_READDIR_WC、FS_READDIR_WC_UNIマクロを無効
 ※(1)がS-JIS用のマクロの場合はFS_READDIR_WCマクロを、UNICODE用の場合はFS_READDIR_WC_UNIマクロを
  無効にした場合に発生
(3)メディア内のディレクトリに対して【影響API】を実行

【原因】
【影響API】では内部的に opendir() を実行する事でST_DIR構造体の情報を取得し、
ファイル又はディレクトリを参照する流れになっていますが、opendir()内での処理に問題がありました。
具体的には、opendir()の内部関数 DT_opendir()でディレクトリパス名を取得する必要がありますが、
FS_READDIR_WCマクロ、又はFS_READDIR_WC_UNIマクロが有効の時にしか取得できておらず、
【影響API】のマクロのみ有効にした場合は取得できておりませんでした。

ディレクトリパス名の取得に失敗した場合、その後の処理において本来アクセスしたいディレクトリでなく、
APIがサポートしていないドライブ自体を読み出す処理として動作してしまい(A:\, B:\, C:…)、その結果、
ドライブを全て読み出した後に「CT_NOT_INI_D」エラーが戻されていました。

【回避方法】
fs_cfg.h の以下のマクロを有効にする事で、本不具合を回避する事が出来ます。
・FS_READDIR_WCマクロ
・FS_READDIR_WC_UNIマクロ

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

Cente FileSystem

・readdir_wc(),readdir_wc_uni()を実行し、終端まで検索せずに抜けると、次の検索が正しく出来ない不具合を修正(Cente障害情報:101-0103)
readdir_wc(),readdir_wc_uni()の検索時において、終端を示す戻り値「NULL」が戻される前に処理を抜けた場合、次の検索が正しく行われない不具合を修正しました。

・メタデータ保護機能使用時、CT_DISK_FULLエラーが発生する不具合を修正(Cente障害情報:101-0104)
メタデータ保護機能を有効にした状態で、3クラスタ以上の書き込みが発生した場合、既に使用されているクラスタ位置を参照し、「CT_DISK_FULL」エラーが発生する不具合を修正しました。

・ワイルドカード検索時において、メモリ解放したST_WORK構造体資源を使用してしまう不具合を修正(Cente障害情報:101-0105)
readdir_wc()によるワイルドカード検索において、APIを実行する度にディレクトリ階層情報をST_WORK構造体資源に保持する必要がありますが、資源を解放してしまうことで、正しく検索できなくなる不具合を修正しました。

・UNICODE API使用時において、Cente FileSystem用の構造体資源を破壊する不具合を修正(Cente障害情報:101-0106)
UNICODE指定APIの rmdir_all_uni, dinfo_uni, readdir_wc_uni において、引数に指定した文字列が一定数を超えると、構造体資源を破壊してしまう不具合を修正しました。

・fseek()実行時、正しいセクタ位置を参照できない不具合を修正(Cente障害情報:101-0107)
速度向上のためにセクタ単位で無くクラスタ単位でシークしている処理において、ファイルデータ用バッファ(入出力バッファ)のメモリを、動的に取得した場合のクラスタサイズ固定で処理していたため、静的に取得した場合のセクタサイズの時に正しいセクタ位置が参照出来ない不具合を修正しました。

・API内部で使用中のST_DIR構造体資源を解放してしまう不具合を修正(Cente障害情報:101-0108)
rmdir_all()、rmdir_all_uni()、dinfo()、dinfo_uni()、readdir_wc()、readdir_wc_uni()において、API内部で使用しているST_DIR構造体資源の解放処理に誤りがあり、以下の問題が発生する不具合を修正しました。
– 使用中のST_DIR構造体資源を解放してしまうことで別のデータで上書きしてしまう。
– ST_DIR構造体資源の解放が行われず、資源が枯渇してしまう。

・chg_attr_uni()実行時、SAVE_CACHE機能が実行されない不具合を修正(Cente障害情報:101-0109)
SAVE_CACHE機能を”有効”にしているにも関わらず、chg_attr_uni()実行時にセーブキャッシュが実行されない不具合を修正しました。

・メタデータ保護機能無効時、FS_FERAMマクロが未定義になる不具合を修正(Cente障害情報:101-0110)
メタデータ保護機能を”無効”にした場合、コンパイルに依ってFS_FERAMマクロが未定義と検出される不具合を修正しました。

・メタデータ保護機能有効時、move()を実行すると誤った領域への書き込みと破損クラスタが発生する不具合を修正(Cente障害情報:101-0111)
メタデータ保護機能を”有効”にした状態でmove()、move_uni()を実行すると、以下2つの問題が発生する不具合を修正しました。
– FAT領域に破損クラスタが作成されてしまう。
– FAT領域、DIR領域、DATA領域いずれかの誤った位置に書き込んでしまう。

・ディレクトリキャッシュ機能使用時にディレクトリの作成/拡張を行うと、キャッシュ内の古い情報を参照してしまう不具合を修正(Cente障害情報:101-0112)
ィレクトリキャッシュ機能を使用した場合にディレクトリの作成/拡張を行うと、実メモリの情報よりキャッシュの情報が古い情報になってしまう不具合を修正しました。

・メディア挿抜後の書き込み処理でディスクフルエラーが発生する不具合を修正(Cente障害情報:101-0113)
空きFAT検索時に削除されたクラスタを早期に再利用する処理において、マウント時に内部変数をクリアする処理が抜けていた事で 「CT_DISK_FULL」エラーが発生する不具合を修正しました。

メディア挿抜時、書き込み処理を実行するとディスクフルエラーが発生する不具合について

発行番号: Cente101-0113
Rev: 第1版
発行日: 2021/05/28

【題名】
メディア挿抜後の書き込み処理でディスクフルエラーが発生する不具合について

【適用製品】
Cente FileSystem Ver6.20 ~ Ver6.41

【影響API】
fopen, fopen_uni, remove, remove_uni, rmdir, rmdir_uni, chg_filelen, chk_dsk, chk_dsk_uni

【現象】
メディアを抜去し、以下の何れかのパターンを実行した後に再挿入すると、書き込みAPIでディスクフルエラーが発生する可能性があります。

<パターン1>
別の環境にてメディアを書き換えて戻した場合。

<パターン2>
別のメディアを挿入した場合。

【原因】
Ver6.20リリース時に空きFAT検索開始位置の仕様改善を行いましたが、その際に追加した内部変数 nullfat2 情報をマウント処理時にクリアする処理が抜けておりました。誤った古い情報にアクセスしてしまうことで不具合が発生します。

具体的な発生のメカニズムについてですが、nullfat2 にはFAT領域の空き位置情報(クラスタ番号)が格納されます。
nullfat2 に格納されているクラスタ番号は必ず空いている必要がありますが、クリア処理が抜けていたことで、抜去後に別の環境でメディアの書き換えを行って戻した場合や、別のメディアを挿入した場合(nullfat2のクラスタ位置が
既に使用されている状態)にて発生する可能性があります。
また空き位置情報としては nullfat と nullfat2 の2つの情報がありますが、nullfatの情報で検索した後、空きが無かった場合に nullfat2 の情報を参照するようになっております。
このため nullfat 情報にて空き検索に成功した場合にはエラーは発生いたしません。

空き領域が少ない環境で発生する確率が高くなります。
本不具合はFAT種には依存せず、FAT12/16/32の環境で発生いたします。

【回避方法】
メディア抜去後、再挿入をする場合は一旦組込み機器を再起動してください。

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

ディレクトリキャッシュ機能使用時にディレクトリの作成/拡張を行うと、キャッシュ内の古い情報を参照してしまう不具合について

発行番号: 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を戻します。

【回避方法】
メタデータ保護機能を”無効”にした状態で運用する。

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

メタデータ保護機能有効時、move()を実行すると誤った領域への書き込みと破損クラスタが発生する不具合について

発行番号: Cente101-0111
Rev: 第1版
発行日: 2021/05/28

【題名】
メタデータ保護機能有効時、move()を実行すると誤った領域への書き込みと破損クラスタが発生する不具合について

【適用製品】
Cente FileSystem Ver6.10 ~ Ver6.41

【影響API】
move, move_uni

【現象】
以下の全ての条件を満たした場合に破損クラスタが発生し、誤った領域への書き込みが発生します。
①メタデータ保護機能を”有効”にした場合。
②move, move_uniに指定した移動先のディレクトリエントリ領域の拡張が行われる場合。
(ディレクトリエントリはクラスタ単位で拡張されます)

■破損クラスタについて
どのファイル/ディレクトリにも属さない、FATチェーン情報がFAT領域に作成されてしまう事象。
通常のメディアアクセスにおいては特に問題はありませんが、不要なゴミ情報として領域を消費してしまうため、早期ディスクフルにつながります。

■誤った領域への書き込みについて
誤った領域への書き込みとは、本来DIR領域へ書き込むエントリ情報を、DIR領域内の別領域、若しくはFAT領域、DATA領域に書き込んでしまう事象。書き込まれる領域は使用するメディア容量によって異なり、症状は次の通りです。
(1)誤ってDIR領域内の別領域に書き込んだ場合
– ファイルの読み出しに失敗する。
– ディレクトリ上からファイルが見えなくなる。
– 誤った場所に作成されてしまう。
(2)誤ってFAT領域に書き込んだ場合
– ファイルの読み出しに失敗する。
– ディレクトリ上からファイルが見えなくなる。
– ファイル内のデータがおかしくなる。
(3)誤ってDATA領域に書き込んだ場合
– ファイル内のデータがおかしくなる。

【原因】
Ver6.10 のリリースにて、ディレクトリエントリ領域内のエントリ情報を移動するシーケンスを以下のように変更しました。
・変更前:「移動元のエントリ削除 ⇒ 移動先のエントリ作成」
・変更後:「移動先に空きエントリがあるか確認 ⇒ 移動元のエントリ削除 ⇒ 移動先のエントリ作成」
変更後は、空き領域を事前に確保するようにしておりますが、この対応に不備がありました。

具体的には、移動先エントリ作成に伴い、領域の拡張を行う場合には、作成時にFATチェーンの取得を行いますが、Ver6.10の変更後、新しく追加した空きエントリの確認時とエントリの作成時でFATチェーンを二重で取得しておりました。
その結果、空きエントリの確認時に取得したFATチェーン情報が破損クラスタ(終端コード:0x0FFFFFFF)として残ってしまい、また、その終端コードが次の空きセクタ情報を算出する際の演算で使用されてしまい、本来DIR領域書き込まれるエントリ情報をDIR領域の別領域、FAT領域、DATA領域に書き込んでいました。

【回避方法】
メタデータ保護機能を”無効”にした状態で運用する。

■プログラムによる回避方法
修正ソースにつきましては、弊社サポートまでお問い合わせ下さい。

Page 2 of 17