stat()函数似乎没有在测试PAM模块中工作

我正在尝试编写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(),模块工作正常.

解决方法:

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

上一篇:linux 主机上出现输入正确的账号和密码,无法登陆,如何操作


下一篇:PHP:验证本地unix用户(无法直接访问/ etc / shadow)