バグ:環境変数が含まれる文字列の扱い

Posted: 2013年03月25日

文字列中に環境変数が存在する文字列の扱い方を間違えてよく書いてしまうバグを紹介します。
通常は、気が付くレベルの問題のため
そこまで深刻な問題にはならないですが取り上げます。

プログラムプログラム:

 #include <stdio.h>
 $include <winbase.h>

 int main(int argc, char *argv[])
 {
    const TCHAR *pszSrc = _T("%PROGRAMFILES%Microsoft");
    TCHAR szExpandPath[MAX_PATH];
    DWORD nExpandPathSize = sizeof(szExpandPath) / sizeof(TCHAR);

    // 環境変数を展開
    ExpandEnvironmentStrings(pszSrc, szExpandPath, nExpandPathSize);

    // 処理

    return 0;
 }

このプログラムにどのように文字列中に環境変数が存在する文字列の扱い方を間違えていると思いますか?

  • 指定した環境変数が存在しない場合のチェックをおこなっていない
     ExpandEnvironmentStrings関数は、変換せずに値を返すため異常な状態で処理が続いてしまう
     処理後にファイルにアクセスしないまたは、使用しているAPIが環境変数を考慮している(API置き換え後、障害となる)
  • 指定した環境変数が意図していない値が設定されていた場合
     ファイルとしての存在チェックをおこなっていない。(値が正しいかのチェック)

改善版プログラム改善版プログラム:

 #include <stdio.h>
 $include <winbase.h>
 #include <io.h>

 int main(int argc, char *argv[])
 {
    const TCHAR *pszSrc = _T("%PROGRAMFILES%Microsoft");
    TCHAR szExpandPath[MAX_PATH];
    DWORD nExpandPathSize = sizeof(szExpandPath) / sizeof(TCHAR);

    // 環境変数を展開
    DWORD nRet = ExpandEnvironmentStrings(pszSrc, szExpandPath, nExpandPathSize);
    if (nRet == 0) {
        return;
    }

    // ファイルの存在確認
    if (_taccess(szExpandPath, 0) == -1) {
        return;
    }


    // 処理

    return 0;
 }

解説解説:

ExpandEnvironmentStringsで環境変数を展開し
設定されている値に置き換えます。

「%PROGRAMFILES%」 = 「C\Program Files」

この関数は、指定されている環境変数が存在しない場合は、0を返すため
処理を中断します。

また、取得したデータが意図したあたいかを確認するため
ファイルの存在確認を行なっています。

今回の場合
環境変数「PROGRAMFILES」を使用していますが
誤字で「PROGRAMFILE」を指定した場合のことも考慮する必要があります。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント