From: Kurt Zeilenga Date: Fri, 21 Feb 2003 18:39:26 +0000 (+0000) Subject: ITS#2325 fix: properly freeing prompts->results X-Git-Tag: NO_SLAP_OP_BLOCKS~327 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9e984beded4ccae20c76ff1a5cb8c1e14febd076;p=openldap ITS#2325 fix: properly freeing prompts->results --- diff --git a/libraries/libldap/cyrus.c b/libraries/libldap/cyrus.c index 3032f8c8dc..922f22c185 100644 --- a/libraries/libldap/cyrus.c +++ b/libraries/libldap/cyrus.c @@ -601,36 +601,20 @@ ldap_int_sasl_bind( if( saslrc == SASL_INTERACT ) { int res; - -#if SASL_VERSION_MAJOR >= 2 - /* XXX the application should free interact results. - * FIXME: this should happen only - * if saslrc == SASL_INTERACT - * - * I assume that prompts->result is not needed - * by the subsequent call to (interact)() */ - if ( prompts != NULL && prompts->result != NULL ) { - LDAP_FREE( (void *)prompts->result ); - prompts->result = NULL; - } -#endif - if( !interact ) break; res = (interact)( ld, flags, defaults, prompts ); - if( res != LDAP_SUCCESS ) { - break; - } + if( res != LDAP_SUCCESS ) break; } } while ( saslrc == SASL_INTERACT ); ccred.bv_len = credlen; if ( (saslrc != SASL_OK) && (saslrc != SASL_CONTINUE) ) { - ld->ld_errno = sasl_err2ldap( saslrc ); + rc = ld->ld_errno = sasl_err2ldap( saslrc ); #if SASL_VERSION_MAJOR >= 2 ld->ld_error = (char *)sasl_errdetail( ctx ); #endif - return ld->ld_errno; + goto done; } do { @@ -662,7 +646,8 @@ ldap_int_sasl_bind( #endif ber_bvfree( scred ); } - return ld->ld_errno; + rc = ld->ld_errno; + goto done; } if( rc == LDAP_SUCCESS && saslrc == SASL_OK ) { @@ -679,7 +664,8 @@ ldap_int_sasl_bind( rc, saslrc, scred->bv_len ); #endif ber_bvfree( scred ); - return ld->ld_errno = LDAP_LOCAL_ERROR; + rc = ld->ld_errno = LDAP_LOCAL_ERROR; + goto done; } break; } @@ -712,9 +698,7 @@ ldap_int_sasl_bind( int res; if( !interact ) break; res = (interact)( ld, flags, defaults, prompts ); - if( res != LDAP_SUCCESS ) { - break; - } + if( res != LDAP_SUCCESS ) break; } } while ( saslrc == SASL_INTERACT ); @@ -726,19 +710,19 @@ ldap_int_sasl_bind( #if SASL_VERSION_MAJOR >= 2 ld->ld_error = (char *)sasl_errdetail( ctx ); #endif - return ld->ld_errno; + rc = ld->ld_errno; + goto done; } } while ( rc == LDAP_SASL_BIND_IN_PROGRESS ); - if ( rc != LDAP_SUCCESS ) { - return rc; - } + if ( rc != LDAP_SUCCESS ) goto done; if ( saslrc != SASL_OK ) { #if SASL_VERSION_MAJOR >= 2 ld->ld_error = (char *)sasl_errdetail( ctx ); #endif - return ld->ld_errno = sasl_err2ldap( saslrc ); + rc = ld->ld_errno = sasl_err2ldap( saslrc ); + goto done; } if( flags != LDAP_SASL_QUIET ) { @@ -772,6 +756,12 @@ ldap_int_sasl_bind( } } +done: + if( interact ) { + /* cleanup */ + (void) (interact)( NULL, flags, defaults, prompts ); + } + return rc; } diff --git a/libraries/liblutil/sasl.c b/libraries/liblutil/sasl.c index 6dd4df5c6f..0746cf6447 100644 --- a/libraries/liblutil/sasl.c +++ b/libraries/liblutil/sasl.c @@ -190,6 +190,16 @@ int lutil_sasl_interact( { sasl_interact_t *interact = in; + if( interact->result ) { + /* we have results from a previous interaction */ + free( interact->result ); + interact->result = NULL; + } + + if( ld == NULL ) { + return LDAP_SUCCESS; + } + if( flags == LDAP_SASL_INTERACTIVE ) { fputs( "SASL Interaction\n", stderr ); }