Openssl SSL_CTX_new foi bem-sucedido, mas definiu errno para ENOSYS (função não implementada)

Openssl SSL_CTX_new foi bem-sucedido, mas definiu errno para ENOSYS (função não implementada)

A função SSL_CTX_new() funciona bem, mas algo estranho, ela define errno para ENOSYS.

A documentação não diz nada sobre isso: 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;
}

esse código retorna isso:

A: Undefined error: 0
B: Function not implemented

Minha versão do openssl é: OpenSSL 1.1.1b 26 de fevereiro de 2019

Responder1

Nem todas as bibliotecas usam errno para reportar status. Se a documentação não disser explicitamente que esta função define errno, então o valor é melhor considerado comoindefinido: a função pode preservar o valor original, ou defini-lo como 0, ou deixar algum lixo nele.

E de fato a documentação do OpenSSL não diz nada sobre errno; em vez disso, a biblioteca tem sua própria "pilha de erros" que você pode acessar usandoERR_get_error(), e isso fornece códigos de erro e mensagens mais precisos do que o conjunto muito limitado fornecido pela libc.

Portanto, o valor que você encontra em errno é apenas uma sobra de alguma ou outra função libc que SSL_CTX_new() usouinternamente. (Por exemplo, ele pode ter tentado propagar o RNG chamando libc getrandom(), que então retornou ENOSYS devido à falta de suporte do kernel.)

informação relacionada