IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

crypt() & pthreads


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut crypt() & pthreads
    Bonjour,

    Je suis entrain de développer un petit programme à base de pthreads et j'observe un problème plutôt étrange.

    Une fois le thread fils créer, je fais un appel à la fonction crypt() pour obtenir un hash DES (no comment sur sa sécu je sais ce que ça vaut.).

    Bref, je fais un crypt("12345", "AA") dans mon main (avant de lancer les threads), et le résultat est correct. Quand je refais exactement la même manipe dans mon thread, un coup j'ai le bon résultat, un coup c'est un résultat "faux". Je n'arrive pas à comprendre pourquoi threads/crypt seraient incomptabiles....


    Encore plus étrange, dans mon main je fais un for pour appeler 20 fois la fonction crypt(), avec les paramètres précédent. J'obtiens 20 résultats identiques (AAKTK/CcEYEs6) [normal me direz-vous!]. Dans mon thread, j'ai fais la même chose, et si je lance mettons 3 fois mon programme, je vais obtenir :
    1. 3-4 résultats corrects et le reste des résultats faux
    2. 20 résultats corrects
    3. 5 résultats corrects et le reste des résultats faux

    Exemple de code fonctionnel (je m'en sert de référence pour mes tests) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #define _XOPEN_SOURCE
     
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int main(int argc, char *argv[])
    {
            if(argc != 3)
            {
                    printf("%s <passwd> <seed>\n",argv[0]);
                    exit(EXIT_FAILURE);
            }
     
            printf("%s = (%s) %s \n",crypt(argv[1], argv[2]), argv[2], argv[1]);
     
            return EXIT_SUCCESS;
    }
    La j'avoue je suis sec que j'y comprend rien.... quelqu'un aurait-il une idée ?


    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Crypt() retourne l'adresse d'un buffer statique, donc l'équivalent d'une variable globale.

    Si ce buffer n'est pas situé dans du Thread-Local Storage (TLS), alors il est partagé entre tous les threads d'un processus. Ce qui rend la fonction non-thread-safe. Essaie d'en protéger l'utilisation avec un mutex...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 44
    Par défaut
    Bonjour Médinoc,

    J'y avais effectivement pensé mais cela ne résoud rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pthread_mutex_lock(&LOCKED);
    hash = crypt("12345", "AA");
    printf("> %s \n", hash);
    pthread_mutex_unlock(&LOCKED);
    et ça me sort des trucs comme :
    > AAKTK/CcEYEs6
    > AA2DkU6wzP.cY


    Une autre idée ? =)

    ** EDIT **
    1 . C'est vraiment bizzare comme comportement car sur les deux hash que j'ai copié/collé on voie que la graine est bonne "AA" mais le reste du hash change....alors que c'est toujours la même string qui est utilisée et codée "en dur" (12345) !

    2. J'ai esssayé d'augmenter la stack au moyen de pthread_attr_setstacksize à tout hasard, mais cela ne change rien !

Discussions similaires

  1. Pthread et semaphores
    Par Yabo dans le forum Linux
    Réponses: 9
    Dernier message: 30/03/2008, 00h09
  2. Identification via un LDAP, password crypté
    Par brice.antoine dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 15/06/2004, 13h04
  3. [procedure stockée] objet crypté
    Par hawax dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/04/2004, 17h44
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo