From d069bf775fef14be7e7f399e3408384d2521131a Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Sun, 12 Sep 2004 22:22:38 +0000 Subject: [PATCH] syncrepl memleak fix --- CHANGES | 5 + build/version.var | 2 +- doc/man/man5/ldif.5 | 4 +- servers/slapd/add.c | 2 +- servers/slapd/back-sql/backsql.dsp | 205 ----------------------------- servers/slapd/backend.c | 8 ++ servers/slapd/config.c | 53 ++------ servers/slapd/dn.c | 27 ++++ servers/slapd/modify.c | 7 +- servers/slapd/modrdn.c | 3 +- servers/slapd/passwd.c | 2 +- servers/slapd/proto-slap.h | 5 +- servers/slapd/sasl.c | 2 +- servers/slapd/slap.h | 1 - servers/slapd/slapi/slapi_ops.c | 4 +- servers/slapd/syncrepl.c | 120 +++++++++++++++-- 16 files changed, 176 insertions(+), 274 deletions(-) delete mode 100644 servers/slapd/back-sql/backsql.dsp diff --git a/CHANGES b/CHANGES index 92e4fd3232..097844e5eb 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,10 @@ OpenLDAP 2.2 Change Log +OpenLDAP 2.2.17 Engineering + Fixed slapd syncrepl memory leak bugs + Documentation + Updated ldif(5) + OpenLDAP 2.2.16 Release Fixed libldap getaddrinfo hints portability bug (ITS#3279) Fixed libldap find_connection bug (ITS#3280) diff --git a/build/version.var b/build/version.var index e27a32eb43..5901b3bbc8 100644 --- a/build/version.var +++ b/build/version.var @@ -15,7 +15,7 @@ ol_package=OpenLDAP ol_major=2 ol_minor=2 -ol_patch=16 +ol_patch=X ol_api_inc=20216 ol_api_current=7 ol_api_revision=9 diff --git a/doc/man/man5/ldif.5 b/doc/man/man5/ldif.5 index fe65b44957..2ba9484379 100644 --- a/doc/man/man5/ldif.5 +++ b/doc/man/man5/ldif.5 @@ -82,7 +82,7 @@ Here is an example of an LDIF file containing three entries. cn: Barbara J Jensen cn: Babs Jensen objectclass: person - description:< file://tmp/babs + description:< file:///tmp/babs sn: Jensen dn: cn=Bjorn J Jensen,dc=example,dc=com @@ -104,7 +104,7 @@ Here is an example of an LDIF file containing three entries. .fi .LP Notice that the description in Barbara Jensen's entry is -read from file://tmp/babs and the jpegPhoto in Jennifer +read from file:///tmp/babs and the jpegPhoto in Jennifer Jensen's entry is encoded using base 64. .SH SEE ALSO .BR ldap (3), diff --git a/servers/slapd/add.c b/servers/slapd/add.c index db2b0743ba..f0035c5d3e 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -279,7 +279,7 @@ do_add( Operation *op, SlapReply *rs ) assert( (*modtail)->sml_desc != NULL ); } rs->sr_err = slap_mods_opattrs( op, modlist, modtail, - &rs->sr_text, textbuf, textlen ); + &rs->sr_text, textbuf, textlen, 1 ); if( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); goto done; diff --git a/servers/slapd/back-sql/backsql.dsp b/servers/slapd/back-sql/backsql.dsp deleted file mode 100644 index 8a5189e935..0000000000 --- a/servers/slapd/back-sql/backsql.dsp +++ /dev/null @@ -1,205 +0,0 @@ -# Microsoft Developer Studio Project File - Name="backsql" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 5.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=backsql - Win32 Single Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "backsql.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "backsql.mak" CFG="backsql - Win32 Single Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "backsql - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "backsql - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "backsql - Win32 Single Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "backsql - Win32 Single Release" (based on\ - "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe - -!IF "$(CFG)" == "backsql - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\Release" -# PROP Intermediate_Dir "..\..\..\Release\backsql" -# PROP Target_Dir "" -RSC=rc.exe -# ADD BASE RSC /l 0x419 -# ADD RSC /l 0x419 -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\\" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "backsql - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\Debug" -# PROP Intermediate_Dir "..\..\..\Debug\backsql" -# PROP Target_Dir "" -RSC=rc.exe -# ADD BASE RSC /l 0x419 -# ADD RSC /l 0x419 -# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MTd /W3 /GX /Z7 /Od /I "..\\" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "backsql - Win32 Single Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "backsql" -# PROP BASE Intermediate_Dir "backsql" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "..\..\..\SDebug" -# PROP Intermediate_Dir "..\..\..\SDebug\backsql" -# PROP Target_Dir "" -RSC=rc.exe -# ADD BASE RSC /l 0x419 -# ADD RSC /l 0x419 -# ADD BASE CPP /nologo /MTd /W3 /GX /Z7 /Od /I "..\\" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c -# ADD CPP /nologo /W3 /GX /Z7 /Od /I "..\\" /I "..\..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /c -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "backsql - Win32 Single Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "backldb0" -# PROP BASE Intermediate_Dir "backldb0" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "..\..\..\SRelease" -# PROP Intermediate_Dir "..\..\..\SRelease\backsql" -# PROP Target_Dir "" -RSC=rc.exe -# ADD BASE RSC /l 0x419 -# ADD RSC /l 0x419 -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /I "..\\" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\\" /I "..\..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "backsql - Win32 Release" -# Name "backsql - Win32 Debug" -# Name "backsql - Win32 Single Debug" -# Name "backsql - Win32 Single Release" -# Begin Source File - -SOURCE=".\back-sql.h" -# End Source File -# Begin Source File - -SOURCE=.\bind.c -# End Source File -# Begin Source File - -SOURCE=.\config.c -# End Source File -# Begin Source File - -SOURCE=".\entry-id.c" -# End Source File -# Begin Source File - -SOURCE=".\entry-id.h" -# End Source File -# Begin Source File - -SOURCE=.\external.h -# End Source File -# Begin Source File - -SOURCE=.\init.c -# End Source File -# Begin Source File - -SOURCE=.\modify.c -# End Source File -# Begin Source File - -SOURCE=.\other.c -# End Source File -# Begin Source File - -SOURCE=".\schema-map.c" -# End Source File -# Begin Source File - -SOURCE=".\schema-map.h" -# End Source File -# Begin Source File - -SOURCE=.\search.c -# End Source File -# Begin Source File - -SOURCE=".\sql-types.h" -# End Source File -# Begin Source File - -SOURCE=".\sql-wrap.c" -# End Source File -# Begin Source File - -SOURCE=".\sql-wrap.h" -# End Source File -# Begin Source File - -SOURCE=.\util.c -# End Source File -# Begin Source File - -SOURCE=.\util.h -# End Source File -# End Target -# End Project diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 823436a33a..79923821be 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -520,11 +520,19 @@ int backend_destroy(void) { int i; BackendDB *bd; + syncinfo_t *si_entry; ldap_pvt_thread_pool_destroy( &syncrepl_pool, 1 ); /* destroy each backend database */ for( i = 0, bd = backendDB; i < nBackendDB; i++, bd++ ) { + + while ( !LDAP_STAILQ_EMPTY( &bd->be_syncinfo )) { + si_entry = LDAP_STAILQ_FIRST( &bd->be_syncinfo ); + LDAP_STAILQ_REMOVE_HEAD( &bd->be_syncinfo, si_next ); + syncinfo_free( si_entry ); + } + if ( bd->bd_info->bi_db_destroy ) { bd->bd_info->bi_db_destroy( bd ); } diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 354c1a902c..c12b4c5188 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -2952,7 +2952,7 @@ add_syncrepl( } si->si_bindmethod = LDAP_AUTH_SIMPLE; si->si_schemachecking = 0; - ber_str2bv( "(objectclass=*)", sizeof("(objectclass=*)")-1, 0, + ber_str2bv( "(objectclass=*)", STRLENOF("(objectclass=*)"), 1, &si->si_filterstr ); si->si_base.bv_val = NULL; si->si_scope = LDAP_SCOPE_SUBTREE; @@ -2963,9 +2963,9 @@ add_syncrepl( si->si_exattrs[0] = NULL; si->si_type = LDAP_SYNC_REFRESH_ONLY; si->si_interval = 86400; - si->si_retryinterval = 0; - si->si_retrynum_init = 0; - si->si_retrynum = 0; + si->si_retryinterval = NULL; + si->si_retrynum_init = NULL; + si->si_retrynum = NULL; si->si_syncCookie.ctxcsn = NULL; si->si_syncCookie.octet_str = NULL; si->si_syncCookie.sid = -1; @@ -2995,46 +2995,7 @@ add_syncrepl( } if ( rc < 0 || duplicated_replica_id ) { - syncinfo_t *si_entry; - /* Something bad happened - back out */ -#ifdef NEW_LOGGING - LDAP_LOG( CONFIG, ERR, "failed to add syncinfo\n", 0, 0,0 ); -#else Debug( LDAP_DEBUG_ANY, "failed to add syncinfo\n", 0, 0, 0 ); -#endif - - /* If error, remove all syncinfo */ - LDAP_STAILQ_FOREACH( si_entry, &be->be_syncinfo, si_next ) { - if ( si_entry->si_updatedn.bv_val ) { - ch_free( si->si_updatedn.bv_val ); - } - if ( si_entry->si_filterstr.bv_val ) { - ch_free( si->si_filterstr.bv_val ); - } - if ( si_entry->si_attrs ) { - int i = 0; - while ( si_entry->si_attrs[i] != NULL ) { - ch_free( si_entry->si_attrs[i] ); - i++; - } - ch_free( si_entry->si_attrs ); - } - if ( si_entry->si_exattrs ) { - int i = 0; - while ( si_entry->si_exattrs[i] != NULL ) { - ch_free( si_entry->si_exattrs[i] ); - i++; - } - ch_free( si_entry->si_exattrs ); - } - } - - while ( !LDAP_STAILQ_EMPTY( &be->be_syncinfo )) { - si_entry = LDAP_STAILQ_FIRST( &be->be_syncinfo ); - LDAP_STAILQ_REMOVE_HEAD( &be->be_syncinfo, si_next ); - ch_free( si_entry ); - } - LDAP_STAILQ_INIT( &be->be_syncinfo ); return 1; } else { #ifdef NEW_LOGGING @@ -3130,7 +3091,7 @@ parse_syncrepl_line( si->si_provideruri_bv = (BerVarray) ch_calloc( 2, sizeof( struct berval )); ber_str2bv( si->si_provideruri, strlen( si->si_provideruri ), - 0, &si->si_provideruri_bv[0] ); + 1, &si->si_provideruri_bv[0] ); si->si_provideruri_bv[1].bv_len = 0; si->si_provideruri_bv[1].bv_val = NULL; gots |= GOT_PROVIDER; @@ -3193,11 +3154,15 @@ parse_syncrepl_line( } else if ( !strncasecmp( cargv[ i ], AUTHCSTR, sizeof( AUTHCSTR ) - 1 ) ) { val = cargv[ i ] + sizeof( AUTHCSTR ); + if ( si->si_authcId ) + ch_free( si->si_authcId ); si->si_authcId = ch_strdup( val ); } else if ( !strncasecmp( cargv[ i ], OLDAUTHCSTR, sizeof( OLDAUTHCSTR ) - 1 ) ) { /* Old authcID is provided for some backwards compatibility */ val = cargv[ i ] + sizeof( OLDAUTHCSTR ); + if ( si->si_authcId ) + ch_free( si->si_authcId ); si->si_authcId = ch_strdup( val ); } else if ( !strncasecmp( cargv[ i ], AUTHZSTR, sizeof( AUTHZSTR ) - 1 ) ) { diff --git a/servers/slapd/dn.c b/servers/slapd/dn.c index f00cfacdc2..1c59250ea4 100644 --- a/servers/slapd/dn.c +++ b/servers/slapd/dn.c @@ -700,6 +700,33 @@ dnParent( return; } +/* + * dnRdn - dn's rdn, in-place + * note: the incoming dn is assumed to be normalized/prettyfied, + * so that escaped rdn/ava separators are in '\'+hexpair form + */ +void +dnRdn( + struct berval *dn, + struct berval *rdn ) +{ + char *p; + + *rdn = *dn; + p = strchr( dn->bv_val, ',' ); + + /* one-level dn */ + if ( p == NULL ) { + return; + } + + assert( DN_SEPARATOR( p[ 0 ] ) ); + assert( ATTR_LEADCHAR( p[ 1 ] ) ); + rdn->bv_len = p - dn->bv_val; + + return; +} + int dnExtractRdn( struct berval *dn, diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index d485633860..584cfb0660 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -487,7 +487,7 @@ do_modify( } rs->sr_err = slap_mods_opattrs( op, modlist, modtail, - &rs->sr_text, textbuf, textlen ); + &rs->sr_text, textbuf, textlen, 1 ); if( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); goto cleanup; @@ -830,7 +830,8 @@ int slap_mods_opattrs( Modifications *mods, Modifications **modtail, const char **text, - char *textbuf, size_t textlen ) + char *textbuf, size_t textlen, + int manage_ctxcsn ) { struct berval name, timestamp, csn; struct berval nname; @@ -859,7 +860,7 @@ int slap_mods_opattrs( #endif /* HAVE_GMTIME_R */ lutil_gentime( timebuf, sizeof(timebuf), ltm ); - slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, 1 ); + slap_get_csn( op, csnbuf, sizeof(csnbuf), &csn, manage_ctxcsn ); #ifndef HAVE_GMTIME_R ldap_pvt_thread_mutex_unlock( &gmtime_mutex ); diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index 3e76ad1e75..938a7734cb 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -630,7 +630,8 @@ done: /* empty */ } - rs->sr_err = slap_mods_opattrs( op, mod, modtail, &rs->sr_text, textbuf, textlen ); + rs->sr_err = slap_mods_opattrs( op, mod, modtail, + &rs->sr_text, textbuf, textlen, 1 ); } /* LDAP v2 supporting correct attribute handling. */ diff --git a/servers/slapd/passwd.c b/servers/slapd/passwd.c index 25d541d895..6e933ca401 100644 --- a/servers/slapd/passwd.c +++ b/servers/slapd/passwd.c @@ -199,7 +199,7 @@ int passwd_extop( * if it cares... */ rs->sr_err = slap_mods_opattrs( &op2, ml, qpw->rs_modtail, &rs->sr_text, - NULL, 0 ); + NULL, 0, 1 ); if ( rs->sr_err == LDAP_SUCCESS ) { rs->sr_err = op2.o_bd->be_modify( &op2, rs ); diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index fba64839c1..216f37098e 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -481,6 +481,7 @@ LDAP_SLAPD_F (void) build_new_dn LDAP_P(( void *memctx )); LDAP_SLAPD_F (void) dnParent LDAP_P(( struct berval *dn, struct berval *pdn )); +LDAP_SLAPD_F (void) dnRdn LDAP_P(( struct berval *dn, struct berval *rdn )); LDAP_SLAPD_F (int) dnX509normalize LDAP_P(( void *x509_name, struct berval *out )); @@ -693,7 +694,8 @@ LDAP_SLAPD_F( int ) slap_mods_opattrs( Modifications *mods, Modifications **modlist, const char **text, - char *textbuf, size_t textlen ); + char *textbuf, size_t textlen, + int manage_ctxcsn ); /* * mods.c @@ -1145,6 +1147,7 @@ LDAP_SLAPD_F (struct berval *) slap_uuidstr_from_normalized LDAP_P(( struct berval *, struct berval *, void * )); LDAP_SLAPD_F (int) syncrepl_isupdate LDAP_P(( Operation * )); LDAP_SLAPD_F (int) syncrepl_isupdate_dn LDAP_P(( Backend *, struct berval * )); +LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( syncinfo_t * )); /* syntax.c */ LDAP_SLAPD_F (Syntax *) syn_find LDAP_P(( diff --git a/servers/slapd/sasl.c b/servers/slapd/sasl.c index 388f90231d..b10b0ffa92 100644 --- a/servers/slapd/sasl.c +++ b/servers/slapd/sasl.c @@ -569,7 +569,7 @@ slap_auxprop_store( if ( rc == LDAP_SUCCESS ) { rc = slap_mods_opattrs( &op, modlist, modtail, &text, textbuf, - textlen ); + textlen, 1 ); } if ( rc == LDAP_SUCCESS ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 8ecdc581c7..8cc4dc9fee 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -1390,7 +1390,6 @@ typedef struct syncinfo_s { char *si_authcId; char *si_authzId; int si_schemachecking; - Filter *si_filter; struct berval si_filterstr; struct berval si_base; int si_scope; diff --git a/servers/slapd/slapi/slapi_ops.c b/servers/slapd/slapi/slapi_ops.c index f3e6ecb4be..ec352c190d 100644 --- a/servers/slapd/slapi/slapi_ops.c +++ b/servers/slapd/slapi/slapi_ops.c @@ -463,7 +463,7 @@ slapi_int_ldapmod_to_entry( if ( !repl_user ) { rc = slap_mods_opattrs( op, modlist, modtail, &text, - textbuf, textlen ); + textbuf, textlen, 1 ); if ( rc != LDAP_SUCCESS) { goto cleanup; } @@ -1029,7 +1029,7 @@ slapi_modify_internal( if ( !repl_user ) { rs.sr_err = slap_mods_opattrs( op, modlist, modtail, &text, textbuf, - textlen ); + textlen, 1 ); if ( rs.sr_err != LDAP_SUCCESS ) { goto cleanup; } diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index cc6496293a..dd85656216 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -448,6 +448,8 @@ done: } } + slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx ); + return rc; } @@ -703,11 +705,12 @@ do_syncrep2( for ( i = 0; syncUUIDs[i].bv_val; i++ ) { struct berval *syncuuid_bv; syncuuid_bv = ber_dupbv( NULL, &syncUUIDs[i] ); + slap_sl_free( syncUUIDs[i].bv_val,op->o_tmpmemctx ); avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv, syncuuid_cmp, avl_dup_error ); } - ber_memfree_x( syncUUIDs, op->o_tmpmemctx ); + slap_sl_free( syncUUIDs, op->o_tmpmemctx ); break; default: #ifdef NEW_LOGGING @@ -805,9 +808,6 @@ done: slap_sync_cookie_free( &syncCookie, 0 ); slap_sync_cookie_free( &syncCookie_req, 0 ); - avl_free( si->si_presentlist, avl_ber_bvfree ); - si->si_presentlist = NULL; - if ( res ) ldap_msgfree( res ); if ( rc && si->si_ld ) { @@ -832,6 +832,7 @@ do_syncrepl( int dostop = 0; ber_socket_t s; int i, defer = 1; + Backend *be; #ifdef NEW_LOGGING LDAP_LOG ( OPERATION, DETAIL1, "do_syncrepl\n", 0, 0, 0 ); @@ -867,7 +868,7 @@ do_syncrepl( op.o_dn = si->si_updatedn; op.o_ndn = si->si_updatedn; op.o_managedsait = 1; - op.o_bd = si->si_be; + op.o_bd = be = si->si_be; op.o_sync_state.ctxcsn = NULL; op.o_sync_state.sid = -1; @@ -894,8 +895,7 @@ do_syncrepl( */ if ( rc == LDAP_SUCCESS ) { if ( first ) { - rc = connection_client_setup( s, do_syncrepl, - arg ); + rc = connection_client_setup( s, do_syncrepl, arg ); } else { connection_client_enable( s ); } @@ -943,6 +943,8 @@ do_syncrepl( if ( !si->si_retrynum || si->si_retrynum[i] == -2 ) { ldap_pvt_runqueue_remove( &syncrepl_rq, rtask ); + LDAP_STAILQ_REMOVE( &be->be_syncinfo, si, syncinfo_s, si_next ); + syncinfo_free( si ); } else if ( si->si_retrynum[i] >= -1 ) { if ( si->si_retrynum[i] > 0 ) si->si_retrynum[i]--; @@ -1383,10 +1385,11 @@ syncrepl_entry( done : if ( syncUUID_strrep.bv_val ) { - ber_memfree_x( syncUUID_strrep.bv_val, op->o_tmpmemctx ); + slap_sl_free( syncUUID_strrep.bv_val, op->o_tmpmemctx ); } if ( si->si_syncUUID_ndn.bv_val ) { - ber_memfree_x( si->si_syncUUID_ndn.bv_val, op->o_tmpmemctx ); + ch_free( si->si_syncUUID_ndn.bv_val ); + si->si_syncUUID_ndn.bv_val = NULL; } return ret; } @@ -1771,7 +1774,7 @@ syncrepl_updateCookie( op->o_tag = LDAP_REQ_ADD; rc = slap_mods_opattrs( op, modlist, modtail, - &text,txtbuf, textlen ); + &text, txtbuf, textlen, 0 ); for ( ml = modlist; ml != NULL; ml = ml->sml_next ) { ml->sml_op = LDAP_MOD_REPLACE; @@ -1947,7 +1950,7 @@ dn_callback( "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); #endif } else { - ber_dupbv_x( &si->si_syncUUID_ndn, &rs->sr_entry->e_nname, op->o_tmpmemctx ); + ber_dupbv_x( &si->si_syncUUID_ndn, &rs->sr_entry->e_nname, NULL ); } } else if ( rs->sr_type == REP_RESULT ) { if ( rs->sr_err == LDAP_SIZELIMIT_EXCEEDED ) { @@ -2142,3 +2145,98 @@ avl_ber_bvfree( void *bv ) } ch_free ( (char *) bv ); } + +void +syncinfo_free( syncinfo_t *sie ) +{ + if ( sie->si_provideruri ) { + ch_free( sie->si_provideruri ); + } + if ( sie->si_provideruri_bv ) { + ber_bvarray_free( sie->si_provideruri_bv ); + } + if ( sie->si_updatedn.bv_val ) { + ch_free( sie->si_updatedn.bv_val ); + } + if ( sie->si_binddn ) { + ch_free( sie->si_binddn ); + } + if ( sie->si_passwd ) { + ch_free( sie->si_passwd ); + } + if ( sie->si_saslmech ) { + ch_free( sie->si_saslmech ); + } + if ( sie->si_secprops ) { + ch_free( sie->si_secprops ); + } + if ( sie->si_realm ) { + ch_free( sie->si_realm ); + } + if ( sie->si_authcId ) { + ch_free( sie->si_authcId ); + } + if ( sie->si_authzId ) { + ch_free( sie->si_authzId ); + } + if ( sie->si_filterstr.bv_val ) { + ch_free( sie->si_filterstr.bv_val ); + } + if ( sie->si_base.bv_val ) { + ch_free( sie->si_base.bv_val ); + } + if ( sie->si_attrs ) { + int i = 0; + while ( sie->si_attrs[i] != NULL ) { + ch_free( sie->si_attrs[i] ); + i++; + } + ch_free( sie->si_attrs ); + } + if ( sie->si_exattrs ) { + int i = 0; + while ( sie->si_exattrs[i] != NULL ) { + ch_free( sie->si_exattrs[i] ); + i++; + } + ch_free( sie->si_exattrs ); + } + if ( sie->si_retryinterval ) { + ch_free( sie->si_retryinterval ); + } + if ( sie->si_retrynum ) { + ch_free( sie->si_retrynum ); + } + if ( sie->si_retrynum_init ) { + ch_free( sie->si_retrynum_init ); + } + slap_sync_cookie_free( &sie->si_syncCookie, 0 ); + if ( sie->si_syncUUID_ndn.bv_val ) { + ch_free( sie->si_syncUUID_ndn.bv_val ); + } + if ( sie->si_presentlist ) { + avl_free( sie->si_presentlist, avl_ber_bvfree ); + } + if ( sie->si_ld ) { + ldap_ld_free( sie->si_ld, 1, NULL, NULL ); + } + while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist )) { + struct nonpresent_entry* npe; + npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist ); + LDAP_LIST_REMOVE( npe, npe_link ); + if ( npe->npe_name ) { + if ( npe->npe_name->bv_val ) { + ch_free( npe->npe_name->bv_val ); + } + ch_free( npe->npe_name ); + } + if ( npe->npe_nname ) { + if ( npe->npe_nname->bv_val ) { + ch_free( npe->npe_nname->bv_val ); + } + ch_free( npe->npe_nname ); + } + ch_free( npe ); + } + ch_free( sie ); +} -- 2.39.5