On Thu, Oct 27, 2011 at 04:25:07PM -0700, Quanah Gibson-Mount wrote:

> >Therefore, I propose the following Postfix fix/work-around which
> >is required for anyone running Postfix 2.3 or later, linked with
> >OpenLDAP 2.4 or later (perhaps even late 2.3.x releases, I just
> >compared OpenLDAP 2.3.4 with 2.4.23).
> 
> Hi Victor,
> 
> Your patch didn't change the behavior.  I did some debugging and
> fixed the problem with the following patch (I kept your patch in
> place in case it does anything).

If ldap_result() is not enough to detect the error, then we may
need to call ldap_parse_result (which should detect the error)
before calling ldap_parse_sasl_bind_result() (which decodes server
credentials, but no longer detects errors).

>  As far as the API change, the
> OpenLDAP primary developer responded with: "The old API was garbage
> because it didn't disclose whether an error occurred locally (in the
> API) or remotely (from the server). An application's
> recovery/response procedures need to be able to differentiate the
> two.

That's what different error codes are for, and changing semantics
of an under-documented long-standing API for cosmetic reasons is
folly.

> -#define FREE_RESULT 1
> -    return (ldap_parse_sasl_bind_result(dict_ldap->ld, res, 0,
> FREE_RESULT));
> +#define FREE_RESULT 0
> +    if ((rc = ldap_parse_sasl_bind_result(dict_ldap->ld, res, 0,
> FREE_RESULT)) != LDAP_SUCCESS)
> +       return (rc);
> +
> +    return(ldap_result2error( dict_ldap->ld, res, 1 ));
> }

This almost certainly leaks memory by not freeing the message,
and the ldap_result2error() function has the following comment
above in the OpenLDAP source code:

        /* deprecated */
        int
        ldap_result2error( LDAP *ld, LDAPMessage *r, int freeit )
        {
                int rc, err;
         
                rc = ldap_parse_result( ld, r, &err,
                        NULL, NULL, NULL, NULL, freeit );
         
                return err != LDAP_SUCCESS ? err : rc;
        }

A better solution is required, I'll post an updated proposal
tomorrow.
 
-- 
        Viktor.

Reply via email to