[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
RE: try_read1msg()/wait4msg() vs. buffered input (ITS#2153)
It now occurs to me that just resetting the BerElement using ber_init
introduces a memory leak. The liblber/io.c in OpenLDAP 2.1 has a
ber_free_buf() function that should be used before the call to
ber_init_w_nullc(). Or, since it's only saving one free/malloc invocation,
you may just forget about this whole ber_init idea. Instead of
ber_init_w_nullc();
goto retry2;
use
ber_free( ber, 1 );
goto retry;
and leave it at that, no need for retry2...
-- Howard Chu
Chief Architect, Symas Corp. Director, Highland Sun
http://www.symas.com http://highlandsun.com/hyc
Symas: Premier OpenSource Development and Support
> -----Original Message-----
> From: Jutta Degener [mailto:jutta@sendmail.com]
> Sent: Thursday, October 24, 2002 2:26 PM
> To: Howard Chu
> Cc: openldap-its@OpenLDAP.org
> Subject: Re: try_read1msg()/wait4msg() vs. buffered input (ITS#2153)
>
>
> Howard,
>
> here's what I translated your patch to, relative to the 2.0.27
> release (I thought we were running 2.0.25, but that was a
> misunderstanding; I was really looking at 2.0.27 all along.)
>
> The only interesting part is that ber_init2 had to be replaced
> with ber_init_w_nullc. We tested that, and it seems to work
> okay so far; the situation that previously reliably locked
> up now no longer does it, and nothing else has fallen over
> in exchange.
>
> Thank you so much for the quick patch, that was great!
>
> Jutta Degener <jutta@sendmail.com>
> --
> Index: result.c
> ===================================================================
> RCS file: /cvs/pkgs/openldap/src/libraries/libldap/result.c,v
> retrieving revision 1.1.1.3
> diff -c -r1.1.1.3 result.c
> *** result.c 29 Jan 2002 18:45:18 -0000 1.1.1.3
> --- result.c 24 Oct 2002 18:32:17 -0000
> ***************
> *** 359,364 ****
> --- 359,365 ----
>
> Debug( LDAP_DEBUG_TRACE, "read1msg: msgid %d, all
> %d\n", msgid, all, 0 );
>
> + retry:
> if ( lc->lconn_ber == NULL ) {
> lc->lconn_ber = ldap_alloc_ber_with_options(ld);
>
> ***************
> *** 370,375 ****
> --- 371,377 ----
> ber = lc->lconn_ber;
> assert( BER_VALID (ber) );
>
> + retry2:
> /* get the next message */
> errno = 0;
> if ( (tag = ber_get_next( sb, &len, ber ))
> ***************
> *** 407,414 ****
>
> /* if it's been abandoned, toss it */
> if ( ldap_abandoned( ld, id ) ) {
> - ber_free( ber, 1 );
> Debug( LDAP_DEBUG_ANY, "abandoned\n", 0, 0, 0);
> return( -2 ); /* continue looking */
> }
>
> --- 409,422 ----
>
> /* if it's been abandoned, toss it */
> if ( ldap_abandoned( ld, id ) ) {
> Debug( LDAP_DEBUG_ANY, "abandoned\n", 0, 0, 0);
> + retry_ber:
> + if ( ber_sockbuf_ctrl( sb,
> LBER_SB_OPT_DATA_READY, NULL ))
> + {
> + ber_init_w_nullc( ber, ld->ld_lberoptions );
> + goto retry2;
> + }
> + ber_free( ber, 1 );
> return( -2 ); /* continue looking */
> }
>
> ***************
> *** 416,423 ****
> Debug( LDAP_DEBUG_ANY,
> "no request for response with msgid %ld
> (tossing)\n",
> (long) id, 0, 0 );
> ! ber_free( ber, 1 );
> ! return( -2 ); /* continue looking */
> }
>
> /* the message type */
> --- 424,430 ----
> Debug( LDAP_DEBUG_ANY,
> "no request for response with msgid %ld
> (tossing)\n",
> (long) id, 0, 0 );
> ! goto retry_ber;
> }
>
> /* the message type */
> ***************
> *** 692,698 ****
>
> new->lm_next = ld->ld_responses;
> ld->ld_responses = new;
> ! return( -2 ); /* continue looking */
> }
>
> Debug( LDAP_DEBUG_TRACE, "adding response id %ld type %ld:\n",
> --- 699,705 ----
>
> new->lm_next = ld->ld_responses;
> ld->ld_responses = new;
> ! goto leave;
> }
>
> Debug( LDAP_DEBUG_TRACE, "adding response id %ld type %ld:\n",
> ***************
> *** 729,734 ****
> --- 736,745 ----
> #endif /* !LDAP_WORLD_P16 */
> }
>
> + leave:
> + if ( ber_sockbuf_ctrl( sb, LBER_SB_OPT_DATA_READY, NULL ) ) {
> + goto retry;
> + }
> return( -2 ); /* continue looking */
> }
>