Openssl SSL_CTX_new выполнен успешно, но errno установлен на ENOSYS (функция не реализована)

Openssl SSL_CTX_new выполнен успешно, но errno установлен на ENOSYS (функция не реализована)

Функция SSL_CTX_new() работает нормально, но что-то странное: она устанавливает errno в ENOSYS.

В документации об этом ничего не сказано: 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;
}

этот код возвращает это:

A: Undefined error: 0
B: Function not implemented

Моя версия openssl: OpenSSL 1.1.1b 26 февраля 2019 г.

решение1

Не все библиотеки используют errno для сообщения о состоянии. Если в документации явно не сказано, что эта функция устанавливает errno, то значение лучше всего рассматривать какнеопределенный: функция может сохранить исходное значение, или установить его в 0, или оставить в нем какой-то мусор.

И действительно, в документации OpenSSL ничего не говорится об errno; вместо этого библиотека имеет свой собственный «стек ошибок», к которому можно получить доступ с помощьюERR_get_error(), и это обеспечивает более точные коды ошибок и сообщения, чем весьма ограниченный набор, предоставляемый libc.

Таким образом, значение, которое вы найдете в errno, — это просто остаток от какой-то функции libc, которую использовала SSL_CTX_new().внутренне. (Например, он мог попытаться инициализировать ГСЧ, вызвав libc getrandom(), который затем вернул ENOSYS из-за отсутствия поддержки ядра.)

Связанный контент