From 114ccbda61a83395b98be82a98f7a37e2ee2c317 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 1 Nov 2013 11:07:51 -0700 Subject: [PATCH] ITS#7735 plug memleak Introduced in commit 48cdd54d9accb9283807ed592369b72654fb302d --- servers/slapd/ldapsync.c | 17 +++++++++++++++++ servers/slapd/proto-slap.h | 2 ++ servers/slapd/syncrepl.c | 3 ++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/servers/slapd/ldapsync.c b/servers/slapd/ldapsync.c index 2c03ec7cb4..753b5dc850 100644 --- a/servers/slapd/ldapsync.c +++ b/servers/slapd/ldapsync.c @@ -370,6 +370,23 @@ slap_parse_sync_cookie( return 0; } +/* count the numcsns and regenerate the list of SIDs in a recomposed cookie */ +void +slap_reparse_sync_cookie( + struct sync_cookie *cookie, + void *memctx ) +{ + if ( cookie->ctxcsn ) { + for (; !BER_BVISNULL( &cookie->ctxcsn[cookie->numcsns] ); cookie->numcsns++); + } + if ( cookie->numcsns ) { + cookie->sids = slap_parse_csn_sids( cookie->ctxcsn, cookie->numcsns, + memctx ); + if ( cookie->numcsns > 1 ) + slap_sort_csn_sids( cookie->ctxcsn, cookie->sids, cookie->numcsns, memctx ); + } +} + int slap_init_sync_cookie_ctxcsn( struct sync_cookie *cookie diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index f7a00735d2..87ce88d6e4 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1185,6 +1185,8 @@ LDAP_SLAPD_F (void) slap_insert_csn_sids LDAP_P(( struct sync_cookie *ck, int, int, struct berval * )); LDAP_SLAPD_F (int) slap_parse_sync_cookie LDAP_P(( struct sync_cookie *, void *memctx )); +LDAP_SLAPD_F (int) slap_reparse_sync_cookie LDAP_P(( + struct sync_cookie *, void *memctx )); LDAP_SLAPD_F (int) slap_init_sync_cookie_ctxcsn LDAP_P(( struct sync_cookie * )); LDAP_SLAPD_F (struct sync_cookie *) slap_dup_sync_cookie LDAP_P(( diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 5fe320d99e..1e6e00c049 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -590,7 +590,8 @@ check_syncprov( slap_compose_sync_cookie( NULL, &si->si_syncCookie.octet_str, si->si_syncCookie.ctxcsn, si->si_syncCookie.rid, si->si_syncCookie.sid ); - slap_parse_sync_cookie( &si->si_syncCookie, NULL ); + ch_free( si->si_syncCookie.sids ); + slap_reparse_sync_cookie( &si->si_syncCookie, op->o_tmpmemctx ); } ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex ); return changed; -- 2.39.5