]> git.sur5r.net Git - openldap/commitdiff
ITS#4613 fix
authorQuanah Gibson-Mount <quanah@openldap.org>
Sat, 29 Jul 2006 00:11:19 +0000 (00:11 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Sat, 29 Jul 2006 00:11:19 +0000 (00:11 +0000)
more ITS#4622 fixes: syncprov: delete contextCSN on checkpoint if ctxcsn is empty

servers/slapd/overlays/syncprov.c

index 5a3b4185c631d59e0060deaee0d11d62152d5dfc..271a48a672bef92bf36a534d73e5d5582267fde5 100644 (file)
@@ -1244,9 +1244,14 @@ syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
        struct berval bv[2];
        slap_callback cb = {0};
 
-       mod.sml_values = bv;
-       bv[1].bv_val = NULL;
-       bv[0] = si->si_ctxcsn;
+       /* If ctxcsn is empty, delete it */
+       if ( BER_BVISEMPTY( &si->si_ctxcsn )) {
+               mod.sml_values = NULL;
+       } else {
+               mod.sml_values = bv;
+               bv[1].bv_val = NULL;
+               bv[0] = si->si_ctxcsn;
+       }
        mod.sml_nvalues = NULL;
        mod.sml_desc = slap_schema.si_ad_contextCSN;
        mod.sml_op = LDAP_MOD_REPLACE;
@@ -1366,6 +1371,7 @@ syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl,
                        i++;
                        AC_MEMCPY( cbuf, se->se_csn.bv_val, se->se_csn.bv_len );
                        delcsn.bv_len = se->se_csn.bv_len;
+                       delcsn.bv_val[delcsn.bv_len] = '\0';
                } else {
                        nmods++;
                        j = num - nmods;
@@ -2326,6 +2332,12 @@ syncprov_db_open(
        int rc;
        void *thrctx = NULL;
 
+       if ( !SLAP_LASTMOD( be )) {
+               Debug( LDAP_DEBUG_ANY,
+                       "syncprov_db_open: invalid config, lastmod must be enabled\n", 0, 0, 0 );
+               return -1;
+       }
+
        if ( slapMode & SLAP_TOOL_MODE ) {
                return 0;
        }
@@ -2369,15 +2381,16 @@ syncprov_db_open(
                        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
-                * to us.
-                */
-               goto out;
        }
 
        if ( BER_BVISEMPTY( &si->si_ctxcsn ) ) {
+               if ( SLAP_SYNC_SHADOW( op->o_bd )) {
+               /* If we're also a consumer, and we didn't get a contextCSN,
+                * then don't generate anything, wait for our provider to send it
+                * to us.
+                */
+                       goto out;
+               }
                si->si_ctxcsn.bv_len = sizeof( si->si_ctxcsnbuf );
                slap_get_csn( op, &si->si_ctxcsn, 0 );
        }