Modification d’un OpenSSL BIO du mode blocage au mode non bloquant

J’ai une application multithread qui utilise intensivement OpenSSL en C. Elle est conçue avec l’idée que toutes ses connexions SSL devraient bloquer. Plus précisément, bloquer les BIO. Ils sont tous alloués sur un seul port entrant comme ceci:

ssl = SSL_new(ctx); SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); sock = BIO_new_socket(socket, BIO_CLOSE); SSL_set_bio(ssl, sock, sock); 

Il se trouve cependant que, dans quelques petites parties de la base de code, l’utilisation de BIO non bloquants serait le meilleur choix. Les petites pièces qui pourraient bénéficier des BIO non bloquantes n’ont aucun moyen de savoir quelles connexions SSL leur appartiendront. Ainsi, ils reçoivent toujours des BIO bloquants.

La question qui se pose est la suivante: les BIO bloquants peuvent-ils être changés en non bloquants?

Je sais que BIO_set_nbio peut être utilisé pour créer un BIO non bloquant, mais la documentation indique:

L’appel à BIO_set_nbio () doit être effectué avant que la connexion ne soit établie car des E / S non bloquantes sont définies au cours du processus de connexion.

Une autre option possible à laquelle je pensais serait de copier le BIO et de le recréer, tout en maintenant l’ensemble de l’état.

J’ai établi des connexions SSL non bloquantes dans mon propre code “lion”, mais je n’ai pas du tout utilisé la fonctionnalité BIO dans OpenSSL.

J’ai plutôt SSL_set_fd(ctx, fd ) pour les appels SSL_set_fd(ctx, fd ) et SSL_get_fd(ssl) afin de gérer mes propres fdsets et d’appels select .

Le plus gros problème qui a pris du temps a été de définir SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER et SSL_MODE_ENABLE_PARTIAL_WRITE car cela fonctionne comme je le voulais.

Si vous voulez lire la partie SSL du code, c’est ici:

https://github.com/lundman/lion/blob/master/src/tls.c