2011-04-05 1 views
0

hey tout ce que j'ai écrit du code sur microsoft VS qui est supposé comparer les mots de passe entrés à ceux stockés dans la base de données et de retour approuvé ou refusé ... bon sur Windows, mais après la conversion en UNIX (en utilisant éclipse) une chose amusante se produit - toujours, le premier appel à cette fonction ne retourne pas la valeur approuvée quand il le devrait, mais appelant à nouveau la fonction avec exactement les mêmes paramètres. . comme voulu. après le débogage je suis assez sûr que le problème est dans le "strcmp", qui renvoie false sur la première exécution et vrai dans tous les autres exécutions sur les mêmes paramètres.C UNIX strcmp première utilisation est erronée, corriger tous les autres fois

quelqu'un a une idée sur ce qui pourrait être le problème ??

un exemple pour une commande: add jt 111 // ajouter le mot de passe à la DB

connexion jt 111

nié

connexion jt 111

approuvé

void login_helper(char *user, char *password){ 
     int found = 0; 
     int i; 
     for (i=0 ; i<space ; i++){ 
      if (strcasecmp(data[i].name,user) == 0) { 
       found = 1; 
       if (strcmp(data[i].hash ,Md5FromString(password)) == 0) 
        { 
        printf("approved.\n"); 
        break; 
       } 
       else { 
        printf("denied.\n"); 
        break; 
       } 
      } 
     } 
     if (found == 0) printf("denied.\n"); 
    } 
+2

Postez le code ou il n'a pas eu lieu. :) –

+0

@Matteo Italia Il a posté le code, il ne l'a pas formaté, et parce que le '<' est coincé sur 'l'espace' dans la boucle for, Markdown l'a traité comme HTML (invalide). – zneak

+1

@yuval, avez-vous considéré que le problème venait peut-être de votre fonction Md5FromString? – zneak

Répondre

3

Je prédis que l'appel à Md5FromString(password) renvoie un pointeur vers un tampon qui est plus valide lorsque la fonction retourne Md5FromString(). Cela voudrait dire que vous avez un comportement indéfini et que vous avez de la chance dans certains cas et que vous avez de la chance dans d'autres.

Post le code à Md5FromString().

1

Je doute vraiment qu'il y ait un problème dans strcmp(). :-)

(Il y a un excellent livre sur le développement logiciel appelé "The Pragmatic Programmer", par Andrew Hunt et David Thomas, qui a un conseil sur le débogage appelé "'select' n'est pas cassé", ce qui signifie finalement qu'il est Il est vraiment improbable qu'une fonction système de base (par exemple select() ou strcmp()) soit rompue.)

Avez-vous essayé d'imprimer le contenu de 'data [i] .hash' et la valeur retournée par 'Md5FromString (mot de passe) 'juste avant strcmp()?

Quelque chose comme:

  char *md5; 
      ... 
      md5 = Md5FromString(password); 
      printf("i: %d, hash: %s, md5: %s\n", i, data[i].hash, md5); 
      if (strcmp(data[i].hash, md5) == 0) 
       { 
       ... 

également, qui alloue de la mémoire pour la fonction Md5FromString()? Pouvez-vous envoyer le code pour Md5FromString()?

Cheers, Paulo