.png)
Die Funktion SSL_CTX_new() funktioniert einwandfrei, aber irgendetwas ist seltsam: Sie setzt errno auf ENOSYS.
Die Dokumentation sagt dazu nichts: https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_new.html
#include <errno.h>
#include <openssl/ssl.h>
int main(int argc, char * argv[]){
SSL_library_init();
SSL_load_error_strings();
perror("A");
SSL_CTX * sslContext = SSL_CTX_new(TLS_server_method());
if (sslContext == NULL){
return EXIT_FAILURE;
}
perror("B");
return 0;
}
dieser Code gibt Folgendes zurück:
A: Undefined error: 0
B: Function not implemented
Meine OpenSSL-Version ist: OpenSSL 1.1.1b 26. Februar 2019
Antwort1
Nicht alle Bibliotheken verwenden errno, um den Status zu melden. Wenn in der Dokumentation nicht explizit steht, dass diese Funktion errno setzt, dann kann man sich den Wert am besten wie folgt vorstellen:nicht definiert: Die Funktion behält möglicherweise den ursprünglichen Wert bei, setzt ihn auf 0 oder lässt etwas Müll darin zurück.
Und tatsächlich sagt die OpenSSL-Dokumentation nichts über errno; stattdessen hat die Bibliothek ihren eigenen „Fehlerstapel“, auf den Sie zugreifen können mitERR_get_error(), und dies bietet präzisere Fehlercodes und -meldungen als der sehr begrenzte Satz, der von libc bereitgestellt wird.
Der Wert, den Sie in errno finden, ist also lediglich ein Überbleibsel der einen oder anderen libc-Funktion, die SSL_CTX_new() verwendet hatim Inneren. (Zum Beispiel könnte es versucht haben, den RNG durch den Aufruf von libc getrandom() zu initialisieren, was dann aufgrund fehlender Kernel-Unterstützung ENOSYS zurückgegeben hat.)