繁体   English   中英

OpenSSL段错误

[英]OpenSSL segfault

我有这个简单的程序:

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(bio,request.c_str(),request.size())

在connectServerSSL函数中,它可以正常运行。

但是当我想在其他功能中使用它时:

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

我遇到了细分错误(核心已转储)。

您的connectServerSSL()函数具有一个名为bio的参数,并且仅写入此临时变量,而不写入未初始化的main()bio变量。

connectServerSSL()的签名更改为BIO* connectServerSSL(void)并使用bio = connectServerSSL()调用。 您还可以使用BIO** newbio参数调用该函数,使用&bio调用它,并设置*newbio ,这将更新main()bio变量。

一些好的习惯可以帮助避免此类错误:将变量初始化为默认值,使用断言检查输入是否有效,以及在调试器中单步调试。 如果将main()的变量初始化为BIO* bio = NULL或更好的是BIO* const bio = connectServerSSL() ,则在调试器中很明显它在返回时仍未初始化。

在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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM