[389-commits] ldap/servers
Noriko Hosoi
nhosoi at fedoraproject.org
Mon Mar 22 15:49:12 UTC 2010
ldap/servers/plugins/replication/repl5_inc_protocol.c | 14 ++++++
ldap/servers/plugins/replication/repl5_protocol.c | 38 +++++++++++-------
ldap/servers/plugins/replication/repl5_tot_protocol.c | 18 ++++++++
3 files changed, 56 insertions(+), 14 deletions(-)
New commits:
commit 04a0bd9ada0b3dd8efae67b63421dfa31e15b051
Author: Noriko Hosoi <nhosoi at jiji.sjc.redhat.com>
Date: Sun Mar 21 17:13:18 2010 -0700
548533 - memory leak in Repl_5_Inc_Protocol_new
https://bugzilla.redhat.com/show_bug.cgi?id=548533
Description: repl5_inc_delete and repl5_tot_delete to release the
incremental and total update protocol were not implemented. This
fix implemented them. Also, it fixed a leak of connection in
private_protocol_factory.
diff --git a/ldap/servers/plugins/replication/repl5_inc_protocol.c b/ldap/servers/plugins/replication/repl5_inc_protocol.c
index 4e733de..d999d3b 100644
--- a/ldap/servers/plugins/replication/repl5_inc_protocol.c
+++ b/ldap/servers/plugins/replication/repl5_inc_protocol.c
@@ -511,7 +511,21 @@ static void
repl5_inc_delete(Private_Repl_Protocol **prpp)
{
/* First, stop the protocol if it isn't already stopped */
+ if (!(*prpp)->stopped) {
+ (*prpp)->stopped = 1;
+ (*prpp)->stop(*prpp);
+ }
/* Then, delete all resources used by the protocol */
+ if ((*prpp)->lock) {
+ PR_DestroyLock((*prpp)->lock);
+ (*prpp)->lock = NULL;
+ }
+ if ((*prpp)->cvar) {
+ PR_DestroyCondVar((*prpp)->cvar);
+ (*prpp)->cvar = NULL;
+ }
+ slapi_ch_free((void **)&(*prpp)->private);
+ slapi_ch_free((void **)prpp);
}
/* helper function */
diff --git a/ldap/servers/plugins/replication/repl5_protocol.c b/ldap/servers/plugins/replication/repl5_protocol.c
index efb3271..31f6072 100644
--- a/ldap/servers/plugins/replication/repl5_protocol.c
+++ b/ldap/servers/plugins/replication/repl5_protocol.c
@@ -109,11 +109,7 @@ prot_new(Repl_Agmt *agmt, int protocol_state)
goto loser;
}
rp->agmt = agmt;
- /* now done in private_protocol_factory
- if ((rp->conn = conn_new(agmt)) == NULL)
- {
- goto loser;
- } */
+ rp->conn = NULL;
/* Acquire the local replica object */
replarea_sdn = agmt_get_replarea(agmt);
rp->replica_object = replica_get_replica_from_dn(replarea_sdn);
@@ -585,20 +581,36 @@ private_protocol_factory(Repl_Protocol *rp, int type)
switch (type)
{
case PROTOCOL_5_INCREMENTAL:
- if ((rp->conn = conn_new(rp->agmt)) != NULL)
- prp = Repl_5_Inc_Protocol_new(rp);
+ if (NULL == rp->conn) {
+ rp->conn = conn_new(rp->agmt);
+ }
+ if (NULL != rp->conn) {
+ prp = Repl_5_Inc_Protocol_new(rp);
+ }
break;
case PROTOCOL_5_TOTAL:
- if ((rp->conn = conn_new(rp->agmt)) != NULL)
- prp = Repl_5_Tot_Protocol_new(rp);
+ if (NULL == rp->conn) {
+ rp->conn = conn_new(rp->agmt);
+ }
+ if (NULL != rp->conn) {
+ prp = Repl_5_Tot_Protocol_new(rp);
+ }
break;
case PROTOCOL_WINDOWS_INCREMENTAL:
- if ((rp->conn = windows_conn_new(rp->agmt)) != NULL)
- prp = Windows_Inc_Protocol_new(rp);
+ if (NULL == rp->conn) {
+ rp->conn = windows_conn_new(rp->agmt);
+ }
+ if (NULL != rp->conn) {
+ prp = Windows_Inc_Protocol_new(rp);
+ }
break;
case PROTOCOL_WINDOWS_TOTAL:
- if ((rp->conn = windows_conn_new(rp->agmt)) != NULL)
- prp = Windows_Tot_Protocol_new(rp);
+ if (NULL == rp->conn) {
+ rp->conn = windows_conn_new(rp->agmt);
+ }
+ if (NULL != rp->conn) {
+ prp = Windows_Tot_Protocol_new(rp);
+ }
break;
}
return prp;
diff --git a/ldap/servers/plugins/replication/repl5_tot_protocol.c b/ldap/servers/plugins/replication/repl5_tot_protocol.c
index 11c8255..7bd6e25 100644
--- a/ldap/servers/plugins/replication/repl5_tot_protocol.c
+++ b/ldap/servers/plugins/replication/repl5_tot_protocol.c
@@ -584,8 +584,24 @@ loser:
}
static void
-repl5_tot_delete(Private_Repl_Protocol **prp)
+repl5_tot_delete(Private_Repl_Protocol **prpp)
{
+ /* First, stop the protocol if it isn't already stopped */
+ if (!(*prpp)->stopped) {
+ (*prpp)->stopped = 1;
+ (*prpp)->stop(*prpp);
+ }
+ /* Then, delete all resources used by the protocol */
+ if ((*prpp)->lock) {
+ PR_DestroyLock((*prpp)->lock);
+ (*prpp)->lock = NULL;
+ }
+ if ((*prpp)->cvar) {
+ PR_DestroyCondVar((*prpp)->cvar);
+ (*prpp)->cvar = NULL;
+ }
+ slapi_ch_free((void **)&(*prpp)->private);
+ slapi_ch_free((void **)prpp);
}
static
More information about the 389-commits
mailing list