Функция stat () не работает в тестовом модуле PAM - PullRequest
4 голосов
/ 06 июля 2010

Я пытаюсь написать модуль 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 (), модуль работает нормально.

Ответы [ 3 ]

1 голос
/ 21 июля 2010

иногда структура статистики может быть неверно определена по сравнению с библиотекой, которую вы вызываете, чтобы увидеть, является ли этот случай дополнением вашей структуры статистики массивом символов (убедитесь, что это не указатель на символы, фактически определите размер массива ) что говорит "тестирование на повреждение стека". Теперь, когда вы запускаете, если этот буфер поврежден, это является корнем проблемы. Вы можете попробовать переключать компиляторы или не использовать функцию stat. У меня совсем недавно была неправильная работа функции stat при использовании компилятора clang против gcc.

0 голосов
/ 23 июля 2010

Я не вижу декларации для DestDir, но держу пари, что она слишком мала.

0 голосов
/ 21 июля 2010

Просто опубликуйте полный код.

Скомпилируйте его с -W -Wall и посмотрите, поможет ли это.

Попробуйте запустить его под strace или valgrind и посмотрите, не сработает ли статистика или обнаружит ли valgrind проблемы.

...