2010-09-12 57 views
3

此功能是產生md5hash:D_FORTIFY_SOURCE和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); 

     } 
} 

它的工作原理,但如果我使用選項D_FORTIFY_SOURCE用gcc編譯器,我得到一個分段錯誤。如果我將tt的類型更改爲:char tt[3],則一切正常。爲什麼?

回答

4

由於您正在嘗試將3個字符寫入2個字符的數組,因此會出現分段錯誤。 (NUL也是一個字符)

5

sprintf將放入一個空字符來終止字符串。所以你需要一個三字符數組來保存一個兩字符的字符串;這真的是''''''''''。