]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/extended.c
Validate outvalue after session param.
[openldap] / libraries / libldap / extended.c
index 31b4dd146c4337bc81d03899f48ee48d0bd7c63e..4f3f464562fefe8bc7ef1c92b5487af0c8d327cf 100644 (file)
@@ -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 ) {