From a14e2d9dfe0bc17800a5ab6b0439a3db50702586 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bodo=20M=C3=B6ller?= Date: Thu, 24 Jan 2002 16:16:43 +0000 Subject: [PATCH] New functions ERR_peek_last_error ERR_peek_last_error_line ERR_peek_last_error_line_data (supersedes ERR_peek_top_error). Rename OPENSSL_NO_OLD_DES_SUPPORT into OPENSSL_DISABLE_OLD_DES_SUPPORT because OPENSSL_NO_... indicates disabled algorithms (according to mkdef.pl). --- CHANGES | 19 ++++++++++++++- crypto/bio/bss_file.c | 2 +- crypto/conf/conf_def.c | 2 +- crypto/conf/conf_mall.c | 18 ++++++++++---- crypto/des/des.h | 2 +- crypto/err/err.c | 47 ++++++++++++++++++++++++------------ crypto/err/err.h | 9 ++++--- doc/crypto/ERR_get_error.pod | 29 ++++++++++++++++------ util/libeay.num | 5 +++- 9 files changed, 96 insertions(+), 37 deletions(-) diff --git a/CHANGES b/CHANGES index 1d27931d23..af0fc216d5 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,23 @@ *) applies to 0.9.6a/0.9.6b/0.9.6c and 0.9.7 +) applies to 0.9.7 only + +) Change BIO_new_file (crypto/bio/bss_file.c) to use new + BIO_R_NO_SUCH_FILE error code rather than the generic + ERR_R_SYS_LIB error code if fopen() fails with ENOENT. + [Ben Laurie] + + +) Add new functions + ERR_peek_last_error + ERR_peek_last_error_line + ERR_peek_last_error_line_data. + These are similar to + ERR_peek_error + ERR_peek_error_line + ERR_peek_error_line_data, + but report on the latest error recorded rather than the first one + still in the error queue. + [Ben Laurie, Bodo Moeller] + +) default_algorithms option in ENGINE config module. This allows things like: default_algorithms = ALL @@ -209,7 +226,7 @@ and other DES libraries that are currently used by other projects. The old libdes interface (including crypt()) is provided if is included. For now, this automatically - happens in unless OPENSSL_NO_OLD_DES_SUPPORT is + happens in unless OPENSSL_DISABLE_OLD_DES_SUPPORT is defined. Note that crypt() is no longer declared in . NOTE: This is a major break of an old API into a new one. Software diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index e3af936374..8b3ff278d9 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -103,7 +103,7 @@ BIO *BIO_new_file(const char *filename, const char *mode) { SYSerr(SYS_F_FOPEN,get_last_sys_error()); ERR_add_error_data(5,"fopen('",filename,"','",mode,"')"); - if(errno == ENOENT) + if (errno == ENOENT) BIOerr(BIO_F_BIO_NEW_FILE,BIO_R_NO_SUCH_FILE); else BIOerr(BIO_F_BIO_NEW_FILE,ERR_R_SYS_LIB); diff --git a/crypto/conf/conf_def.c b/crypto/conf/conf_def.c index 20b0760fcd..31f2766246 100644 --- a/crypto/conf/conf_def.c +++ b/crypto/conf/conf_def.c @@ -192,7 +192,7 @@ static int def_load(CONF *conf, const char *name, long *line) #endif if (in == NULL) { - if(ERR_GET_REASON(ERR_peek_top_error()) == BIO_R_NO_SUCH_FILE) + if (ERR_GET_REASON(ERR_peek_last_error()) == BIO_R_NO_SUCH_FILE) CONFerr(CONF_F_CONF_LOAD,CONF_R_NO_SUCH_FILE); else CONFerr(CONF_F_CONF_LOAD,ERR_R_SYS_LIB); diff --git a/crypto/conf/conf_mall.c b/crypto/conf/conf_mall.c index 59c7cfb966..01cff6946a 100644 --- a/crypto/conf/conf_mall.c +++ b/crypto/conf/conf_mall.c @@ -72,16 +72,18 @@ void OPENSSL_load_builtin_modules(void) ENGINE_add_conf_module(); } +#if 0 /* not yet */ /* This is the automatic configuration loader: it is called automatically by * OpenSSL when any of a number of standard initialisation functions are called, * unless this is overridden by calling OPENSSL_no_config() */ +#endif static int openssl_configured = 0; void OPENSSL_config(void) { - int ret; + int err_exit = 0; char *file; if (openssl_configured) return; @@ -92,10 +94,17 @@ void OPENSSL_config(void) if (!file) return; - ret=CONF_modules_load_file(file, "openssl_config", 0) <= 0 - && ERR_GET_REASON(ERR_peek_top_error()) != CONF_R_NO_SUCH_FILE; + ERR_clear_error(); + if (CONF_modules_load_file(file, "openssl_config", 0) <= 0) + { + if (ERR_GET_REASON(ERR_peek_last_error()) == CONF_R_NO_SUCH_FILE) + ERR_clear_error(); + else + err_exit = 1; + } + OPENSSL_free(file); - if (ret) + if (err_exit) { BIO *bio_err; ERR_load_crypto_strings(); @@ -109,7 +118,6 @@ void OPENSSL_config(void) } return; - } void OPENSSL_no_config() diff --git a/crypto/des/des.h b/crypto/des/des.h index 8ec7b90f85..237113129d 100644 --- a/crypto/des/des.h +++ b/crypto/des/des.h @@ -66,7 +66,7 @@ #include /* DES_LONG */ #include /* OPENSSL_EXTERN */ -#ifndef OPENSSL_NO_OLD_DES_SUPPORT +#ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT # include #endif diff --git a/crypto/err/err.c b/crypto/err/err.c index 1b1e9bbcb0..c909c3f4dc 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -318,7 +318,7 @@ static int err_cmp(const void *a_void, const void *b_void); static unsigned long pid_hash(const void *pid_void); /* static int pid_cmp(ERR_STATE *a,ERR_STATE *pid); */ static int pid_cmp(const void *a_void,const void *pid_void); -static unsigned long get_error_values(int inc,const char **file,int *line, +static unsigned long get_error_values(int inc,int top,const char **file,int *line, const char **data,int *flags); /* The internal functions used in the "err_defaults" implementation */ @@ -666,35 +666,37 @@ void ERR_clear_error(void) unsigned long ERR_get_error(void) - { return(get_error_values(1,NULL,NULL,NULL,NULL)); } + { return(get_error_values(1,0,NULL,NULL,NULL,NULL)); } unsigned long ERR_get_error_line(const char **file, int *line) - { return(get_error_values(1,file,line,NULL,NULL)); } + { return(get_error_values(1,0,file,line,NULL,NULL)); } unsigned long ERR_get_error_line_data(const char **file, int *line, const char **data, int *flags) - { return(get_error_values(1,file,line,data,flags)); } + { return(get_error_values(1,0,file,line,data,flags)); } unsigned long ERR_peek_error(void) - { return(get_error_values(0,NULL,NULL,NULL,NULL)); } + { return(get_error_values(0,0,NULL,NULL,NULL,NULL)); } -unsigned long ERR_peek_top_error(void) - { - ERR_STATE *es=ERR_get_state(); +unsigned long ERR_peek_last_error(void) + { return(get_error_values(0,1,NULL,NULL,NULL,NULL)); } - return es->err_buffer[es->top]; - } +unsigned long ERR_peek_error_line(const char **file, int *line) + { return(get_error_values(0,0,file,line,NULL,NULL)); } -unsigned long ERR_peek_error_line(const char **file, - int *line) - { return(get_error_values(0,file,line,NULL,NULL)); } +unsigned long ERR_peek_last_error_line(const char **file, int *line) + { return(get_error_values(0,1,file,line,NULL,NULL)); } unsigned long ERR_peek_error_line_data(const char **file, int *line, const char **data, int *flags) - { return(get_error_values(0,file,line,data,flags)); } + { return(get_error_values(0,0,file,line,data,flags)); } + +unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags) + { return(get_error_values(0,1,file,line,data,flags)); } -static unsigned long get_error_values(int inc, const char **file, int *line, +static unsigned long get_error_values(int inc, int top, const char **file, int *line, const char **data, int *flags) { int i=0; @@ -703,8 +705,21 @@ static unsigned long get_error_values(int inc, const char **file, int *line, es=ERR_get_state(); + if (inc && top) + { + if (file) *file = ""; + if (line) *line = 0; + if (data) *data = ""; + if (flags) *flags = 0; + + return ERR_R_INTERNAL_ERROR; + } + if (es->bottom == es->top) return 0; - i=(es->bottom+1)%ERR_NUM_ERRORS; + if (top) + i=(es->bottom+1)%ERR_NUM_ERRORS; /* last error */ + else + i=(es->bottom+1)%ERR_NUM_ERRORS; /* first error */ ret=es->err_buffer[i]; if (inc) diff --git a/crypto/err/err.h b/crypto/err/err.h index 4456e0e971..adf52e21b7 100644 --- a/crypto/err/err.h +++ b/crypto/err/err.h @@ -238,15 +238,18 @@ typedef struct ERR_string_data_st void ERR_put_error(int lib, int func,int reason,const char *file,int line); void ERR_set_error_data(char *data,int flags); -unsigned long ERR_get_error(void ); +unsigned long ERR_get_error(void); unsigned long ERR_get_error_line(const char **file,int *line); unsigned long ERR_get_error_line_data(const char **file,int *line, const char **data, int *flags); -unsigned long ERR_peek_error(void ); -unsigned long ERR_peek_top_error(void); +unsigned long ERR_peek_last_error(void); +unsigned long ERR_peek_error(void); unsigned long ERR_peek_error_line(const char **file,int *line); +unsigned long ERR_peek_last_error_line(const char **file,int *line); unsigned long ERR_peek_error_line_data(const char **file,int *line, const char **data,int *flags); +unsigned long ERR_peek_last_error_line_data(const char **file,int *line, + const char **data,int *flags); void ERR_clear_error(void ); char *ERR_error_string(unsigned long e,char *buf); void ERR_error_string_n(unsigned long e, char *buf, size_t len); diff --git a/doc/crypto/ERR_get_error.pod b/doc/crypto/ERR_get_error.pod index 3551bacb8d..9fdedbcb91 100644 --- a/doc/crypto/ERR_get_error.pod +++ b/doc/crypto/ERR_get_error.pod @@ -2,8 +2,10 @@ =head1 NAME -ERR_get_error, ERR_peek_error, ERR_get_error_line, ERR_peek_error_line, -ERR_get_error_line_data, ERR_peek_error_line_data - obtain error code and data +ERR_get_error, ERR_peek_error, ERR_peek_last_error, +ERR_get_error_line, ERR_peek_error_line, ERR_peek_last_error_line, +ERR_get_error_line_data, ERR_peek_error_line_data, +ERR_peek_error_line_data - obtain error code and data =head1 SYNOPSIS @@ -11,22 +13,29 @@ ERR_get_error_line_data, ERR_peek_error_line_data - obtain error code and data unsigned long ERR_get_error(void); unsigned long ERR_peek_error(void); + unsigned long ERR_peek_last_error(void); unsigned long ERR_get_error_line(const char **file, int *line); unsigned long ERR_peek_error_line(const char **file, int *line); + unsigned long ERR_peek_last_error_line(const char **file, int *line); unsigned long ERR_get_error_line_data(const char **file, int *line, const char **data, int *flags); unsigned long ERR_peek_error_line_data(const char **file, int *line, const char **data, int *flags); + unsigned long ERR_peek_last_error_line_data(const char **file, int *line, + const char **data, int *flags); =head1 DESCRIPTION -ERR_get_error() returns the last error code from the thread's error +ERR_get_error() returns the earliest error code from the thread's error queue and removes the entry. This function can be called repeatedly until there are no more error codes to return. -ERR_peek_error() returns the last error code from the thread's +ERR_peek_error() returns the earliest error code from the thread's +error queue without modifying it. + +ERR_peek_last_error() returns the latest error code from the thread's error queue without modifying it. See L for obtaining information about @@ -34,12 +43,14 @@ location and reason of the error, and L for human-readable error messages. -ERR_get_error_line() and ERR_peek_error_line() are the same as the -above, but they additionally store the file name and line number where +ERR_get_error_line(), ERR_peek_error_line() and +ERR_peek_last_error_line() are the same as the above, but they +additionally store the file name and line number where the error occurred in *B and *B, unless these are B. -ERR_get_error_line_data() and ERR_peek_error_line_data() store -additional data and flags associated with the error code in *B +ERR_get_error_line_data(), ERR_peek_error_line_data() and +ERR_get_last_error_line_data() store additional data and flags +associated with the error code in *B and *B, unless these are B. *B contains a string if *B&B. If it has been allocated by OPENSSL_malloc(), *B&B is true. @@ -59,5 +70,7 @@ ERR_get_error(), ERR_peek_error(), ERR_get_error_line() and ERR_peek_error_line() are available in all versions of SSLeay and OpenSSL. ERR_get_error_line_data() and ERR_peek_error_line_data() were added in SSLeay 0.9.0. +ERR_peek_last_error(), ERR_peek_last_error_line() and +ERR_peek_last_error_line_data() were added in OpenSSL 0.9.7. =cut diff --git a/util/libeay.num b/util/libeay.num index 106806bebd..6823d03bb4 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -2749,7 +2749,10 @@ CONF_imodule_get_flags 3195 EXIST::FUNCTION: CONF_imodule_get_module 3196 EXIST::FUNCTION: CONF_modules_load 3197 EXIST::FUNCTION: CONF_imodule_get_name 3198 EXIST::FUNCTION: -ERR_peek_top_error 3199 EXIST::FUNCTION: +ERR_peek_top_error 3199 NOEXIST::FUNCTION: CONF_imodule_get_usr_data 3200 EXIST::FUNCTION: CONF_imodule_set_flags 3201 EXIST::FUNCTION: ENGINE_add_conf_module 3202 EXIST::FUNCTION: +ERR_peek_last_error_line 3203 EXIST::FUNCTION: +ERR_peek_last_error_line_data 3204 EXIST::FUNCTION: +ERR_peek_last_error 3205 EXIST::FUNCTION: -- 2.25.1