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 2019 年 2 月 26 日

答案1

并非所有库都使用 errno 来报告状态。如果文档没有明确说明此函数设置 errno,则最好将该值视为不明确的:该函数可能会保留原始值,或将其设置为0,或者在其中留下一些垃圾。

OpenSSL 文档确实没有提到 errno;相反,该库有自己的“错误堆栈”,您可以使用以下方式访问ERR_获取错误信息(),这提供了比 libc 提供的非常有限的集合更精确的错误代码和消息。

因此,您在 errno 中找到的值只是 SSL_CTX_new() 使用的某些 libc 函数的剩余值内部(例如,它可能尝试通过调用 libc getrandom() 来为 RNG 提供种子,但由于缺乏内核支持,该函数返回 ENOSYS。)

相关内容