]> git.sur5r.net Git - openldap/commitdiff
fix ITS#2435
authorPierangelo Masarati <ando@openldap.org>
Fri, 18 Apr 2003 00:49:05 +0000 (00:49 +0000)
committerPierangelo Masarati <ando@openldap.org>
Fri, 18 Apr 2003 00:49:05 +0000 (00:49 +0000)
CHANGES
servers/slapd/add.c
servers/slapd/delete.c
servers/slapd/modify.c
servers/slapd/modrdn.c

diff --git a/CHANGES b/CHANGES
index 66dcd1cd1984268ce5b77dbbb2c38209a8a5db7d..49438b160f5a46aa17250ed5edf651ba8e789387 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,7 @@
 OpenLDAP 2.1 Change Log
 
 OpenLDAP 2.1.18 Engineering
+       Fixed slave update when updateref missing bug (ITS#2435)
 
 OpenLDAP 2.1.17 Release
        Fixed libldap_r thread pool context bug (ITS#2404)
index 5c4092e63a4f45935afe67a28021a082506dfedc..05c4ee17c3dd665978a8fc6d0467b5a2f1e4f6d4 100644 (file)
@@ -210,11 +210,17 @@ do_add( Connection *conn, Operation *op )
        if ( be == NULL ) {
                BerVarray ref = referral_rewrite( default_referral,
                        NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
+               if ( ref == NULL ) ref = default_referral;
+               if ( ref != NULL ) {
+                       send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                               NULL, NULL, ref, NULL );
 
-               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                       NULL, NULL, ref ? ref : default_referral, NULL );
-
-               if ( ref ) ber_bvarray_free( ref );
+                       if ( ref != default_referral ) ber_bvarray_free( ref );
+               } else {
+                       send_ldap_result( conn, op,
+                                       rc = LDAP_UNWILLING_TO_PERFORM,
+                                       NULL, "referral missing", NULL, NULL );
+               }
                goto done;
        }
 
@@ -328,13 +334,22 @@ do_add( Connection *conn, Operation *op )
 
                        defref = be->be_update_refs
                                ? be->be_update_refs : default_referral;
-                       ref = referral_rewrite( defref,
-                               NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
 
-                       send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
-                               ref ? ref : defref, NULL );
+                       if ( defref ) {
+                               ref = referral_rewrite( defref,
+                                       NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
 
-                       if ( ref ) ber_bvarray_free( ref );
+                               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                                               NULL, NULL,
+                                               ref ? ref : defref, NULL );
+
+                               if ( ref ) ber_bvarray_free( ref );
+                       } else {
+                               send_ldap_result( conn, op,
+                                               rc = LDAP_UNWILLING_TO_PERFORM,
+                                               NULL, "referral missing",
+                                               NULL, NULL );
+                       }
 #endif /* SLAPD_MULTIMASTER */
                }
        } else {
index 89d3a8d49f4616740a5fbf3c6e573bffd81cdf6a..131dee64933ef070333e4fbc0e3ea78666deb097 100644 (file)
@@ -137,10 +137,17 @@ do_delete(
                BerVarray ref = referral_rewrite( default_referral,
                        NULL, &pdn, LDAP_SCOPE_DEFAULT );
 
-               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                       NULL, NULL, ref ? ref : default_referral, NULL );
+               if ( ref == NULL ) ref = default_referral;
+               if ( ref != NULL ) {
+                       send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                       NULL, NULL, ref, NULL );
 
-               ber_bvarray_free( ref );
+                       if ( ref != default_referral ) ber_bvarray_free( ref );
+               } else {
+                       send_ldap_result( conn, op,
+                                       rc = LDAP_UNWILLING_TO_PERFORM,
+                                       NULL, "referral missing", NULL, NULL );
+               }
                goto cleanup;
        }
 
@@ -209,19 +216,28 @@ do_delete(
                } else {
                        BerVarray defref = be->be_update_refs
                                ? be->be_update_refs : default_referral;
-                       BerVarray ref = referral_rewrite( default_referral,
-                               NULL, &pdn, LDAP_SCOPE_DEFAULT );
+                       if ( defref != NULL ) {
+                               BerVarray ref = referral_rewrite( defref,
+                                       NULL, &pdn, LDAP_SCOPE_DEFAULT );
 
-                       send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
-                               ref ? ref : defref, NULL );
+                               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                                               NULL, NULL,
+                                               ref ? ref : defref, NULL );
 
