err/err.c: add err_clear_last_constant_time.
[openssl.git] / crypto / err / err.c
index 34061bc662fc661337bbc965eeb4da8939098e47..66a60e907cd96b766b2779e19e827566ece13c9e 100644 (file)
@@ -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;
+}