0

複数のパスを含む配列を見て、配列にリストされているディレクトリのいずれかにコマンド (ls、wc、cat ... など) が存在するかどうかを確認するアルゴリズムがあります。いずれかのディレクトリでファイルが見つかった場合は、完全なディレクトリ パスを返します。

char *LookupPath(char **argv, char **dir)
{
    /* String Name To Be Returned */
    char *result;
    char path_name[MAX_PATH_LEN] = {0};
    int i;

    /* Check To See If File Name Is Already An Absolute Path Name */
    if(*argv[0] == '/') {

    }

    /* Look In Path Directories */
    for(i = 0; dir[i] != NULL; i++) {
        strncat(path_name, dir[i], sizeof(path_name));
        strncat(path_name, "/", sizeof(path_name));
        strncat(path_name, argv[0], sizeof(path_name));
        printf("pathname: %s\n", path_name);
        result = path_name;
        if(access(result, F_OK) == 0) {
            printf("SUCCESS!\n");
            printf("result: %s\n", result);
            return result;
        }
        path_name[0] = '\0';
    }

    /* File Name Not Found In Any Path Variable */
    return NULL;
}

新しい問題: ls -l などのコマンドを使用すると、以下の結果コードに示すように結果が美しく機能します。

pathname: /usr/lib/lightdm/lightdm/ls
pathname: /usr/local/sbin/ls
pathname: /usr/local/bin/ls
pathname: /usr/sbin/ls
pathname: /usr/bin/ls
pathname: /sbin/ls
pathname: /bin/ls
SUCCESS!
result: /bin/ls

しかし、今、「ls」などの単純なコマンドを使用するとオンになります...結果はfalseです...何らかの理由で改行文字がlsに追加されるため...?現れる:

pathname: /usr/lib/lightdm/lightdm/ls

pathname: /usr/local/sbin/ls

pathname: /usr/local/bin/ls

pathname: /usr/sbin/ls

pathname: /usr/bin/ls

pathname: /sbin/ls

pathname: /bin/ls

pathname: /usr/games/ls

pathname: /usr/local/games/ls

ls
: Command Not Found!

どうしてか分かりません。「ls」だけに切り詰める方法はありますか。単純な ls コマンドであるのに、改行文字が argv[0] に追加される理由がわかりません。:S

4

3 に答える 3

0

これを行うライブラリがあると確信していますが、実際の問題は、ループを介して毎回 dir のパスに追加していることです。

結果はptr

これらの行は、ループに入るたびにパス内の各要素に /argv[0] を実際に追加します

    result = dir[i];
    strcat(result, "/");
    strcat(result, argv[0]);

一時的な char バッファーを作成し、複数の strcats または sprintf を使用して内容を埋める必要があります。FWIW、strncat または同様の文字列関数を長さパラメーターで使用する習慣を身に付ける必要があります。このようなコードは、多くのセキュリティ問題の始まりです。このようなもの

     char result[PATH_MAX]; 
     strncpy(dir[i],result,length(dir[i))
于 2013-10-21T22:56:47.553 に答える
0

うん、strcatここに問題があるようです。それが文字列の標準的な配列であると仮定すると、おそらくそれに乗ったchar **dirときに最後まで走っているでしょうstrcat。それは悪いことです。私が自分自身に言ったように

いいえ!いいえ!違いstrcatます!strcat太陽が日光を分配するように、バッファ オーバーランを分配します。...真剣に、しないでください。

ループ内にある種のバッファを割り当てる必要があります。いう、

char buf[BUFSIZE] = {0};
result = buf;

dは十分な大きさです (私の大まかな見積もり: 300 を試してください) BUFSIZE#define

次に、次のことを試してください。

strlcpy(buf, dir[i], BUFSIZE);
strlcat(buf, "/", BUFSIZE);
strlcat(buf, argv[0], BUFSIZE);

警告: 現在これをテストすることはできません。私はそれがうまくいくと思うだけです。うまくいくはずなのに。

strlcpyとに関する情報strlcat

于 2013-10-21T22:58:03.090 に答える