Add functionality to set marks on the error stack and to pop all errors to the next...
authorRichard Levitte <levitte@openssl.org>
Wed, 11 Jun 2003 20:49:58 +0000 (20:49 +0000)
committerRichard Levitte <levitte@openssl.org>
Wed, 11 Jun 2003 20:49:58 +0000 (20:49 +0000)
CHANGES
crypto/err/err.c
crypto/err/err.h

diff --git a/CHANGES b/CHANGES
index 9c05ac6..7c9c59c 100644 (file)
--- a/CHANGES
+++ b/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
index 1f943c8..2da71c0 100644 (file)
@@ -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;
+       }
index 0883819..1228acf 100644 (file)
@@ -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