diff options
author | Noriko Hosoi <nhosoi@redhat.com> | 2010-09-12 19:23:14 -0700 |
---|---|---|
committer | Noriko Hosoi <nhosoi@redhat.com> | 2010-09-13 10:06:02 -0700 |
commit | 2a25e6518f6e2bd83dd4750bf023d332edef2063 (patch) | |
tree | 3be330e9baf8f3479f2c34a921ee5a2c48e701cf /ldap | |
parent | 5ae8186835c98961ab94799983bc10bc1f9199f6 (diff) | |
download | ds-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.
Diffstat (limited to 'ldap')
-rw-r--r-- | ldap/servers/plugins/replication/repl5_agmtlist.c | 8 |
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; } |