-                       ber_bvarray_free( ref );
+                               ber_bvarray_free( ref );
+                       } else {
+                               send_ldap_result( conn, op,
+                                               rc = LDAP_UNWILLING_TO_PERFORM,
+                                               NULL, "referral missing",
+                                               NULL, NULL );
+                       }
 #endif
                }
 
        } else {
                send_ldap_result( conn, op, rc = LDAP_UNWILLING_TO_PERFORM,
-                       NULL, "operation not supported within namingContext", NULL, NULL );
+                       NULL, "operation not supported within namingContext",
+                       NULL, NULL );
        }
 
 #if defined( LDAP_SLAPI )
index 0a6eb40680cf03c2afa5d9af29a21240276b0ec6..9e7a8d96c2e05e29a68b463816143420db5004e2 100644 (file)
@@ -309,11 +309,17 @@ do_modify(
        if ( (be = select_backend( &ndn, manageDSAit, 0 )) == NULL ) {
                BerVarray ref = referral_rewrite( default_referral,
                        NULL, &pdn, LDAP_SCOPE_DEFAULT );
+               if ( ref == NULL ) ref = default_referral;
+               if ( ref != NULL ) {
+                       send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                               NULL, NULL, ref, NULL );
 
-               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                       NULL, NULL, ref ? ref : default_referral, NULL );
-
-               ber_bvarray_free( ref );
+                       if ( ref != default_referral ) ber_bvarray_free( ref );
+               } else {
+                       send_ldap_result( conn, op,
+                                       rc = LDAP_UNWILLING_TO_PERFORM,
+                                       NULL, "referral missing", NULL, NULL );
+               }
                goto cleanup;
        }
 
@@ -435,13 +441,21 @@ do_modify(
                } else {
                        BerVarray defref = be->be_update_refs
                                ? be->be_update_refs : default_referral;
-                       BerVarray ref = referral_rewrite( defref,
-                               NULL, &pdn, LDAP_SCOPE_DEFAULT );
-
-                       send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
-                               ref ? ref : defref, NULL );
-
-                       ber_bvarray_free( ref );
+                       if ( defref != NULL ) {
+                               BerVarray ref = referral_rewrite( defref,
+                                       NULL, &pdn, LDAP_SCOPE_DEFAULT );
+
+                               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                                               NULL, NULL,
+                                               ref ? ref : defref, NULL );
+
+                               ber_bvarray_free( ref );
+                       } else {
+                               send_ldap_result( conn, op,
+                                               rc = LDAP_UNWILLING_TO_PERFORM,
+                                               NULL, "referral missing",
+                                               NULL, NULL );
+                       }
 #endif
                }
        } else {
index d2c11b96b1c3a7e92acca4f0f0e5f7bbd998c3c4..109e8f6ab5a4fdc51a6ccee58641e071af33a18b 100644 (file)
@@ -284,13 +284,20 @@ do_modrdn(
         * if we don't hold it.
         */
        if ( (be = select_backend( &ndn, manageDSAit, 0 )) == NULL ) {
-               BerVarray ref = referral_rewrite( default_referral,
-                       NULL, &pdn, LDAP_SCOPE_DEFAULT );
+               if ( default_referral != NULL ) {
+                       BerVarray ref = referral_rewrite( default_referral,
+                               NULL, &pdn, LDAP_SCOPE_DEFAULT );
 
-               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
-                       NULL, NULL, ref ? ref : default_referral, NULL );
+                       send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                               NULL, NULL,
+                               ref ? ref : default_referral, NULL );
 
-               ber_bvarray_free( ref );
+                       ber_bvarray_free( ref );
+               } else {
+                       send_ldap_result( conn, op,
+                                       rc = LDAP_UNWILLING_TO_PERFORM,
+                                       NULL, "referral missing", NULL, NULL );
+               }
                goto cleanup;
        }
 
@@ -386,13 +393,21 @@ do_modrdn(
                } else {
                        BerVarray defref = be->be_update_refs
                                ? be->be_update_refs : default_referral;
-                       BerVarray ref = referral_rewrite( defref,
-                               NULL, &pdn, LDAP_SCOPE_DEFAULT );
-
-                       send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
-                               ref ? ref : defref, NULL );
-
-                       ber_bvarray_free( ref );
+                       if ( defref ) {
+                               BerVarray ref = referral_rewrite( defref,
+                                       NULL, &pdn, LDAP_SCOPE_DEFAULT );
+
+                               send_ldap_result( conn, op, rc = LDAP_REFERRAL,
+                                               NULL, NULL,
+                                               ref ? ref : defref, NULL );
+
+                               ber_bvarray_free( ref );
+                       } else {
+                               send_ldap_result( conn, op,
+                                               rc = LDAP_UNWILLING_TO_PERFORM,
+                                               NULL, "referral missing",
+                                               NULL, NULL );
+                       }
 #endif
                }
        } else {