diff options
author | Richard Levitte <levitte@openssl.org> | 2000-02-20 23:43:02 +0000 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2000-02-20 23:43:02 +0000 |
commit | d3442bc780473f0cd4f378bc31130d4579da640b (patch) | |
tree | a9e0e2f1ba5080829e22783c739a9cacaa95ebd5 /crypto/bio | |
parent | dab6f09573742df94c4767663565aca3863f8173 (diff) | |
download | openssl-new-d3442bc780473f0cd4f378bc31130d4579da640b.tar.gz |
Move the registration of callback functions to special functions
designed for that. This removes the potential error to mix data and
function pointers.
Please note that I'm a little unsure how incorrect calls to the old
ctrl functions should be handled, in som cases. I currently return 0
and that's it, but it may be more correct to generate a genuine error
in those cases.
Diffstat (limited to 'crypto/bio')
-rw-r--r-- | crypto/bio/bf_buff.c | 26 | ||||
-rw-r--r-- | crypto/bio/bf_nbio.c | 16 | ||||
-rw-r--r-- | crypto/bio/bf_null.c | 16 | ||||
-rw-r--r-- | crypto/bio/bio.h | 9 | ||||
-rw-r--r-- | crypto/bio/bio_lib.c | 31 | ||||
-rw-r--r-- | crypto/bio/bss_acpt.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_bio.c | 3 | ||||
-rw-r--r-- | crypto/bio/bss_conn.c | 44 | ||||
-rw-r--r-- | crypto/bio/bss_file.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_log.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_mem.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_null.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_rtcp.c | 1 | ||||
-rw-r--r-- | crypto/bio/bss_sock.c | 2 |
14 files changed, 133 insertions, 20 deletions
diff --git a/crypto/bio/bf_buff.c b/crypto/bio/bf_buff.c index acd8148138..ff0c9070ae 100644 --- a/crypto/bio/bf_buff.c +++ b/crypto/bio/bf_buff.c @@ -69,6 +69,7 @@ static int buffer_gets(BIO *h,char *str,int size); static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int buffer_new(BIO *h); static int buffer_free(BIO *data); +static long buffer_callback_ctrl(BIO *h,int cmd, void (*fp)()); #define DEFAULT_BUFFER_SIZE 1024 static BIO_METHOD methods_buffer= @@ -82,6 +83,7 @@ static BIO_METHOD methods_buffer= buffer_ctrl, buffer_new, buffer_free, + buffer_callback_ctrl, }; BIO_METHOD *BIO_f_buffer(void) @@ -284,6 +286,7 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr) ctx->ibuf_len=0; ctx->obuf_off=0; ctx->obuf_len=0; + if (b->next_bio == NULL) return(0); ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; case BIO_CTRL_INFO: @@ -300,12 +303,18 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr) case BIO_CTRL_WPENDING: ret=(long)ctx->obuf_len; if (ret == 0) + { + if (b->next_bio == NULL) return(0); ret=BIO_ctrl(b->next_bio,cmd,num,ptr); + } break; case BIO_CTRL_PENDING: ret=(long)ctx->ibuf_len; if (ret == 0) + { + if (b->next_bio == NULL) return(0); ret=BIO_ctrl(b->next_bio,cmd,num,ptr); + } break; case BIO_C_SET_BUFF_READ_DATA: if (num > ctx->ibuf_size) @@ -374,12 +383,14 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr) } break; case BIO_C_DO_STATE_MACHINE: + if (b->next_bio == NULL) return(0); BIO_clear_retry_flags(b); ret=BIO_ctrl(b->next_bio,cmd,num,ptr); BIO_copy_next_retry(b); break; case BIO_CTRL_FLUSH: + if (b->next_bio == NULL) return(0); if (ctx->obuf_len <= 0) { ret=BIO_ctrl(b->next_bio,cmd,num,ptr); @@ -418,6 +429,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_ ret=0; break; default: + if (b->next_bio == NULL) return(0); ret=BIO_ctrl(b->next_bio,cmd,num,ptr); break; } @@ -427,6 +439,20 @@ malloc_error: return(0); } +static long buffer_callback_ctrl(BIO *b, int cmd, void (*fp)()) + { + long ret=1; + + if (b->next_bio == NULL) return(0); + switch (cmd) + { + default: + ret=BIO_callback_ctrl(b->next_bio,cmd,fp); + break; + } + return(ret); + } + static int buffer_gets(BIO *b, char *buf, int size) { BIO_F_BUFFER_CTX *ctx; diff --git a/crypto/bio/bf_nbio.c b/crypto/bio/bf_nbio.c index a525e79d4f..5e574b7231 100644 --- a/crypto/bio/bf_nbio.c +++ b/crypto/bio/bf_nbio.c @@ -73,6 +73,7 @@ static int nbiof_gets(BIO *h,char *str,int size); static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int nbiof_new(BIO *h); static int nbiof_free(BIO *data); +static long nbiof_callback_ctrl(BIO *h,int cmd,void (*fp)()); typedef struct nbio_test_st { /* only set if we sent a 'should retry' error */ @@ -91,6 +92,7 @@ static BIO_METHOD methods_nbiof= nbiof_ctrl, nbiof_new, nbiof_free, + nbiof_callback_ctrl, }; BIO_METHOD *BIO_f_nbio_test(void) @@ -224,6 +226,20 @@ static long nbiof_ctrl(BIO *b, int cmd, long num, char *ptr) return(ret); } +static long nbiof_callback_ctrl(BIO *b, int cmd, void (*fp)()) + { + long ret=1; + + if (b->next_bio == NULL) return(0); + switch (cmd) + { + default: + ret=BIO_callback_ctrl(b->next_bio,cmd,fp); + break; + } + return(ret); + } + static int nbiof_gets(BIO *bp, char *buf, int size) { if (bp->next_bio == NULL) return(0); diff --git a/crypto/bio/bf_null.c b/crypto/bio/bf_null.c index 3254a55dce..0d183a6d9a 100644 --- a/crypto/bio/bf_null.c +++ b/crypto/bio/bf_null.c @@ -72,6 +72,7 @@ static int nullf_gets(BIO *h,char *str,int size); static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int nullf_new(BIO *h); static int nullf_free(BIO *data); +static long nullf_callback_ctrl(BIO *h,int cmd,void (*fp)()); static BIO_METHOD methods_nullf= { BIO_TYPE_NULL_FILTER, @@ -83,6 +84,7 @@ static BIO_METHOD methods_nullf= nullf_ctrl, nullf_new, nullf_free, + nullf_callback_ctrl, }; BIO_METHOD *BIO_f_null(void) @@ -152,6 +154,20 @@ static long nullf_ctrl(BIO *b, int cmd, long num, char *ptr) return(ret); } +static long nullf_callback_ctrl(BIO *b, int cmd, void (*fp)()) + { + long ret=1; + + if (b->next_bio == NULL) return(0); + switch (cmd) + { + default: + ret=BIO_callback_ctrl(b->next_bio,cmd,fp); + break; + } + return(ret); + } + static int nullf_gets(BIO *bp, char *buf, int size) { if (bp->next_bio == NULL) return(0); diff --git a/crypto/bio/bio.h b/crypto/bio/bio.h index 30fdb4a3eb..8842a1182c 100644 --- a/crypto/bio/bio.h +++ b/crypto/bio/bio.h @@ -219,6 +219,7 @@ typedef struct bio_method_st long (*ctrl)(); int (*create)(); int (*destroy)(); + long (*callback_ctrl)(); } BIO_METHOD; #else typedef struct bio_method_st @@ -232,6 +233,7 @@ typedef struct bio_method_st long (_far *ctrl)(); int (_far *create)(); int (_far *destroy)(); + long (_fat *callback_ctrl)(); } BIO_METHOD; #endif @@ -373,7 +375,7 @@ typedef struct bio_f_buffer_ctx_struct /* BIO_set_nbio(b,n) */ #define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s)) /* BIO *BIO_get_filter_bio(BIO *bio); */ -#define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb)) +#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)())) #define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk) #define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool) @@ -452,8 +454,8 @@ int BIO_read_filename(BIO *b,const char *name); size_t BIO_ctrl_pending(BIO *b); size_t BIO_ctrl_wpending(BIO *b); #define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL) -#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp) -#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb) +#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(void (**)())(cbp)) +#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,(void (*)())(cb)) /* For the BIO_f_buffer() type */ #define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL) @@ -508,6 +510,7 @@ int BIO_gets(BIO *bp,char *buf, int size); int BIO_write(BIO *b, const char *data, int len); int BIO_puts(BIO *bp,const char *buf); long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg); +long BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)()); char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg); long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg); BIO * BIO_push(BIO *b,BIO *append); diff --git a/crypto/bio/bio_lib.c b/crypto/bio/bio_lib.c index ae225da986..cf8e6150fd 100644 --- a/crypto/bio/bio_lib.c +++ b/crypto/bio/bio_lib.c @@ -317,16 +317,43 @@ long BIO_ctrl(BIO *b, int cmd, long larg, void *parg) return(ret); } +long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)()) + { + long ret; + long (*cb)(); + + if (b == NULL) return(0); + + if ((b->method == NULL) || (b->method->callback_ctrl == NULL)) + { + BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD); + return(-2); + } + + cb=b->callback; + + if ((cb != NULL) && + ((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0)) + return(ret); + + ret=b->method->callback_ctrl(b,cmd,fp); + + if (cb != NULL) + ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd, + 0,ret); + return(ret); + } + /* It is unfortunate to duplicate in functions what the BIO_(w)pending macros * do; but those macros have inappropriate return type, and for interfacing * from other programming languages, C macros aren't much of a help anyway. */ size_t BIO_ctrl_pending(BIO *bio) - { + { return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL); } size_t BIO_ctrl_wpending(BIO *bio) - { + { return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL); } diff --git a/crypto/bio/bss_acpt.c b/crypto/bio/bss_acpt.c index 47af80f76d..9afa636406 100644 --- a/crypto/bio/bss_acpt.c +++ b/crypto/bio/bss_acpt.c @@ -118,6 +118,7 @@ static BIO_METHOD methods_acceptp= acpt_ctrl, acpt_new, acpt_free, + NULL, }; BIO_METHOD *BIO_s_accept(void) diff --git a/crypto/bio/bss_bio.c b/crypto/bio/bss_bio.c index 36c89ccbf5..0d0f9356f7 100644 --- a/crypto/bio/bss_bio.c +++ b/crypto/bio/bss_bio.c @@ -41,7 +41,8 @@ static BIO_METHOD methods_biop = NULL /* no bio_gets */, bio_ctrl, bio_new, - bio_free + bio_free, + NULL /* no bio_callback_ctrl */ }; BIO_METHOD *BIO_s_bio(void) diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c index 6deee1a35f..22d00b369e 100644 --- a/crypto/bio/bss_conn.c +++ b/crypto/bio/bss_conn.c @@ -98,18 +98,13 @@ typedef struct bio_connect_st int (*info_callback)(); } BIO_CONNECT; -union int_fn_to_char_u - { - char *char_p; - int (*fn_p)(); - }; - static int conn_write(BIO *h,char *buf,int num); static int conn_read(BIO *h,char *buf,int size); static int conn_puts(BIO *h,char *str); static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2); static int conn_new(BIO *h); static int conn_free(BIO *data); +static long conn_callback_ctrl(BIO *h,int cmd,void *(*fp)()); static int conn_state(BIO *b, BIO_CONNECT *c); static void conn_close_socket(BIO *data); @@ -127,6 +122,7 @@ static BIO_METHOD methods_connectp= conn_ctrl, conn_new, conn_free, + conn_callback_ctrl, }; static int conn_state(BIO *b, BIO_CONNECT *c) @@ -571,24 +567,23 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr) break; case BIO_CTRL_DUP: { - union int_fn_to_char_u tmp_cb; - dbio=(BIO *)ptr; if (data->param_port) BIO_set_conn_port(dbio,data->param_port); if (data->param_hostname) BIO_set_conn_hostname(dbio,data->param_hostname); BIO_set_nbio(dbio,data->nbio); - tmp_cb.fn_p=data->info_callback; - (void)BIO_set_info_callback(dbio,tmp_cb.char_p); + (void)BIO_set_info_callback(dbio,(void *(*)())(data->info_callback)); } break; case BIO_CTRL_SET_CALLBACK: { - union int_fn_to_char_u tmp_cb; - - tmp_cb.char_p=ptr; - data->info_callback=tmp_cb.fn_p; +#if 0 /* FIXME: Should this be used? -- Richard Levitte */ + BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + ret = -1; +#else + ret=0; +#endif } break; case BIO_CTRL_GET_CALLBACK: @@ -606,6 +601,27 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr) return(ret); } +static long conn_callback_ctrl(BIO *b, int cmd, void *(*fp)()) + { + long ret=1; + BIO_CONNECT *data; + + data=(BIO_CONNECT *)b->ptr; + + switch (cmd) + { + case BIO_CTRL_SET_CALLBACK: + { + data->info_callback=(int (*)())fp; + } + break; + default: + ret=0; + break; + } + return(ret); + } + static int conn_puts(BIO *bp, char *str) { int n,ret; diff --git a/crypto/bio/bss_file.c b/crypto/bio/bss_file.c index 2a113cbfff..0d44dc3889 100644 --- a/crypto/bio/bss_file.c +++ b/crypto/bio/bss_file.c @@ -91,6 +91,7 @@ static BIO_METHOD methods_filep= file_ctrl, file_new, file_free, + NULL, }; BIO *BIO_new_file(const char *filename, const char *mode) diff --git a/crypto/bio/bss_log.c b/crypto/bio/bss_log.c index b52fbe1d4c..4308b19663 100644 --- a/crypto/bio/bss_log.c +++ b/crypto/bio/bss_log.c @@ -100,6 +100,7 @@ static BIO_METHOD methods_slg= slg_ctrl, slg_new, slg_free, + NULL, }; BIO_METHOD *BIO_s_log(void) diff --git a/crypto/bio/bss_mem.c b/crypto/bio/bss_mem.c index d9a2280d8f..41eab92415 100644 --- a/crypto/bio/bss_mem.c +++ b/crypto/bio/bss_mem.c @@ -79,6 +79,7 @@ static BIO_METHOD mem_method= mem_ctrl, mem_new, mem_free, + NULL, }; /* bio->num is used to hold the value to return on 'empty', if it is diff --git a/crypto/bio/bss_null.c b/crypto/bio/bss_null.c index d04be888e5..aee18e3ada 100644 --- a/crypto/bio/bss_null.c +++ b/crypto/bio/bss_null.c @@ -79,6 +79,7 @@ static BIO_METHOD null_method= null_ctrl, null_new, null_free, + NULL, }; BIO_METHOD *BIO_s_null(void) diff --git a/crypto/bio/bss_rtcp.c b/crypto/bio/bss_rtcp.c index 2ef040057e..4ad0739464 100644 --- a/crypto/bio/bss_rtcp.c +++ b/crypto/bio/bss_rtcp.c @@ -107,6 +107,7 @@ static BIO_METHOD rtcp_method= rtcp_ctrl, rtcp_new, rtcp_free, + NULL, }; BIO_METHOD *BIO_s_rtcp(void) diff --git a/crypto/bio/bss_sock.c b/crypto/bio/bss_sock.c index 1b8d04002d..8ce80ef68d 100644 --- a/crypto/bio/bss_sock.c +++ b/crypto/bio/bss_sock.c @@ -95,6 +95,7 @@ static BIO_METHOD methods_sockp= sock_ctrl, sock_new, sock_free, + NULL, }; BIO_METHOD *BIO_s_socket(void) @@ -112,6 +113,7 @@ static BIO_METHOD methods_fdp= fd_ctrl, fd_new, fd_free, + NULL, }; BIO_METHOD *BIO_s_fd(void) |