2009-12-04 5 views
0

Ayant quelques problèmes avec C. Je possède c'est mon code:Comprendre NSS PK11_CipherOp et C allocation de mémoire

// First line works, second line does not! 
char outbuf[1024]; 
// char *outbuf = (char *) malloc(1024); // char is always 1 

Je passe ce outbuf à une méthode appelée PK11_CipherOp(), a déclaré dans la bibliothèque NSS. La documentation de cette méthode peut être trouvée here, vous pouvez voir qu'il attend un char * pour le paramètre outbuf.

Je ne comprends pas pourquoi la première ligne fonctionne de manière fiable, et la deuxième ligne ne fonctionne pas!

Pour voir le code complet, s'il vous plaît voir File Source

Merci,

Hamilton

Répondre

3

Votre problème semble être une déclaration manquante pour malloc - vous n'avez pas inclus <stdlib.h>.

Cela signifie que votre compilateur suppose que la fonction renvoie int, qui est ensuite explicitement convertie en (unsigned char *). Si vous êtes sur une plate-forme où sizeof(int) != sizeof(void *), comme x86-64, cela va déformer la valeur du pointeur.

Cela illustre parfaitement pourquoi, en C (contrairement à C++), vous devriez pas jeter le résultat de malloc() - faire est inutile, et cache ce bogue exact de vous. Il illustre également pourquoi vous devez activer les avertissements du compilateur.

Le correctif est à #include <stdlib.h> et supprimez la distribution de malloc() pendant que vous êtes là.

Addendum:

Votre autre problème est que vous passez sizeof(outbuf)-PK11_CipherOp(). Ce sera correct (égal à out_buf_size) lorsque outbuf est un tableau, mais est incorrect (la taille du pointeur lui-même) lorsque outbuf est un pointeur.

Remplacer chaque sizeof(outbuf) avec out_buf_size et vous devriez être bon d'aller (il y en a un autre plus tard aussi) ...

+0

caf, Merci pour l'aide. Malheureusement, cela n'a pas réglé le problème. J'ai des avertissements sur (et je n'en ai pas entendu parler à propos de malloc), mais j'ai implémenté votre solution juste pour être sûr. Vous pouvez consulter la source mise à jour à l'adresse http://code.google.com/p/sysecure/source/browse/trunk/session_keys.c?r = 27 # 119 Lors de l'exécution, cette impression: sysecure: Erreur lors de la tentative de chiffrer un message sysecure: Le défaut d'effectuer l'opération de chiffrement (err -8189) sysecure: Nom de l'erreur - ((null)) sysecure: Erreur message - (Code inconnu ___f 3) et stderr Encrypted Data: longueur des données 0 Toute pensée serait vraiment me aider. – Hamy

+0

Ah oui, il y a aussi un deuxième problème - voir ma mise à jour. – caf

0

trouvé la question. Il s'avère que j'utilisais sizeof(outbuf) comme l'un des paramètres. Lorsque le OutBuf est déclaré sur la pile, renvoie 1024. Cependant, quand outbuf est sur le tas, comme char * outbuf = malloc(1024); la taille de outbuf est juste 4. Ce paramètre dit à la fonction combien de place était disponible dans le OutBuf, de sorte que le La fonction pensait qu'il n'y avait que 4 octets de pièce. Il a besoin de 16 pour faire quoi que ce soit alors il vient de rentrer sans effectuer de travail.