Add functionality to set marks on the error stack and to pop all errors to the next mark.
This commit is contained in:
parent
490967195a
commit
54f6451670
6
CHANGES
6
CHANGES
@ -4,6 +4,10 @@
|
||||
|
||||
Changes between 0.9.7c and 0.9.8 [xx XXX xxxx]
|
||||
|
||||
*) Add the functions ERR_set_mark() and ERR_pop_to_mark() for better
|
||||
control of the error stack.
|
||||
[Richard Levitte]
|
||||
|
||||
*) Add support for STORE in ENGINE.
|
||||
[Richard Levitte]
|
||||
|
||||
@ -662,7 +666,7 @@ yet to be integrated into this CVS branch:
|
||||
the config script, much like the NetBSD support.
|
||||
[Richard Levitte & Kris Kennaway <kris@obsecurity.org>]
|
||||
|
||||
Changes between 0.9.6h and 0.9.7 [31 Dec 2002]
|
||||
Changes between 0.9.6j and 0.9.7 [31 Dec 2002]
|
||||
|
||||
*) Fix session ID handling in SSLv2 client code: the SERVER FINISHED
|
||||
code (06) was taken as the first octet of the session ID and the last
|
||||
|
@ -548,13 +548,24 @@ static void build_SYS_str_reasons()
|
||||
#endif
|
||||
|
||||
#define err_clear_data(p,i) \
|
||||
do { \
|
||||
if (((p)->err_data[i] != NULL) && \
|
||||
(p)->err_data_flags[i] & ERR_TXT_MALLOCED) \
|
||||
{ \
|
||||
OPENSSL_free((p)->err_data[i]); \
|
||||
(p)->err_data[i]=NULL; \
|
||||
} \
|
||||
(p)->err_data_flags[i]=0;
|
||||
(p)->err_data_flags[i]=0; \
|
||||
} while(0)
|
||||
|
||||
#define err_clear(p,i) \
|
||||
do { \
|
||||
es->err_flags[i]=0; \
|
||||
es->err_buffer[i]=0; \
|
||||
err_clear_data(p,i); \
|
||||
es->err_file[i]=NULL; \
|
||||
es->err_line[i]= -1; \
|
||||
} while(0)
|
||||
|
||||
static void ERR_STATE_free(ERR_STATE *s)
|
||||
{
|
||||
@ -645,6 +656,7 @@ void ERR_put_error(int lib, int func, int reason, const char *file,
|
||||
es->top=(es->top+1)%ERR_NUM_ERRORS;
|
||||
if (es->top == es->bottom)
|
||||
es->bottom=(es->bottom+1)%ERR_NUM_ERRORS;
|
||||
es->err_flags[es->top]=0;
|
||||
es->err_buffer[es->top]=ERR_PACK(lib,func,reason);
|
||||
es->err_file[es->top]=file;
|
||||
es->err_line[es->top]=line;
|
||||
@ -660,10 +672,7 @@ void ERR_clear_error(void)
|
||||
|
||||
for (i=0; i<ERR_NUM_ERRORS; i++)
|
||||
{
|
||||
es->err_buffer[i]=0;
|
||||
err_clear_data(es,i);
|
||||
es->err_file[i]=NULL;
|
||||
es->err_line[i]= -1;
|
||||
err_clear(es,i);
|
||||
}
|
||||
es->top=es->bottom=0;
|
||||
}
|
||||
@ -1034,3 +1043,35 @@ void ERR_add_error_data(int num, ...)
|
||||
err:
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
int ERR_set_mark(void)
|
||||
{
|
||||
int i=0;
|
||||
ERR_STATE *es;
|
||||
|
||||
es=ERR_get_state();
|
||||
|
||||
if (es->bottom == es->top) return 0;
|
||||
es->err_flags[es->top]|=ERR_FLAG_MARK;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ERR_pop_to_mark(void)
|
||||
{
|
||||
int i=0;
|
||||
ERR_STATE *es;
|
||||
|
||||
es=ERR_get_state();
|
||||
|
||||
while(es->bottom != es->top
|
||||
&& (es->err_flags[es->top] & ERR_FLAG_MARK) == 0)
|
||||
{
|
||||
err_clear(es,es->top);
|
||||
es->top-=1;
|
||||
if (es->top == -1) es->top=ERR_NUM_ERRORS;
|
||||
}
|
||||
|
||||
if (es->bottom == es->top) return 0;
|
||||
es->err_flags[es->top]&=~ERR_FLAG_MARK;
|
||||
return 1;
|
||||
}
|
||||
|
@ -88,10 +88,13 @@ extern "C" {
|
||||
#define ERR_TXT_MALLOCED 0x01
|
||||
#define ERR_TXT_STRING 0x02
|
||||
|
||||
#define ERR_FLAG_MARK 0x01
|
||||
|
||||
#define ERR_NUM_ERRORS 16
|
||||
typedef struct err_state_st
|
||||
{
|
||||
unsigned long pid;
|
||||
int err_flags[ERR_NUM_ERRORS];
|
||||
unsigned long err_buffer[ERR_NUM_ERRORS];
|
||||
char *err_data[ERR_NUM_ERRORS];
|
||||
int err_data_flags[ERR_NUM_ERRORS];
|
||||
@ -294,6 +297,9 @@ LHASH *ERR_get_err_state_table(void);
|
||||
|
||||
int ERR_get_next_error_library(void);
|
||||
|
||||
int ERR_set_mark(void);
|
||||
int ERR_pop_to_mark(void);
|
||||
|
||||
/* This opaque type encapsulates the low-level error-state functions */
|
||||
typedef struct st_ERR_FNS ERR_FNS;
|
||||
/* An application can use this function and provide the return value to loaded
|
||||
|
Loading…
Reference in New Issue
Block a user