2010-09-12 4 views
3

Cette fonction est pour générer MD5Hash:D_FORTIFY_SOURCE et gcc

out = malloc(32+1); 
void md5sum(u_char *secret_data, int secret_len, char *in,char *out) { 
     ngx_md5_t  md5; 
     u_char hash[16]; 
     ngx_md5_init(&md5); 
     ngx_md5_update(&md5, in, strlen(in)); 
     ngx_md5_update(&md5, secret_data, secret_len); 
     ngx_md5_final(hash, &md5); 
     int ii; 
     for (ii = 0; ii &lqt; 16; ii++) { 
       char tt[2]; 
       sprintf(tt, "%02x", hash[ii]); 
       strcat(out,tt); 

     } 
} 

Il fonctionne, mais si j'utiliser l'option D_FORTIFY_SOURCE avec le compilateur gcc, je reçois une erreur de segmentation. Si je change le type de tt à: char tt[3], tout va bien. Pourquoi?

Répondre

4

Vous obtenez une erreur de segmentation car vous essayez d'écrire 3 caractères dans un tableau de 2 caractères. (NUL est également un caractère)

5

sprintf met un caractère nul pour terminer la chaîne. Vous avez donc besoin d'un tableau à trois caractères pour contenir une chaîne de deux caractères; c'est vraiment un '' b '' \ 0 '.