X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fextended.c;h=4f3f464562fefe8bc7ef1c92b5487af0c8d327cf;hb=1fd3c797a822ac121a481f5ba686779d6e620ed8;hp=31b4dd146c4337bc81d03899f48ee48d0bd7c63e;hpb=8c772985c7b7300665a30932d71d45c8af24af21;p=openldap diff --git a/libraries/libldap/extended.c b/libraries/libldap/extended.c index 31b4dd146c..4f3f464562 100644 --- a/libraries/libldap/extended.c +++ b/libraries/libldap/extended.c @@ -60,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 ) { @@ -152,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 ); @@ -169,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; @@ -184,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 ) { @@ -198,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 ) {