Commit d2cd28b9 authored by Andy Polyakov's avatar Andy Polyakov Committed by Matt Caswell
Browse files

err/err.c: add err_clear_last_constant_time.



Expected usage pattern is to unconditionally set error and then
wipe it if there was no actual error.

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
Reviewed-by: default avatarMatt Caswell <matt@openssl.org>
(cherry picked from commit f658a3b6)
parent 89cb61de
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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;
}
+6 −0
Original line number Diff line number Diff line
@@ -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 */