summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Levitte <levitte@openssl.org>2017-08-05 21:47:00 +0200
committerRichard Levitte <levitte@openssl.org>2017-08-15 14:26:12 +0200
commite1a4ff7678ef8fd2d67416f84a7408e826c7dccc (patch)
tree52aedb8e4dcdc1e81efc3628514af1fd36e18dfb
parent9237173eeba0a99de0d7a50f7b4a6149e983f866 (diff)
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 <appro@openssl.org> (Merged from https://github.com/openssl/openssl/pull/4094)
-rw-r--r--CHANGES4
-rw-r--r--crypto/err/err.c23
-rw-r--r--include/openssl/err.h1
-rw-r--r--util/libcrypto.num1
4 files changed, 29 insertions, 0 deletions
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: