]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
Fix rev 1.52, frontendDB uses index {-1}.
[openldap] / servers / slapd / syncrepl.c
index 79643c6ee980eb9e57c3162ae395f31ad10c12c9..bf2f436b1af980f76f197a5319e0c051540b6ab4 100644 (file)
@@ -83,6 +83,9 @@ typedef struct syncinfo_s {
        int                                     si_syncdata;
        int                                     si_logstate;
        int                                     si_conn_setup;
+#ifdef HAVE_TLS
+       int                                     si_check_tls;
+#endif
        Avlnode                         *si_presentlist;
        LDAP                            *si_ld;
        LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;
@@ -433,7 +436,23 @@ do_syncrep1(
        }
 
        op->o_protocol = LDAP_VERSION3;
-       ldap_set_option( si->si_ld, LDAP_OPT_PROTOCOL_VERSION, &op->o_protocol );
+       ldap_set_option( si->si_ld, LDAP_OPT_PROTOCOL_VERSION,
+               (const void *)&op->o_protocol );
+
+#ifdef HAVE_TLS
+       if ( si->si_check_tls ) {
+               si->si_check_tls = 0;
+               rc = bindconf_tls_set( &si->si_bindconf, si->si_ld );
+       } else if ( si->si_bindconf.sb_tls_ctx ) {
+               rc = ldap_set_option( si->si_ld, LDAP_OPT_X_TLS_CTX,
+                       si->si_bindconf.sb_tls_ctx );
+       }
+       if ( rc ) {
+               Debug( LDAP_DEBUG_ANY,
+                       "do_syncrep1: TLS context initialization failed\n", 0, 0, 0 );
+               return rc;
+       }
+#endif
 
        /* Bind to master */
 
@@ -1672,8 +1691,13 @@ syncrepl_entry(
        f.f_choice = LDAP_FILTER_EQUALITY;
        f.f_ava = &ava;
        ava.aa_desc = slap_schema.si_ad_entryUUID;
-       (void)slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx );
        ava.aa_value = *syncUUID;
+
+       (void)slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx );
+       if ( syncuuid_bv ) {
+               Debug( LDAP_DEBUG_SYNC, "syncrepl_entry: inserted UUID %s\n",
+                       syncUUID_strrep.bv_val, 0, 0 );
+       }
        op->ors_filter = &f;
 
        op->ors_filterstr.bv_len = STRLENOF( "(entryUUID=)" ) + syncUUID_strrep.bv_len;
