我正在尝试编写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(),模块就可以正常工作。
答案 0 :(得分:1)
有时,与您调用的库相比,stat结构可能会被错误定义,看看这是否是带有字符数组的stat结构的情况(确保它不是指向字符的指针,实际上定义了数组的大小)说“测试堆栈损坏”。现在当你运行时,如果该缓冲区被破坏,那就是问题的根源。您可以尝试切换编译器,或不使用stat函数。当我使用clang编译器vs gcc时,我最近对stat函数行为不端。
答案 1 :(得分:0)
只需发布完整代码即可。
将其编译为-W -Wall
并查看是否有帮助。
尝试在strace
或valgrind
下运行它,看看统计信息是否失败,或者valgrind是否发现问题。
答案 2 :(得分:0)
我没有看到DestDir的声明,但我敢打赌它太小了。