首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSSL分段故障

OpenSSL分段故障
EN

Stack Overflow用户
提问于 2016-11-19 18:29:22
回答 2查看 1.6K关注 0票数 0

我有一个简单的程序:

代码语言:javascript
复制
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);
}

这一职能是:

代码语言:javascript
复制
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中,它工作正常。

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

代码语言:javascript
复制
void login (BIO *bio)
{
     BIO_write(bio, request.c_str(), request.size());
}

我有分割错误(核被丢弃)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-19 18:42:42

在C和C++中,甚至指针都是通过值传递的。因此,您需要将connectServerSSL的参数更改为BIO *&或者用C样式重新定义它:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-19 18:41:24

connectServerSSL()函数有一个名为bio的参数,它只写入这个临时变量,而不是写入未初始化的main()中的bio变量。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40696476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档