2010-07-05 40 views
4

J'essaye d'écrire un module PAM. Le module PAM crée un répertoire lors de la première connexion. Très similaire à pam_mkhomedir.La fonction stat() ne semble pas fonctionner dans le module PAM de test

Voici le code.

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; 

} 

Comme vous pouvez le voir, le module imprime simplement les arguments spécifiés dans le fichier de configuration de pam lors de la connexion.
Le problème est avec la fonction stat. Quand je l'utilise, rien ne s'imprime, même si les fonctions pam_info sont appelées avant la fonction stat.
Si j'utilise la fonction d'accès, le module s'exécute correctement. Je suis un peu perplexe quant à la raison pour laquelle cela se produit.
EDIT: J'avais inclus du code qui vérifiait l'errno et d'autres valeurs de retour, mais ce code n'est pas exécuté. Je n'ai pas inclus dans la question parce que je ne voulais pas faire le code trop long à lire. Le module semble échouer et quitter complètement. Il n'imprime rien. Cela ne fait rien. Mais si j'utilise access() le module fonctionne bien.

+0

Vérifiez la valeur de 'errno'. –

+0

Votre code est schizophrène entre 'DestDir' et' destir', ce qui pourrait expliquer une partie du problème. Vous n'avez également pas montré les déclarations pour un certain nombre d'autres variables, ce qui complique la vie. –

+0

stat() ne retourne pas avec succès. Avoir du code pour gérer son retour -1 et vérifier le code d'erreur. Pareil pour access() aussi. Avoir du code pour gérer les retours infructueux. – vpit3833

Répondre

0

Juste poster le code complet.

Compilez-le avec -W -Wall et voyez si cela aide. Essayez de l'exécuter sous strace ou valgrind et vérifiez si la statistique échoue ou si valgrind trouve des problèmes.

1

Parfois, la structure de statistiques peut être mal définie par rapport à la bibliothèque que vous appelez, pour voir si c'est le cas de remplir votre structure de statistiques avec un tableau de caractères (assurez-vous que ce n'est pas un pointeur array) qui dit "tester la corruption de la pile". Maintenant, lorsque vous exécutez si ce tampon est corrompu c'est la racine du problème. Vous pouvez essayer de changer de compilateur ou de ne pas utiliser la fonction stat. J'ai juste récemment eu la fonction de stat se conduisant mal sur moi quand j'ai utilisé le compilateur clang vs gcc.

0

Je ne vois pas de déclaration pour DestDir, mais je parie que c'est trop petit.