X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Fextended.c;h=a8ca02b29ef469a8ebdb3df7387c5ee35520f735;hb=df8f7cbb9b79be3be9205d116d1dd0b263d6861a;hp=31b4dd146c4337bc81d03899f48ee48d0bd7c63e;hpb=8c772985c7b7300665a30932d71d45c8af24af21;p=openldap diff --git a/libraries/libldap/extended.c b/libraries/libldap/extended.c index 31b4dd146c..a8ca02b29e 100644 --- a/libraries/libldap/extended.c +++ b/libraries/libldap/extended.c @@ -40,6 +40,7 @@ ldap_extended_operation( int *msgidp ) { BerElement *ber; + int rc; Debug( LDAP_DEBUG_TRACE, "ldap_extended_operation\n", 0, 0, 0 ); @@ -60,15 +61,24 @@ 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 */ - ++ld->ld_msgid, LDAP_REQ_EXTENDED, LDAP_TAG_EXOP_REQ_OID, - reqoid, LDAP_TAG_EXOP_REQ_VALUE, reqdata ) == -1 ) - { + if ( reqdata != NULL ) { + rc = ber_printf( ber, "{it{tstO}", /* '}' */ + ++ld->ld_msgid, LDAP_REQ_EXTENDED, + LDAP_TAG_EXOP_REQ_OID, reqoid, + LDAP_TAG_EXOP_REQ_VALUE, reqdata ); + + } else { + rc = ber_printf( ber, "{it{ts}", /* '}' */ + ++ld->ld_msgid, LDAP_REQ_EXTENDED, + LDAP_TAG_EXOP_REQ_OID, reqoid ); + } + + if( rc == -1 ) { ld->ld_errno = LDAP_ENCODING_ERROR; ber_free( ber, 1 ); return( ld->ld_errno ); @@ -152,10 +162,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 +180,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 +200,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 +214,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 ) {