2016-11-19 109 views
0

我有這個簡單的程序:OpenSSL的段錯誤

int main() 
{ 
     /* INITIALIZING OPENSSL */ 
     SSL_library_init();   
     SSL_load_error_strings(); 
     ERR_load_BIO_strings(); 
     OpenSSL_add_all_algorithms(); 

     BIO *bio; 
     connectServerSSL(bio); 
     login(bio); 
} 

而這個功能:

void connectServerSSL (BIO *bio) 
{ 
    SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method()); 
    SSL * ssl; 

    if(! SSL_CTX_load_verify_locations(ctx, NULL, "/etc/ssl/certs")) 
    { 
     callError(ERR_LOADCERT); 
    } 

    bio = BIO_new_ssl_connect(ctx); 
    BIO_get_ssl(bio, &ssl); 
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); 

    BIO_set_conn_hostname(bio, hostnamePort); 
    if(BIO_do_connect(bio) <= 0) 
    { 
     callError(ERR_CONNECTION); 
    } 

    if(SSL_get_verify_result(ssl) != X509_V_OK) 
    { 
     callError(ERR_VALIDCERT); 
    } 
} 

當我使用這個:

BIO_WRITE(生物,request.c_str() request.size())

In f聯繫connectServerSSL它工作正常。

但是,當我想在一些其他的功能,使用它:

void login (BIO *bio) 
{ 
    BIO_write(bio, request.c_str(), request.size()); 
} 

我得到分割故障(核心轉儲)。

+2

你不返回從'connectServerSSL'你'bio'。 – tkausl

+0

我該怎麼做? –

回答

0

在C和C++中,偶數指針是按值傳遞的。所以,你需要connectServerSSL的參數或者更改爲BIO * &或者重新定義它在事物的C風格:

void connectServerSSL (BIO ** bio_ptr) 
{ 
    SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method()); 
    SSL * ssl; 

    if(! SSL_CTX_load_verify_locations(ctx, NULL, "/etc/ssl/certs")) 
    { 
     callError(ERR_LOADCERT); 
    } 

    BIO * bio = BIO_new_ssl_connect(ctx); 
    BIO_get_ssl(bio, &ssl); 
    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); 

    BIO_set_conn_hostname(bio, hostnamePort); 
    if(BIO_do_connect(bio) <= 0) 
    { 
     callError(ERR_CONNECTION); 
    } 

    if(SSL_get_verify_result(ssl) != X509_V_OK) 
    { 
     callError(ERR_VALIDCERT); 
    } 
    *bio_ptr = bio; 
} 

// Example usage: 

void example() 
{ 
    BIO * bio; 
    connectServerSSL(&bio); 
    BIO_write(bio, request.c_str(), request.size()); 
} 
0

您的connectServerSSL()函數有一個名爲bio的參數,它只寫入此臨時變量,而不寫入未初始化的main()中的bio變量。

connectServerSSL()的簽名更改爲BIO* connectServerSSL(void)並將其與bio = connectServerSSL()聯繫起來。您也可以用BIO** newbio參數調用函數,用&bio調用它,並設置*newbio,它將更新main()中的bio變量。

一些很好的習慣可以幫助避免這樣的錯誤:將變量初始化爲默認值,使用斷言檢查輸入是否有效,以及在調試器中單步執行。如果你初始化了變量main()BIO* bio = NULL,或者更好,BIO* const bio = connectServerSSL(),那麼在調試器中它很明顯在返回時它仍然是未初始化的。