mirror of https://github.com/openssl/openssl.git
Allow multiple nested marks
Previously we only ever allowed one mark to be set against an error in the statck. If we attempted to nest them, then we would end up clearing all the errors in the stack when we popped to the mark. Reviewed-by: Paul Dale <paul.dale@oracle.com> (Merged from https://github.com/openssl/openssl/pull/13335)
This commit is contained in:
parent
5b1d94c11c
commit
4e08ea6f11
|
|
@ -838,7 +838,7 @@ int ERR_set_mark(void)
|
|||
|
||||
if (es->bottom == es->top)
|
||||
return 0;
|
||||
es->err_flags[es->top] |= ERR_FLAG_MARK;
|
||||
es->err_marks[es->top]++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -851,14 +851,14 @@ int ERR_pop_to_mark(void)
|
|||
return 0;
|
||||
|
||||
while (es->bottom != es->top
|
||||
&& (es->err_flags[es->top] & ERR_FLAG_MARK) == 0) {
|
||||
&& es->err_marks[es->top] == 0) {
|
||||
err_clear(es, es->top, 0);
|
||||
es->top = es->top > 0 ? es->top - 1 : ERR_NUM_ERRORS - 1;
|
||||
}
|
||||
|
||||
if (es->bottom == es->top)
|
||||
return 0;
|
||||
es->err_flags[es->top] &= ~ERR_FLAG_MARK;
|
||||
es->err_marks[es->top]--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -873,13 +873,13 @@ int ERR_clear_last_mark(void)
|
|||
|
||||
top = es->top;
|
||||
while (es->bottom != top
|
||||
&& (es->err_flags[top] & ERR_FLAG_MARK) == 0) {
|
||||
&& es->err_marks[top] == 0) {
|
||||
top = top > 0 ? top - 1 : ERR_NUM_ERRORS - 1;
|
||||
}
|
||||
|
||||
if (es->bottom == top)
|
||||
return 0;
|
||||
es->err_flags[top] &= ~ERR_FLAG_MARK;
|
||||
es->err_marks[top]--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ static ossl_inline void err_set_data(ERR_STATE *es, size_t i,
|
|||
static ossl_inline void err_clear(ERR_STATE *es, size_t i, int deall)
|
||||
{
|
||||
err_clear_data(es, i, (deall));
|
||||
es->err_marks[i] = 0;
|
||||
es->err_flags[i] = 0;
|
||||
es->err_buffer[i] = 0;
|
||||
es->err_file[i] = NULL;
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ extern "C" {
|
|||
# define ERR_NUM_ERRORS 16
|
||||
struct err_state_st {
|
||||
int err_flags[ERR_NUM_ERRORS];
|
||||
int err_marks[ERR_NUM_ERRORS];
|
||||
unsigned long err_buffer[ERR_NUM_ERRORS];
|
||||
char *err_data[ERR_NUM_ERRORS];
|
||||
size_t err_data_size[ERR_NUM_ERRORS];
|
||||
|
|
|
|||
Loading…
Reference in New Issue