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 函数。当我使用它时,即使 pam_info 函数在 stat 函数之前被调用,也不会打印任何内容。
如果我使用访问功能,模块可以正常执行。我有点困惑为什么会这样。
编辑:我包含了一些检查 errno 和其他返回值的代码,但该代码没有被执行。我没有将它包含在问题中,因为我不想让代码太长而无法阅读。该模块似乎失败并完全退出。它不打印任何东西。它什么也不做。但如果我使用 access() 模块工作正常。

4

3 回答 3

1

有时,与您正在调用的库相比,stat 结构可能会被错误定义,以查看是否是这种情况用字符数组填充您的 stat 结构(确保它不是指向字符的指针,实际定义数组的大小)说“测试堆栈损坏”。现在,当您运行该缓冲区时,如果该缓冲区已损坏,那就是问题的根源。您可以尝试切换编译器,或者不使用 stat 函数。最近,当我使用 clang 编译器与 gcc 时,我的 stat 函数行为异常。

于 2010-07-21T14:38:54.540 回答
0

只需发布完整的代码。

编译它,-W -Wall看看是否有帮助。

尝试在straceor下运行它valgrind,看看 stat 是否失败或 valgrind 是否发现问题。

于 2010-07-21T10:29:53.983 回答
0

我没有看到 DestDir 的声明,但我敢打赌它太小了。

于 2010-07-22T23:49:26.297 回答