From 75eecdc539250e29b43d5b85675b4a6e15f679fb Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Wed, 23 Apr 2008 10:31:22 +0000 Subject: [PATCH] ITS#5346 overlay_db_open needs to preserve the original *be. --- servers/slapd/backover.c | 73 ++++++++++++++++++---------------------- servers/slapd/slap.h | 2 +- 2 files changed, 34 insertions(+), 41 deletions(-) diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 8d3ed4022e..46d879b63b 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -29,43 +29,6 @@ static slap_overinst *overlays; -enum db_which { - db_open = 0, - db_close, - db_destroy, - db_last -}; - -static int -over_db_func( - BackendDB *be, - ConfigReply *cr, - enum db_which which -) -{ - slap_overinfo *oi = be->bd_info->bi_private; - slap_overinst *on = oi->oi_list; - BackendInfo *bi_orig = be->bd_info; - BI_db_open **func; - int rc = 0; - - func = &oi->oi_orig->bi_db_open; - if ( func[which] ) { - be->bd_info = oi->oi_orig; - rc = func[which]( be, cr ); - } - - for (; on && rc == 0; on=on->on_next) { - be->bd_info = &on->on_bi; - func = &on->on_bi.bi_db_open; - if (func[which]) { - rc = func[which]( be, cr ); - } - } - be->bd_info = bi_orig; - return rc; -} - static int over_db_config( BackendDB *be, @@ -173,7 +136,25 @@ over_db_open( ConfigReply *cr ) { - return over_db_func( be, cr, db_open ); + slap_overinfo *oi = be->bd_info->bi_private; + slap_overinst *on = oi->oi_list; + BackendDB db = *be; + int rc = 0; + + db.be_flags |= SLAP_DBFLAG_OVERLAY; + db.bd_info = oi->oi_orig; + if ( db.bd_info->bi_db_open ) { + rc = db.bd_info->bi_db_open( &db, cr ); + } + + for (; on && rc == 0; on=on->on_next) { + db.bd_info = &on->on_bi; + if ( db.bd_info->bi_db_open ) { + rc = db.bd_info->bi_db_open( &db, cr ); + } + } + + return rc; } static int @@ -211,17 +192,29 @@ over_db_destroy( { slap_overinfo *oi = be->bd_info->bi_private; slap_overinst *on = oi->oi_list, *next; + BackendInfo *bi_orig = be->bd_info; int rc; - rc = over_db_func( be, cr, db_destroy ); + be->bd_info = oi->oi_orig; + if ( be->bd_info->bi_db_destroy ) { + rc = be->bd_info->bi_db_destroy( be, cr ); + } + for (; on && rc == 0; on=on->on_next) { + be->bd_info = &on->on_bi; + if ( be->bd_info->bi_db_destroy ) { + rc = be->bd_info->bi_db_destroy( be, cr ); + } + } + + on = oi->oi_list; if ( on ) { for (next = on->on_next; on; on=next) { next = on->on_next; free( on ); } } - + be->bd_info = bi_orig; free( oi ); return rc; } diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index ada56ab419..da02058f8c 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -1707,7 +1707,7 @@ struct ConfigOCs; /* config.h */ struct BackendDB { BackendInfo *bd_info; /* pointer to shared backend info */ - struct BackendDB *bd_self; /* pointer to this struct */ + BackendDB *bd_self; /* pointer to this struct */ /* fields in this structure (and routines acting on this structure) should be renamed from be_ to bd_ */ -- 2.39.5