2013-10-10 28 views
0

我正在使用以下代碼獲取分段錯誤。我很確定這是因爲函數試圖使用變量的地址而不是它的值。我有點新的指針,所以任何幫助將不勝感激!傳遞指向函數的指針會導致嘗試檢索值時發生segementation故障

int main(int argc, char *argv[]) 
{ 

    EVP_PKEY  priv_key_p; 
    X509_REQ  req_p; 
    X509   cert; 
    PKCS7   pkcs7; 

     /*Need to store value in req_p and priv_key_p*/ 
    makecsr(&req_p, &priv_key_p, passphrase); 

     /*Need to use value of req_p and priv_key_p*/ 
    create_cert(&req_p, &cert, &priv_key_p, passphrase); 
} 


int create_cert(X509_REQ *req_p, X509 *cert, EVP_PKEY *priv_key_p, char *passphrase) 
{ 
    int i; 
    long serial = 1; 
    EVP_PKEY *pkey; 
    const EVP_MD *digest; 
    X509_NAME *name; 
    X509V3_CTX ctx; 

    /* verify signature on the request */ 
    if (!(pkey = X509_REQ_get_pubkey (req_p))) <--- Segementation fault here! 
     int_error ("Error getting public key from request"); 
    .... 
} 

使用GDB,makecsr執行後,我可以打印priv_key_p和req_p的值沒問題。

然而,create_cert功能裏面,我只能通過寫P * priv_key_p/* req_p

錯誤

Program received signal SIGSEGV, Segmentation fault. 
0xb7ebb747 in X509_REQ_get_pubkey() 
    from /lib/i386-linux-gnu/libcrypto.so.1.0.0 
打印值
+0

能否請你解釋你的代碼,我的意思是什麼類型的變量。在目前的狀態下,很難回答這個問題。 – Arpit

+0

'X509_REQ_get_pubkey(&req_p)'試試這個(在黑暗中拍攝) – Arpit

+0

這些類型來自[OpenSSL library](http://www.openssl.org/docs/ssl/ssl.html),沒有運氣&req_p要麼 – TomSelleck

回答

0

錯誤是因爲我將一個錯誤的指針類型傳遞給了create_cert。

溶液create_cert改變這樣的:

int create_cert(X509 *req_p, X509 **cert, EVP_PKEY **priv_key_p, char * passphrase)

+0

不,它不是。您的create_cert應該保持不變,makecsr的intern函數只能被修改。 (就像之前評論中提供的鏈接一樣!) –

0

代碼:

if (!(pkey = X509_REQ_get_pubkey (req_p))) <--- Segementation fault here! 
    int_error ("Error getting public key from request"); 
    .... 

試這一個:

if (!(pkey == X509_REQ_get_pubkey (req_p))) <--- Segementation fault here! 
    int_error ("Error getting public key from request"); 
    .... 
+0

你應該指出第一個賦值給pkey,而第二個賦值給pkey 。如果沒有它們,很難看到它們的差異。 – doughgle

+0

錯誤在於'X509_REQ_get_pubkey(req_p)'不幸 – TomSelleck