X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=ssl%2Fbio_ssl.c;h=d683ee43e192fabeb751cf9707956f44e9085dde;hb=500df82a96fa9a1105a0da6367a9fc0e9c909715;hp=aa296996e665254e5ce094367caf0e1897b812d2;hpb=a9188d4e173304948c7711566556602bfb3ee32f;p=openssl.git diff --git a/ssl/bio_ssl.c b/ssl/bio_ssl.c index aa296996e6..d683ee43e1 100644 --- a/ssl/bio_ssl.c +++ b/ssl/bio_ssl.c @@ -65,12 +65,13 @@ #include #include -static int ssl_write(BIO *h,char *buf,int num); -static int ssl_read(BIO *h,char *buf,int size); -static int ssl_puts(BIO *h,char *str); -static long ssl_ctrl(BIO *h,int cmd,long arg1,char *arg2); +static int ssl_write(BIO *h, const char *buf, int num); +static int ssl_read(BIO *h, char *buf, int size); +static int ssl_puts(BIO *h, const char *str); +static long ssl_ctrl(BIO *h, int cmd, long arg1, void *arg2); static int ssl_new(BIO *h); static int ssl_free(BIO *data); +static long ssl_callback_ctrl(BIO *h, int cmd, bio_info_cb *fp); typedef struct bio_ssl_st { SSL *ssl; /* The ssl handle :-) */ @@ -92,12 +93,7 @@ static BIO_METHOD methods_sslp= ssl_ctrl, ssl_new, ssl_free, - }; - -union void_fn_to_char_u - { - char *char_p; - void (*fn_p)(); + ssl_callback_ctrl, }; BIO_METHOD *BIO_f_ssl(void) @@ -109,7 +105,7 @@ static int ssl_new(BIO *bi) { BIO_SSL *bs; - bs=(BIO_SSL *)Malloc(sizeof(BIO_SSL)); + bs=(BIO_SSL *)OPENSSL_malloc(sizeof(BIO_SSL)); if (bs == NULL) { BIOerr(BIO_F_SSL_NEW,ERR_R_MALLOC_FAILURE); @@ -137,7 +133,7 @@ static int ssl_free(BIO *a) a->flags=0; } if (a->ptr != NULL) - Free(a->ptr); + OPENSSL_free(a->ptr); return(1); } @@ -210,6 +206,10 @@ static int ssl_read(BIO *b, char *out, int outl) BIO_set_retry_special(b); retry_reason=BIO_RR_SSL_X509_LOOKUP; break; + case SSL_ERROR_WANT_ACCEPT: + BIO_set_retry_special(b); + retry_reason=BIO_RR_ACCEPT; + break; case SSL_ERROR_WANT_CONNECT: BIO_set_retry_special(b); retry_reason=BIO_RR_CONNECT; @@ -225,7 +225,7 @@ static int ssl_read(BIO *b, char *out, int outl) return(ret); } -static int ssl_write(BIO *b, char *out, int outl) +static int ssl_write(BIO *b, const char *out, int outl) { int ret,r=0; int retry_reason=0; @@ -293,7 +293,7 @@ static int ssl_write(BIO *b, char *out, int outl) return(ret); } -static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr) +static long ssl_ctrl(BIO *b, int cmd, long num, void *ptr) { SSL **sslp,*ssl; BIO_SSL *bs; @@ -403,6 +403,10 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr) { BIO_free_all(ssl->wbio); } + if (b->next_bio != NULL) + { + CRYPTO_add(&b->next_bio->references,1,CRYPTO_LOCK_BIO); + } ssl->wbio=NULL; ssl->rbio=NULL; break; @@ -451,10 +455,12 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr) break; case BIO_CTRL_SET_CALLBACK: { - union void_fn_to_char_u tmp_cb; - - tmp_cb.char_p = ptr; - SSL_set_info_callback(ssl,tmp_cb.fn_p); +#if 0 /* FIXME: Should this be used? -- Richard Levitte */ + BIOerr(SSL_F_SSL_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + ret = -1; +#else + ret=0; +#endif } break; case BIO_CTRL_GET_CALLBACK: @@ -472,7 +478,31 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr) return(ret); } -static int ssl_puts(BIO *bp, char *str) +static long ssl_callback_ctrl(BIO *b, int cmd, bio_info_cb *fp) + { + SSL *ssl; + BIO_SSL *bs; + long ret=1; + + bs=(BIO_SSL *)b->ptr; + ssl=bs->ssl; + switch (cmd) + { + case BIO_CTRL_SET_CALLBACK: + { + /* FIXME: setting this via a completely different prototype + seems like a crap idea */ + SSL_set_info_callback(ssl,(void (*)(const SSL *,int,int))fp); + } + break; + default: + ret=BIO_callback_ctrl(ssl->rbio,cmd,fp); + break; + } + return(ret); + } + +static int ssl_puts(BIO *bp, const char *str) { int n,ret; @@ -483,6 +513,7 @@ static int ssl_puts(BIO *bp, char *str) BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx) { +#ifndef OPENSSL_NO_SOCK BIO *ret=NULL,*buf=NULL,*ssl=NULL; if ((buf=BIO_new(BIO_f_buffer())) == NULL) @@ -495,6 +526,7 @@ BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx) err: if (buf != NULL) BIO_free(buf); if (ssl != NULL) BIO_free(ssl); +#endif return(NULL); }