X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fextended.c;h=4f3f464562fefe8bc7ef1c92b5487af0c8d327cf;hb=c8e37af0ca8302c276e8c6af84eca4f926171261;hp=72657c3476a84cd4af62f66bc2c765fa06cd2017;hpb=48c8aa035d5711655dfabecdbb740164f02ff9d8;p=openldap diff --git a/libraries/libldap/extended.c b/libraries/libldap/extended.c index 72657c3476..4f3f464562 100644 --- a/libraries/libldap/extended.c +++ b/libraries/libldap/extended.c @@ -49,10 +49,6 @@ ldap_extended_operation( assert( msgidp != NULL ); /* must be version 3 (or greater) */ - if ( ld->ld_version == 0 ) { - ld->ld_version = LDAP_VERSION3; - } - if ( ld->ld_version < LDAP_VERSION3 ) { ld->ld_errno = LDAP_NOT_SUPPORTED; return( ld->ld_errno ); @@ -64,12 +60,12 @@ ldap_extended_operation( } /* create a message to send */ - if ( (ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) { + if ( (ber = ldap_alloc_ber_with_options( ld )) == NULL ) { ld->ld_errno = LDAP_NO_MEMORY; return( ld->ld_errno ); } - if ( ber_printf( ber, "{it{tstO}", /* leave '}' for later */ + if ( ber_printf( ber, "{it{tstO}", /* '}' */ ++ld->ld_msgid, LDAP_REQ_EXTENDED, LDAP_TAG_EXOP_REQ_OID, reqoid, LDAP_TAG_EXOP_REQ_VALUE, reqdata ) == -1 ) { @@ -156,10 +152,11 @@ ldap_parse_extended_result ( int freeit ) { BerElement *ber; - int rc; - unsigned long tag, len; + ber_tag_t rc; + ber_tag_t tag; + ber_len_t len; struct berval *resdata; - long errcode; + ber_int_t errcode; char *resoid; assert( ld != NULL ); @@ -173,6 +170,11 @@ ldap_parse_extended_result ( return ld->ld_errno; } + if( res->lm_msgtype == LDAP_RES_EXTENDED ) { + ld->ld_errno = LDAP_PARAM_ERROR; + return ld->ld_errno; + } + if( retoidp != NULL ) *retoidp = NULL; if( retdatap != NULL ) *retdatap = NULL; @@ -188,7 +190,7 @@ ldap_parse_extended_result ( ld->ld_matched = NULL; } - rc = ber_scanf( ber, "{iaa", &errcode, + rc = ber_scanf( ber, "{iaa" /*}*/, &errcode, &ld->ld_matched, &ld->ld_matched ); if( rc == LBER_ERROR ) { @@ -202,6 +204,15 @@ ldap_parse_extended_result ( tag = ber_peek_tag( ber, &len ); + if( tag == LDAP_TAG_REFERRAL ) { + /* skip over referral */ + tag = ber_scanf( ber, "x" ); + + if( tag != LBER_ERROR ) { + tag = ber_peek_tag( ber, &len ); + } + } + if( tag == LDAP_TAG_EXOP_RES_OID ) { /* we have a resoid */ if( ber_scanf( ber, "a", &resoid ) == LBER_ERROR ) {