]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/search.c
import fix to ITS#4861
[openldap] / servers / slapd / back-ldap / search.c
index 3c7c9a342153d97e7bed4244f2aa6095aa327017..f30fdc5ae10a71356ff5e97191b1c01bb4be4979 100644 (file)
@@ -420,32 +420,48 @@ retry:
                                freetext = 1;
                        }
 
-                       if ( references && references[ 0 ] && references[ 0 ][ 0 ] ) {
-                               int     cnt;
-
+                       /* RFC 4511: referrals can only appear
+                        * if result code is LDAP_REFERRAL */
+                       if ( references 
+                               && references[ 0 ]
+                               && references[ 0 ][ 0 ] )
+                       {
                                if ( rs->sr_err != LDAP_REFERRAL ) {
-                                       /* FIXME: error */
                                        Debug( LDAP_DEBUG_ANY,
                                                "%s ldap_back_search: "
-                                               "got referrals with %d\n",
+                                               "got referrals with err=%d\n",
                                                op->o_log_prefix,
                                                rs->sr_err, 0 );
-                                       rs->sr_err = LDAP_REFERRAL;
-                               }
 
-                               for ( cnt = 0; references[ cnt ]; cnt++ )
-                                       /* NO OP */ ;
+                               } else {
+                                       int     cnt;
+
+                                       for ( cnt = 0; references[ cnt ]; cnt++ )
+                                               /* NO OP */ ;
                                
-                               rs->sr_ref = op->o_tmpalloc( ( cnt + 1 ) * sizeof( struct berval ),
-                                       op->o_tmpmemctx );
+                                       rs->sr_ref = op->o_tmpalloc( ( cnt + 1 ) * sizeof( struct berval ),
+                                               op->o_tmpmemctx );
 
-                               for ( cnt = 0; references[ cnt ]; cnt++ ) {
-                                       /* duplicating ...*/
-                                       ber_str2bv( references[ cnt ], 0, 1, &rs->sr_ref[ cnt ] );
+                                       for ( cnt = 0; references[ cnt ]; cnt++ ) {
+                                               /* duplicating ...*/
+                                               ber_str2bv( references[ cnt ], 0, 1, &rs->sr_ref[ cnt ] );
+                                       }
+                                       BER_BVZERO( &rs->sr_ref[ cnt ] );
                                }
-                               BER_BVZERO( &rs->sr_ref[ cnt ] );
+
+                       } else if ( rs->sr_err == LDAP_REFERRAL ) {
+                               Debug( LDAP_DEBUG_ANY,
+                                       "%s ldap_back_search: "
+                                       "got err=%d with null "
+                                       "or empty referrals\n",
+                                       op->o_log_prefix,
+                                       rs->sr_err, 0 );
+
+                               rs->sr_err = LDAP_NO_SUCH_OBJECT;
                        }
 
+                       ber_memvfree( (void **)references );
+
                        if ( match.bv_val != NULL ) {
 #ifndef LDAP_NULL_IS_NULL
                                if ( match.bv_val[ 0 ] == '\0' ) {
@@ -464,11 +480,6 @@ retry:
                        }
 #endif /* LDAP_NULL_IS_NULL */
 
-                       /* cleanup */
-                       if ( references ) {
-                               ber_memvfree( (void **)references );
-                       }
-
                        rc = 0;
                        break;
                }