summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/err/err.c21
-rw-r--r--include/internal/constant_time_locl.h6
2 files changed, 27 insertions, 0 deletions
diff --git a/crypto/err/err.c b/crypto/err/err.c
index 34061bc662..66a60e907c 100644
--- a/crypto/err/err.c
+++ b/crypto/err/err.c
@@ -20,6 +20,7 @@
#include <openssl/opensslconf.h>
#include "internal/thread_once.h"
#include "internal/ctype.h"
+#include "internal/constant_time_locl.h"
static int err_load_strings(const ERR_STRING_DATA *str);
@@ -878,3 +879,23 @@ int ERR_clear_last_mark(void)
es->err_flags[top] &= ~ERR_FLAG_MARK;
return 1;
}
+
+void err_clear_last_constant_time(int clear)
+{
+ ERR_STATE *es;
+ int top;
+
+ es = ERR_get_state();
+ if (es == NULL)
+ return;
+
+ top = es->top;
+
+ es->err_flags[top] &= ~(0 - clear);
+ es->err_buffer[top] &= ~(0UL - clear);
+ es->err_file[top] = (const char *)((uintptr_t)es->err_file[top] &
+ ~((uintptr_t)0 - clear));
+ es->err_line[top] |= 0 - clear;
+
+ es->top = (top + ERR_NUM_ERRORS - clear) % ERR_NUM_ERRORS;
+}
diff --git a/include/internal/constant_time_locl.h b/include/internal/constant_time_locl.h
index 82ff74652e..cde30f4067 100644
--- a/include/internal/constant_time_locl.h
+++ b/include/internal/constant_time_locl.h
@@ -324,4 +324,10 @@ static ossl_inline void constant_time_lookup(void *out,
}
}
+/*
+ * Expected usage pattern is to unconditionally set error and then
+ * wipe it if there was no actual error. |clear| is 1 or 0.
+ */
+void err_clear_last_constant_time(int clear);
+
#endif /* HEADER_CONSTANT_TIME_LOCL_H */