4

PAMモジュールを作成しようとしています。PAMモジュールは、最初のログイン時にディレクトリを作成します。pam_mkhomedirと非常によく似ています。

これがコードです。

PAM_EXTERN int
pam_sm_open_session (pam_handle_t *pamh, int flags, int argc,
             const char **argv)
{
   int retval;
   const char *user;
   const struct passwd *pwd;
   struct stat St;

    // Parse the args
   _pam_parse(pamh, flags, argc, argv);
   pam_info (pamh, "\nThese are the args flags. skel: %s, mkdir: %s, umask: %o",SkelDir, MkDir, UMask );

   // Determine the user name  
   retval = pam_get_user(pamh, &user, NULL);
   if (retval != PAM_SUCCESS || user == NULL || *(const char *)user == '\0')
   {
      pam_syslog(pamh, LOG_NOTICE, "user unknown");
      return PAM_USER_UNKNOWN;
   }

   strcpy(DestDir, MkDir);
   strcat(DestDir,"/");
   strcat(DestDir, user);

   // Get the password entry   
   pwd = pam_modutil_getpwnam (pamh, user);
   if (pwd == NULL)
   {
      return PAM_CRED_INSUFFICIENT;
   }

   // For some reason stat wont work, using access instead. 

   //retval = stat(DestDir,&St); 


   retval = access(DestDir, F_OK);
   if ( retval == 0)
   {
    pam_info(pamh, "directory exists %s" ,DestDir); 
   }

    return PAM_SUCCESS;

}

ご覧のとおり、現在、モジュールはログイン時にpam構成ファイルで指定された引数を出力するだけです。
問題はstat関数にあります。使用すると、stat関数の前にpam_info関数が呼び出されても、何も出力されません。
アクセス機能を使用すると、モジュールは正常に実行されます。なぜこれが起こっているのか、私はちょっと困惑しています。
編集:errnoやその他の戻り値をチェックするコードをいくつか含めましたが、そのコードは実行されません。コードを長く読みすぎないようにしたくなかったので、質問には含めませんでした。モジュールが失敗し、完全に終了したようです。何も印刷されません。何もしません。しかし、access()を使用すると、モジュールは正常に機能します。

4

3 に答える 3

1

場合によっては、呼び出しているライブラリと比較して stat 構造体が誤って定義されている可能性があります。これがケースであるかどうかを確認するために、stat 構造体に文字配列を埋め込んでください (文字へのポインターではないことを確認し、実際に配列のサイズを定義してください)。 「スタック破損のテスト」。そのバッファが破損した場合に実行すると、それが問題の原因です。コンパイラを切り替えるか、stat 関数を使用しないようにしてください。つい最近、clang コンパイラと gcc を使用したときに、stat 関数が正しく動作しませんでした。

于 2010-07-21T14:38:54.540 に答える
0

完全なコードを投稿するだけです。

それをコンパイルして-W -Wall、それが役立つかどうかを確認してください。

straceまたはで実行してみてvalgrind、統計が失敗するかどうか、またはvalgrindが問題を検出するかどうかを確認してください。

于 2010-07-21T10:29:53.983 に答える
0

DestDir の宣言は見当たりませんが、小さすぎるに違いありません。

于 2010-07-22T23:49:26.297 に答える