OpenSSL/错误处理
外观
< OpenSSL
大多数 OpenSSL 函数在成功时返回 1,在失败时返回其他值。失败结果通常为 0,但一些函数(如 ssl_connect())在错误时也可能返回 -1,因此最安全的方法是将成功与 1 进行比较,而不是将失败与 0 进行比较。
当发生错误时,更详细的信息将存储在“错误队列”(有时也称为“错误堆栈”或“错误状态”)中,该队列可以包含多个错误代码(以记录一系列错误)。错误队列是线程本地化的(尽管它使用 OpenSSL 自行开发的线程本地状态机制实现,而不是使用操作系统的线程本地状态机制)。
对错误队列可以做的最简单的事情是打印整个队列。可以使用 ERR_print_errors_fp
将错误队列打印到 FILE *
,或使用ERR_print_errors 将错误队列打印到BIO。这两个函数在打印完错误队列后都会清空它。
以下是如何使用内存 BIO 将错误队列打印到一个 malloc 分配的字符串的示例
char *ossl_err_as_string (void) { BIO *bio = BIO_new (BIO_s_mem ()); ERR_print_errors (bio); char *buf = NULL; size_t len = BIO_get_mem_data (bio, &buf); char *ret = (char *) calloc (1, 1 + len); if (ret) memcpy (ret, buf, len); BIO_free (bio); return ret; }
另一方面,将错误堆栈打印到标准错误与以下操作一样简单
ERR_print_errors_fp (stderr);
TODO:解释从错误队列中提取单个错误代码和解释它们的更细粒度的方法