Below msg is a re-send to the correct address [EMAIL PROTECTED] -- Sorry for mailing it to the wrong place!! /Jonas
----- Original Message ----- From: "Jonas Sundgren" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Tuesday, November 26, 2002 2:43 AM Subject: BUG ?: ssl_bio.c increase reference count (BIO_push), but doesn't remove it (BIO_pop) > Env: openssl-0.9.6g (9-aug-2002), VC6/masm, WinXP > > Hi, > > When you do BIO_push on a SSL BIO object, reference count (CRYPTO_LOCK_BIO) > is increased on next BIO object. The problem is when you later pop the SSL > BIO, then the reference count isn't decreased. This isn't a problem as long > as you're supposed to do BIO_free twice on next BIO (a socket BIO in my > case). I want to do one, single BIO_free on my socket BIO and it should > shutdown/close the socket--but that doesn't work! (Example code below, after > the diff) > > Is this correct behavior? Have I missed something? If not, below fix works > for me: > > Index: crypto/bio/bio_lib.c > =================================================================== > RCS file: c:\cvsroot/openssl-0.9.6g/crypto/bio/bio_lib.c,v > retrieving revision 1.1 > diff -u -r1.1 bio_lib.c > --- crypto/bio/bio_lib.c 2 Nov 2002 13:02:10 -0000 1.1 > +++ crypto/bio/bio_lib.c 26 Nov 2002 00:48:15 -0000 > @@ -381,6 +381,9 @@ > > if (b == NULL) return(NULL); > ret=b->next_bio; > + > + /* called to do internal process before bio is unlinked */ > + BIO_ctrl(b,BIO_CTRL_POP,0,NULL); > > if (b->prev_bio != NULL) > b->prev_bio->next_bio=b->next_bio; > @@ -389,7 +392,6 @@ > > b->next_bio=NULL; > b->prev_bio=NULL; > - BIO_ctrl(b,BIO_CTRL_POP,0,NULL); > return(ret); > } > > Index: ssl/bio_ssl.c > =================================================================== > RCS file: c:\cvsroot/openssl-0.9.6g/ssl/bio_ssl.c,v > retrieving revision 1.1 > diff -u -r1.1 bio_ssl.c > --- ssl/bio_ssl.c 2 Nov 2002 13:03:47 -0000 1.1 > +++ ssl/bio_ssl.c 26 Nov 2002 01:28:44 -0000 > @@ -399,6 +399,8 @@ > { > 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; > > > Example code: > ... > sockbio = BIO_new_socket(s, BIO_CLOSE); > sslbio = BIO_new_ssl(g_Ssl.ctx, TRUE); > if (!sslbio) > goto cleanup; > > BIO_push(sslbio, sockbio); > if (BIO_do_connect(sslbio) <= 0) > goto cleanup; > > SendHttpRequest(sslbio); > ReadHttpResponse(sslbio); > > BIO_ssl_shutdown(sslbio); > BIO_pop(sslbio); > > success = TRUE; > > cleanup: > /* BUG ?: Have to do BIO_free twice on sockbio, otherwise it won't free > it nor close the socket */ > BIO_free(sockbio); > BIO_free(sslbio); > ... > > > Thanks, > Jonas Sundgren > > PS. The same problem exists in openssl-0.9.7-beta4 as well. > ______________________________________________________________________ OpenSSL Project http://www.openssl.org Development Mailing List [EMAIL PROTECTED] Automated List Manager [EMAIL PROTECTED]