@@ -2051,8 +2075,12 @@ syncrepl_del_nonpresent(
 
                for (i=0; uuids[i].bv_val; i++) {
                        op->ors_slimit = 1;
+                       slap_uuidstr_from_normalized( &uf.f_av_value, &uuids[i],
+                               op->o_tmpmemctx );
+                       filter2bv_x( op, op->ors_filter, &op->ors_filterstr );
                        uf.f_av_value = uuids[i];
                        rc = be->be_search( op, &rs_search );
+                       op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
                }
                si->si_refreshDelete ^= NP_DELETE_ONE;
        } else {
@@ -2090,6 +2118,9 @@ syncrepl_del_nonpresent(
                        op->o_req_dn = *np_prev->npe_name;
                        op->o_req_ndn = *np_prev->npe_nname;
                        rc = op->o_bd->be_delete( op, &rs_delete );
+                       Debug( LDAP_DEBUG_SYNC,
+                               "syncrepl_del_nonpresent: be_delete %s (%d)\n", 
+                               op->o_req_dn.bv_val, rc, 0 );
 
                        if ( rs_delete.sr_err == LDAP_NOT_ALLOWED_ON_NONLEAF ) {
                                Modifications mod1, mod2;
@@ -2471,10 +2502,14 @@ nonpresent_callback(
                if ( !(si->si_refreshDelete & NP_DELETE_ONE )) {
                        a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryUUID );
 
-                       if ( a == NULL ) return 0;
+                       if ( a )
+                               present_uuid = avl_find( si->si_presentlist, &a->a_nvals[0],
+                                       syncuuid_cmp );
 
-                       present_uuid = avl_find( si->si_presentlist, &a->a_nvals[0],
-                               syncuuid_cmp );
+                       Debug( LDAP_DEBUG_SYNC, "nonpresent_callback: UUID %s, dn %s, %sfound\n",
+                               a ? a->a_vals[0].bv_val : "<missing>", rs->sr_entry->e_name.bv_val, present_uuid ? "" : "not " );
+
+                       if ( a == NULL ) return 0;
                }
 
                if ( present_uuid == NULL ) {
@@ -2593,6 +2628,16 @@ avl_ber_bvfree( void *v_bv )
 void
 syncinfo_free( syncinfo_t *sie )
 {
+       if ( sie->si_ld ) {
+               if ( sie->si_conn_setup ) {
+                       ber_socket_t s;
+                       ldap_get_option( sie->si_ld, LDAP_OPT_DESC, &s );
+                       connection_client_stop( s );
+                       sie->si_conn_setup = 0;
+               }
+               ldap_unbind_ext( sie->si_ld, NULL, NULL );
+       }
+
        /* re-fetch it, in case it was already removed */
        sie->si_re = ldap_pvt_runqueue_find( &slapd_rq, do_syncrepl, sie );
        if ( sie->si_re ) {
@@ -2656,9 +2701,6 @@ syncinfo_free( syncinfo_t *sie )
        if ( sie->si_presentlist ) {
            avl_free( sie->si_presentlist, avl_ber_bvfree );
        }
-       if ( sie->si_ld ) {
-               ldap_unbind_ext( sie->si_ld, NULL, NULL );
-       }
        while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist )) {
                struct nonpresent_entry* npe;
                npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist );
@@ -2728,6 +2770,7 @@ static struct {
        { BER_BVC("one"), LDAP_SCOPE_ONELEVEL },
        { BER_BVC("onelevel"), LDAP_SCOPE_ONELEVEL },   /* OpenLDAP extension */
        { BER_BVC("children"), LDAP_SCOPE_SUBORDINATE },
+       { BER_BVC("subord"), LDAP_SCOPE_SUBORDINATE },
        { BER_BVC("subordinate"), LDAP_SCOPE_SUBORDINATE },
        { BER_BVC("sub"), LDAP_SCOPE_SUBTREE },
        { BER_BVC("subtree"), LDAP_SCOPE_SUBTREE },     /* OpenLDAP extension */
@@ -2949,8 +2992,11 @@ parse_syncrepl_line(
                        } else if ( strchr( val, ':' ) != NULL ) {
                                char *next, *ptr = val;
                                unsigned dd, hh, mm, ss;
+
+                               /* NOTE: the test for ptr[ 0 ] == '-'
+                                * should go before the call to strtoul() */
                                dd = strtoul( ptr, &next, 10 );
-                               if ( next == ptr || next[0] != ':' ) {
+                               if ( ptr[ 0 ] == '-' || next == ptr || next[0] != ':' ) {
                                        snprintf( c->msg, sizeof( c->msg ),
                                                "Error: parse_syncrepl_line: "
                                                "invalid interval \"%s\", unable to parse days", val );
@@ -2959,7 +3005,7 @@ parse_syncrepl_line(
                                }
                                ptr = next + 1;
                                hh = strtoul( ptr, &next, 10 );
-                               if ( next == ptr || next[0] != ':' || hh > 24 ) {
+                               if ( ptr[ 0 ] == '-' || next == ptr || next[0] != ':' || hh > 24 ) {
                                        snprintf( c->msg, sizeof( c->msg ),
                                                "Error: parse_syncrepl_line: "
                                                "invalid interval \"%s\", unable to parse hours", val );
@@ -2968,7 +3014,7 @@ parse_syncrepl_line(
                                }
                                ptr = next + 1;
                                mm = strtoul( ptr, &next, 10 );
-                               if ( next == ptr || next[0] != ':' || mm > 60 ) {
+                               if ( ptr[ 0 ] == '-' || next == ptr || next[0] != ':' || mm > 60 ) {
                                        snprintf( c->msg, sizeof( c->msg ),
                                                "Error: parse_syncrepl_line: "
                                                "invalid interval \"%s\", unable to parse minutes", val );
@@ -2977,7 +3023,7 @@ parse_syncrepl_line(
                                }
                                ptr = next + 1;
                                ss = strtoul( ptr, &next, 10 );
-                               if ( next == ptr || next[0] != '\0' || ss > 60 ) {
+                               if ( ptr[ 0 ] == '-' || next == ptr || next[0] != '\0' || ss > 60 ) {
                                        snprintf( c->msg, sizeof( c->msg ),
                                                "Error: parse_syncrepl_line: "
                                                "invalid interval \"%s\", unable to parse seconds", val );
@@ -3187,6 +3233,10 @@ add_syncrepl(
        si->si_slimit = 0;
        si->si_conn_setup = 0;
 
+#ifdef HAVE_TLS
+       si->si_check_tls = 1;
+#endif
+
        si->si_presentlist = NULL;
        LDAP_LIST_INIT( &si->si_nonpresentlist );
        ldap_pvt_thread_mutex_init( &si->si_mutex );
@@ -3391,8 +3441,6 @@ syncrepl_config( ConfigArgs *c )
                }
                return 1;
        } else if ( c->op == LDAP_MOD_DELETE ) {
-               struct re_s *re;
-
                if ( c->be->be_syncinfo ) {
                        syncinfo_free( c->be->be_syncinfo );
                        c->be->be_syncinfo = NULL;