BIO *neo4j_openssl_new_bio(BIO *delegate, const char *hostname, int port, const neo4j_config_t *config, uint_fast32_t flags) { neo4j_logger_t *logger = neo4j_get_logger(config, "tls"); SSL_CTX *ctx = new_ctx(config, logger); if (ctx == NULL) { return NULL; } BIO *ssl_bio = BIO_new_ssl(ctx, 1); if (ssl_bio == NULL) { errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__); SSL_CTX_free(ctx); goto failure; } SSL_CTX_free(ctx); BIO_push(ssl_bio, delegate); if (BIO_set_close(ssl_bio, BIO_CLOSE) != 1) { errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__); goto failure; } int result = BIO_do_handshake(ssl_bio); if (result != 1) { if (result == 0) { errno = NEO4J_NO_SERVER_TLS_SUPPORT; goto failure; } errno = openssl_error(logger, NEO4J_LOG_ERROR, __FILE__, __LINE__); goto failure; } SSL *ssl = NULL; BIO_get_ssl(ssl_bio, &ssl); assert(ssl != NULL); if (verify(ssl, hostname, port, config, flags, logger)) { goto failure; } return ssl_bio; int errsv; failure: errsv = errno; BIO_free(ssl_bio); errno = errsv; return NULL; }
run_result_stream_t *run_rs_open(neo4j_session_t *session) { assert(session != NULL); neo4j_config_t *config = neo4j_session_config(session); run_result_stream_t *results = neo4j_calloc(config->allocator, NULL, 1, sizeof(run_result_stream_t)); results->session = session; results->logger = neo4j_get_logger(config, "results"); results->allocator = config->allocator; results->mpool = neo4j_std_mpool(config); results->record_mpool = neo4j_std_mpool(config); results->statement_type = -1; results->refcount = 1; results->job.abort = abort_job; if (neo4j_attach_job(session, &(results->job))) { neo4j_log_debug_errno(results->logger, "failed to attach job to session"); goto failure; } neo4j_result_stream_t *result_stream = &(results->_result_stream); result_stream->check_failure = run_rs_check_failure; result_stream->error_code = run_rs_error_code; result_stream->error_message = run_rs_error_message; result_stream->failure_details = run_rs_failure_details; result_stream->nfields = run_rs_nfields; result_stream->fieldname = run_rs_fieldname; result_stream->fetch_next = run_rs_fetch_next; result_stream->statement_type = run_rs_statement_type; result_stream->statement_plan = run_rs_statement_plan; result_stream->update_counts = run_rs_update_counts; result_stream->close = run_rs_close; return results; int errsv; failure: errsv = errno; run_rs_close(&(results->_result_stream)); errno = errsv; return NULL; }