]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/syncprov.c
Plug memleak when query isn't added to cache
[openldap] / servers / slapd / overlays / syncprov.c
index a62d0a0d0d8829ca15a8d54f9adcb78d6aafc56a..5eb40f4c00431902e8fa782b5ff2cf3390eabbff 100644 (file)
@@ -2,7 +2,7 @@
 /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2004-2005 The OpenLDAP Foundation.
+ * Copyright 2004-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -821,7 +821,7 @@ syncprov_qplay( Operation *op, slap_overinst *on, syncops *so )
        syncres *sr;
        Entry *e;
        opcookie opc;
-       int rc;
+       int rc = 0;
 
        opc.son = on;
        op->o_bd->bd_info = (BackendInfo *)on->on_info;
@@ -897,7 +897,7 @@ syncprov_qtask( void *ctx, void *arg )
        op->o_private = NULL;
        op->o_callback = NULL;
 
-       syncprov_qplay( op, on, so );
+       (void)syncprov_qplay( op, on, so );
 
        /* decrement use count... */
        syncprov_free_syncop( so );
@@ -949,12 +949,14 @@ syncprov_qresp( opcookie *opc, syncops *so, int mode )
                so->s_flags |= PS_FIND_BASE;
        }
        if ( so->s_flags & PS_IS_DETACHED ) {
+               int wake=0;
                ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
                if ( !so->s_qtask ) {
                        so->s_qtask = ldap_pvt_runqueue_insert( &slapd_rq, RUNQ_INTERVAL,
                                syncprov_qtask, so, "syncprov_qtask",
                                so->s_op->o_conn->c_peer_name.bv_val );
                        ++so->s_inuse;
+                       wake = 1;
                } else {
                        if (!ldap_pvt_runqueue_isrunning( &slapd_rq, so->s_qtask ) &&
                                !so->s_qtask->next_sched.tv_sec ) {
@@ -962,9 +964,12 @@ syncprov_qresp( opcookie *opc, syncops *so, int mode )
                                ldap_pvt_runqueue_resched( &slapd_rq, so->s_qtask, 0 );
                                so->s_qtask->interval.tv_sec = RUNQ_INTERVAL;
                                ++so->s_inuse;
+                               wake = 1;
                        }
                }
                ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
+               if ( wake )
+                       slap_wake_listener();
        }
        ldap_pvt_thread_mutex_unlock( &so->s_mutex );
        return LDAP_SUCCESS;
@@ -1273,7 +1278,7 @@ syncprov_add_slog( Operation *op, struct berval *csn )
                se->se_next = NULL;
                se->se_tag = op->o_tag;
 
-               se->se_uuid.bv_val = (char *)(se+1);
+               se->se_uuid.bv_val = (char *)(&se[1]);
                AC_MEMCPY( se->se_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len );
                se->se_uuid.bv_len = opc->suuid.bv_len;
 
@@ -1800,8 +1805,11 @@ syncprov_search_response( Operation *op, SlapReply *rs )
                        return SLAP_CB_CONTINUE;
                }
                a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN );
+               if ( a == NULL && rs->sr_operational_attrs != NULL ) {
+                       a = attr_find( rs->sr_operational_attrs, slap_schema.si_ad_entryCSN );
+               }
                if ( a ) {
-                       /* Make sure entry is less than the snaphot'd contextCSN */
+                       /* Make sure entry is less than the snapshot'd contextCSN */
                        if ( ber_bvcmp( &a->a_nvals[0], &ss->ss_ctxcsn ) > 0 )
                                return LDAP_SUCCESS;
 
@@ -2276,8 +2284,8 @@ syncprov_db_open(
        slap_overinst   *on = (slap_overinst *) be->bd_info;
        syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
 
-       Connection conn;
-       OperationBuffer opbuf;
+       Connection conn = { 0 };
+       OperationBuffer opbuf = { 0 };
        char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
        Operation *op = (Operation *) &opbuf;
        Entry *e;
@@ -2320,12 +2328,14 @@ syncprov_db_open(
                        strcpy( ctxcsnbuf, si->si_ctxcsnbuf );
                }
                be_entry_release_rw( op, e, 0 );
-               op->o_bd->bd_info = (BackendInfo *)on;
-               op->o_req_dn = be->be_suffix[0];
-               op->o_req_ndn = be->be_nsuffix[0];
-               op->ors_scope = LDAP_SCOPE_SUBTREE;
-               ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );
-               ldap_pvt_thread_join( tid, NULL );
+               if ( !BER_BVISEMPTY( &si->si_ctxcsn ) ) {
+                       op->o_bd->bd_info = (BackendInfo *)on;
+                       op->o_req_dn = be->be_suffix[0];
+                       op->o_req_ndn = be->be_nsuffix[0];
+                       op->ors_scope = LDAP_SCOPE_SUBTREE;
+                       ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );
+                       ldap_pvt_thread_join( tid, NULL );
+               }
        } else if ( SLAP_SYNC_SHADOW( op->o_bd )) {
                /* If we're also a consumer, and we didn't find the context entry,
                 * then don't generate anything, wait for our provider to send it
@@ -2419,6 +2429,17 @@ syncprov_db_destroy(
        syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
 
        if ( si ) {
+               if ( si->si_logs ) {
+                       slog_entry *se = si->si_logs->sl_head;
+
+                       while ( se ) {
+                               slog_entry *se_next = se->se_next;
+                               ch_free( se );
+                               se = se_next;
+                       }
+                               
+                       ch_free( si->si_logs );
+               }
                ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex );
                ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex );
                ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex );
@@ -2542,7 +2563,7 @@ syncprov_initialize()
        int rc;
 
        rc = register_supported_control( LDAP_CONTROL_SYNC,
-               SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
+               SLAP_CTRL_SEARCH, NULL,
                syncprov_parseCtrl, &slap_cids.sc_LDAPsync );
        if ( rc != LDAP_SUCCESS ) {
                Debug( LDAP_DEBUG_ANY,