]> git.sur5r.net Git - openldap/commitdiff
For LDAPV2 results, make sure Referrals are appended to any error text
authorHoward Chu <hyc@openldap.org>
Wed, 27 Oct 1999 04:36:10 +0000 (04:36 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 27 Oct 1999 04:36:10 +0000 (04:36 +0000)
instead of replacing it.

servers/slapd/result.c

index 31b130aef5c714ecb5ea8a1f09c46916d3cdcd74..78b5f7d99c4a2c51833c01b6cf2d9e451bf9bbcb 100644 (file)
 /* we need LBER internals */
 #include "../../libraries/liblber/lber-int.h"
 
-static char *v2ref( struct berval **ref )
+static char *v2ref( struct berval **ref, const char *text )
 {
-       size_t len, i;
+       size_t len = 0, i = 0;
        char *v2;
 
-       if(ref == NULL) return NULL;
+       if(ref == NULL) return (char *)text;
 
-       len = sizeof("Referral:");
-       v2 = ch_strdup("Referral:");
+       if (text) {
+               len = strlen( text );
+               if (text[len-1] != '\n')
+                   i = 1;
+       }
+       v2 = ch_malloc( len+i+sizeof("Referral:") );
+       if (text) {
+               strcpy(v2, text);
+               if (i)
+                       v2[len++] = '\n';
+       }
+       strcpy( v2+len, "Referral:" );
 
        for( i=0; ref[i] != NULL; i++ ) {
                v2 = ch_realloc( v2, len + ref[i]->bv_len + 1 );
@@ -384,12 +394,15 @@ send_ldap_result(
                        err = LDAP_NO_SUCH_OBJECT;
                } else if ( op->o_protocol < LDAP_VERSION3 ) {
                        err = LDAP_PARTIAL_RESULTS;
-                       tmp = v2ref( ref );
-                       text = tmp;
-                       ref = NULL;
                }
        }
 
+       if ( op->o_protocol < LDAP_VERSION3 ) {
+               tmp = v2ref( ref, text );
+               text = tmp;
+               ref = NULL;
+       }
+
        tag = req2res( op->o_tag );
        msgid = (tag != LBER_SEQUENCE) ? op->o_msgid : 0;
 
@@ -449,11 +462,9 @@ send_search_result(
                        err = LDAP_PARTIAL_RESULTS;
                }
 
-               tmp = v2ref( refs );
+               tmp = v2ref( refs, text );
+               text = tmp;
                refs = NULL;
-
-               if( tmp != NULL ) text = tmp;
-
        } else {
                /* don't send references in search results */
                assert( refs == NULL );