]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/syncrepl.c
allow empty modlist
[openldap] / servers / slapd / syncrepl.c
index 100daa327d4a32e1f782b7e37383576905b5e8d2..0e20fa7707d6320624cd155a7c79d24a558d93c7 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 */
 
@@ -2600,6 +2619,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 ) {
@@ -2663,9 +2692,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 );
@@ -2735,6 +2761,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 */
@@ -2956,8 +2983,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 );
@@ -2966,7 +2996,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 );
@@ -2975,7 +3005,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 );
@@ -2984,7 +3014,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 );
@@ -3194,6 +3224,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 );
@@ -3398,8 +3432,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;