summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoriko Hosoi <nhosoi@redhat.com>2010-09-12 19:23:14 -0700
committerNoriko Hosoi <nhosoi@redhat.com>2010-09-13 10:06:02 -0700
commit2a25e6518f6e2bd83dd4750bf023d332edef2063 (patch)
tree3be330e9baf8f3479f2c34a921ee5a2c48e701cf
parent5ae8186835c98961ab94799983bc10bc1f9199f6 (diff)
downloadds-2a25e6518f6e2bd83dd4750bf023d332edef2063.tar.gz
ds-2a25e6518f6e2bd83dd4750bf023d332edef2063.tar.xz
ds-2a25e6518f6e2bd83dd4750bf023d332edef2063.zip
agmtlist_shutdown (repl5_agmtlist.c) had an illegal access defect.
Object ro is freed in objset_next_obj and next object is returned if any. After ro is released, it was used to get agreement data. This patch moves the location of objset_next_obj after the agreement data is retrieved.
-rw-r--r--ldap/servers/plugins/replication/repl5_agmtlist.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/ldap/servers/plugins/replication/repl5_agmtlist.c b/ldap/servers/plugins/replication/repl5_agmtlist.c
index f9aa610d..00b44592 100644
--- a/ldap/servers/plugins/replication/repl5_agmtlist.c
+++ b/ldap/servers/plugins/replication/repl5_agmtlist.c
@@ -75,7 +75,7 @@ typedef struct agmt_wrapper {
Repl_Agmt *
agmtlist_get_by_agmt_name(const Slapi_DN *agmt_name)
{
- Repl_Agmt *ra;
+ Repl_Agmt *ra = NULL;
Object *ro;
for (ro = objset_first_obj(agmt_set); NULL != ro;
@@ -634,10 +634,12 @@ agmtlist_shutdown()
ro = objset_first_obj(agmt_set);
while (NULL != ro)
{
- next_ro = objset_next_obj(agmt_set, ro);
ra = (Repl_Agmt *)object_get_data(ro);
agmt_stop(ra);
- agmt_update_consumer_ruv (ra);
+ agmt_update_consumer_ruv (ra);
+ next_ro = objset_next_obj(agmt_set, ro);
+ /* Object ro was released in objset_next_obj,
+ * but the address ro can be still used to remove ro from objset. */
objset_remove_obj(agmt_set, ro);
ro = next_ro;
}