我正在尝试对OpenSSL执行错误处理,以在OpenSSL中生成错误,我查看了一个函数ERR_put_error,该函数将在参数中指定的错误放入线程的错误队列中。该函数的定义为:
void ERR_put_error(int lib, int func, int reason, const char *file, int line);
如您所见,它接受func作为整数参数。但是我们将此函数称为:
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
OPENSSL_FILE,
OPENSSL_LINE);
在include / openssl / sslerr.h的openssl代码中定义了SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,它看起来像这样:
#define SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY 291
这是因为SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY是对应于整数的宏。我创建了一个包含所有错误名称的字符数组。现在,当我以字符串形式输入(将整数输入传递到错误数组并获得名称)时,该名称与SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY相同。
当我将其传递给该函数时,它将引发错误,因为它期望一个整数,但参数为char *类型。所以我的问题是为什么这个字符串没有被扩展成整数?另外,如何通过将输入作为字符串来实现这一点?
答案 0 :(得分:2)
我创建了一个包含所有错误名称的字符数组。
你是这个意思吗?
char err[256] = "SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY "
"SSL_R_APP_DATA_IN_HANDSHAKE "
"SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT"
"SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE"
"SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE"
"SSL_R_BAD_CHANGE_CIPHER_SPEC"
"SSL_R_BAD_CIPHER"
"SSL_R_BAD_DATA";
还是这个?
char err[256] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
SSL_R_APP_DATA_IN_HANDSHAKE,
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
SSL_R_BAD_CHANGE_CIPHER_SPEC,
SSL_R_BAD_CIPHER,
SSL_R_BAD_DATA
};
在以下两种情况下,通话均不起作用。
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
err,
OPENSSL_FILE,
OPENSSL_LINE);
因为err
的类型为char *
,但是函数接受int
。
您可以尝试如下定义并循环调用该函数。
int err[8] = {SSL_R_APPLICATION_DATA_AFTER_CLOSE_NOTIFY,
SSL_R_APP_DATA_IN_HANDSHAKE,
SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT,
SSL_R_AT_LEAST_TLS_1_0_NEEDED_IN_FIPS_MODE,
SSL_R_AT_LEAST_TLS_1_2_NEEDED_IN_SUITEB_MODE,
SSL_R_BAD_CHANGE_CIPHER_SPEC,
SSL_R_BAD_CIPHER,
SSL_R_BAD_DATA
};
for (int i = 0; i< 8; i++) {
ERR_put_error(ERR_LIB_SSL,
SSL_F_SSL3_GET_RECORD,
err[i],
OPENSSL_FILE,
OPENSSL_LINE);
}