diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2020-02-22 18:58:29 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2021-10-25 00:40:43 +0900 |
commit | 3d16401508c3efb44eefbb2d4dfb68b850407397 (patch) | |
tree | 15e26f6cd5ad23c8bfe190bea26430d5d8f116bb /ext/openssl/ossl.c | |
parent | 32d49e93cf958adf85eb12fa361f49f26d9559b7 (diff) | |
download | ruby-3d16401508c3efb44eefbb2d4dfb68b850407397.tar.gz |
[ruby/openssl] ossl.c: use ERR_get_error_all() if available
OpenSSL 3.0 deprecated ERR_get_error_line_data() in favor of
ERR_get_error_all(), as part of the error queue structure changes.
https://github.com/ruby/openssl/commit/8e98d2ecc8
Diffstat (limited to 'ext/openssl/ossl.c')
-rw-r--r-- | ext/openssl/ossl.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c index c7a755ceda..6c532aca94 100644 --- a/ext/openssl/ossl.c +++ b/ext/openssl/ossl.c @@ -313,27 +313,31 @@ void ossl_clear_error(void) { if (dOSSL == Qtrue) { - unsigned long e; - const char *file, *data, *errstr; - int line, flags; - - while ((e = ERR_get_error_line_data(&file, &line, &data, &flags))) { - errstr = ERR_error_string(e, NULL); - if (!errstr) - errstr = "(null)"; - - if (flags & ERR_TXT_STRING) { - if (!data) - data = "(null)"; - rb_warn("error on stack: %s (%s)", errstr, data); - } - else { - rb_warn("error on stack: %s", errstr); - } - } + unsigned long e; + const char *file, *data, *func, *lib, *reason; + char append[256] = ""; + int line, flags; + +#ifdef HAVE_ERR_GET_ERROR_ALL + while ((e = ERR_get_error_all(&file, &line, &func, &data, &flags))) { +#else + while ((e = ERR_get_error_line_data(&file, &line, &data, &flags))) { + func = ERR_func_error_string(e); +#endif + lib = ERR_lib_error_string(e); + reason = ERR_reason_error_string(e); + + if (flags & ERR_TXT_STRING) { + if (!data) + data = "(null)"; + snprintf(append, sizeof(append), " (%s)", data); + } + rb_warn("error on stack: error:%08lX:%s:%s:%s%s", e, lib ? lib : "", + func ? func : "", reason ? reason : "", append); + } } else { - ERR_clear_error(); + ERR_clear_error(); } } |