From e1a4ff7678ef8fd2d67416f84a7408e826c7dccc Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sat, 5 Aug 2017 21:47:00 +0200 Subject: [PATCH] Add ERR_clear_last_mark() This allows callers to set a mark, and then clear it without removing the errors. Useful in case an error is encountered that should be returned up the call stack. Reviewed-by: Andy Polyakov (Merged from https://github.com/openssl/openssl/pull/4094) --- CHANGES | 4 ++++ crypto/err/err.c | 23 +++++++++++++++++++++++ include/openssl/err.h | 1 + util/libcrypto.num | 1 + 4 files changed, 29 insertions(+) diff --git a/CHANGES b/CHANGES index ce2d9c565b..f9b58f9a31 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,10 @@ Changes between 1.1.0f and 1.1.1 [xx XXX xxxx] + *) Add ERR_clear_last_mark(), to allow callers to clear the last mark + without clearing the errors. + [Richard Levitte] + *) Add "atfork" functions. If building on a system that without pthreads, see doc/man3/OPENSSL_fork_prepare.pod for application requirements. The RAND facility now uses/requires this. diff --git a/crypto/err/err.c b/crypto/err/err.c index 9db3530330..07911e25b2 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -812,3 +812,26 @@ int ERR_pop_to_mark(void) es->err_flags[es->top] &= ~ERR_FLAG_MARK; return 1; } + +int ERR_clear_last_mark(void) +{ + ERR_STATE *es; + int top; + + es = ERR_get_state(); + if (es == NULL) + return 0; + + top = es->top; + while (es->bottom != top + && (es->err_flags[top] & ERR_FLAG_MARK) == 0) { + top -= 1; + if (top == -1) + top = ERR_NUM_ERRORS - 1; + } + + if (es->bottom == top) + return 0; + es->err_flags[top] &= ~ERR_FLAG_MARK; + return 1; +} diff --git a/include/openssl/err.h b/include/openssl/err.h index 8b266f9d5c..a602660c14 100644 --- a/include/openssl/err.h +++ b/include/openssl/err.h @@ -262,6 +262,7 @@ int ERR_get_next_error_library(void); int ERR_set_mark(void); int ERR_pop_to_mark(void); +int ERR_clear_last_mark(void); #ifdef __cplusplus } diff --git a/util/libcrypto.num b/util/libcrypto.num index 995cbc6672..c7f1905d44 100644 --- a/util/libcrypto.num +++ b/util/libcrypto.num @@ -4381,3 +4381,4 @@ ASN1_TIME_cmp_time_t 4324 1_1_1 EXIST::FUNCTION: ASN1_TIME_compare 4325 1_1_1 EXIST::FUNCTION: EVP_PKEY_CTX_ctrl_uint64 4326 1_1_1 EXIST::FUNCTION: EVP_DigestFinalXOF 4327 1_1_1 EXIST::FUNCTION: +ERR_clear_last_mark 4328 1_1_1 EXIST::FUNCTION: -- 2.25.1