Функция 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. Когда я использую его, ничего не печатается, хотя функции pam_info вызываются до функции stat.
Если я использую функцию доступа, модуль выполняется правильно. Я немного озадачен тем, почему это происходит.
РЕДАКТИРОВАТЬ: я включил некоторый код, который проверял errno и другие возвращаемые значения, но этот код не выполняется. Я не включил его в вопрос, потому что не хотел делать код слишком длинным для чтения. Модуль, похоже, выходит из строя и полностью выходит. Ничего не печатает. Он просто ничего не делает. Но если я использую access(), модуль работает нормально.


person John Doh    schedule 05.07.2010    source источник
comment
Ваш код шизофреничен между DestDir и destir, что может объяснить некоторые проблемы. Вы также не показали объявления для ряда других переменных, что усложняет жизнь.   -  person Jonathan Leffler    schedule 06.07.2010
comment
stat() не возвращается с успехом. Имейте некоторый код для обработки возврата -1 и проверки errno. То же самое и для доступа(). Имейте некоторый код для обработки неудачных возвратов.   -  person vpit3833    schedule 06.07.2010
comment
Извините, DestDir должен был быть глобальным объявлением. Я удалил дополнительную локальную переменную, которую я определил. Об обработке других возвратов. Я думаю, я должен был быть более ясным, модуль, похоже, выходит из строя и полностью выходит. Я добавил некоторый код, который проверял errno и другие возвращаемые значения, но этот код не выполнялся. Я не включил его в вопрос, потому что не хотел делать код слишком длинным для чтения. Опять же, модуль, похоже, выходит из строя и полностью выходит. Ничего не печатает. Он просто ничего не делает. Но если я использую access(), модуль работает нормально.   -  person John Doh    schedule 06.07.2010
comment
Кстати, strcpy() — это ожидание переполнения буфера.   -  person Marius Gedminas    schedule 14.07.2010
comment
Включаете ли вы необходимые заголовочные файлы? Я могу представить, что что-то пойдет не так, если функция stat не объявлена, особенно если у вас 64-битная система. Вы можете проверить предупреждения компилятора.   -  person Marius Gedminas    schedule 14.07.2010
comment
Просто опубликуйте полный код. Скомпилируйте его с помощью ‹code›-W -Wall‹/code› и посмотрите, поможет ли это. Попробуйте запустить его под ‹code›strace‹/code› или ‹code›valgrind‹/code› и посмотрите, не ошибается ли статистика или valgrind обнаруживает проблемы.   -  person poolie    schedule 21.07.2010


Ответы (3)


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

person Medran    schedule 21.07.2010

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

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

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

person poolie    schedule 21.07.2010

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

person bmargulies    schedule 22.07.2010