2014-01-13 1 views
1

Предоставляет ли следующий код надлежащим образом всю выделенную память?Как освободить SSL-соединение от OpenSSL?

void foo(){ 
    //set up connection 
    SSL *ssl = NULL; 
    SSL_METHOD *method = (SSL_METHOD *)SSLv23_client_method(); 
    SSL_CTX *ctx = SSL_CTX_new(method); 
    BIO *bio = BIO_new_ssl_connect(ctx); 
    BIO_get_ssl(bio, &ssl); 
    BIO_set_conn_hostname(bio, "facebook.com:443"); 

    doConnect(ssl, ctx, bio); 
    ... 
    doFree(ssl, ctx, bio); 
} 

void doConnect(SSL *ssl, SSL_CTX *ctx, BIO *bio){ 
    BIO_reset(bio); //this is here in case we are trying to reconnect 
    if (BIO_do_connect(connection->bio) <= 0){ 
     while (BIO_should_retry(connection->bio)){ 
      if (BIO_do_connect(connection->bio) > 0){ 
       break; 
      } 
     } 
     //error handeling in case BIO_should_retry returns false omitted. 
    } 
    if (SSL_get_verify_result(connection->ssl) != X509_V_OK){ 
     // Handle the failed verification 
    } 
    int socket = BIO_get_fd(bio, NULL); 
} 

void doFree(SSL *ssl, SSL_CTX *ctx, BIO *bio){ 
    BIO_free_all(bio); //is this right? 
} 

Причина мне интересно, если это правильный способ освободить память, потому что я в настоящее время получаю следующую трассировку стеки, и я не знаю, если я неправильно освободить память или, если это некоторая другая ошибка (valgrind не сообщает о какой-либо ошибке памяти, она просто останавливается здесь).

(gdb) bt 
#0 0x040010c2 in ??() from /lib/ld-linux.so.2 
#1 0x06a13a0b in write() at ../sysdeps/unix/syscall-template.S:82 
#2 0x04153ae9 in ??() from /lib/i386-linux-gnu/libcrypto.so.1.0.0 
#3 0x041508e4 in BIO_write() from /lib/i386-linux-gnu/libcrypto.so.1.0.0 
#4 0x040771f1 in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#5 0x040775ff in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#6 0x04078d2f in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#7 0x04077a64 in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#8 0x04074bde in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#9 0x0408eed1 in SSL_shutdown() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#10 0x0409b175 in ??() from /lib/i386-linux-gnu/libssl.so.1.0.0 
#11 0x04150638 in BIO_free() from /lib/i386-linux-gnu/libcrypto.so.1.0.0 
#12 0x041511c4 in BIO_free_all() from /lib/i386-linux-gnu/libcrypto.so.1.0.0 

ответ

0

Я правильно освобождал память. Оказалось, что проблема возникла из-за того, что я использовал OpenSSL с потоками, но не инициализировал систему потоковой обработки OpenSSL.

0

Это может быть потому, что ваш код не вызывает SSL_library_init();. Добавив, что включает, main и удаляя ссылки на connection, все это сработало для меня.

Без SSL_library_init(); он разбился в BIO_should_retry, потому что bio был NULL.

Смежные вопросы