From: Quanah Gibson-Mount Date: Mon, 10 Nov 2008 23:20:05 +0000 (+0000) Subject: ITS#5745 X-Git-Tag: OPENLDAP_REL_ENG_2_4_13~57 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=582fc0408bc691d72bca8609b163ad7ec7b54db8;p=openldap ITS#5745 --- diff --git a/CHANGES b/CHANGES index 73b2eedf16..83ddf32133 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,7 @@ OpenLDAP 2.4.13 Engineering Fixed slapd contextCSN pending list (ITS#5709) Fixed slapd control criticality (ITS#5785) Added slapd dn.this search limits (ITS#5734) + Fixed slapd error status on shutdown (ITS#5745) Fixed slapd nameUIDPretty bitstring parsing (ITS#5750) Fixed slapd overlay/database open with real structure (ITS#5724) Fixed slapd parsing of read entry control (ITS#5741) diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index 5de029303b..a0bfcc16fa 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -584,6 +584,17 @@ bdb_db_close( BackendDB *be, ConfigReply *cr ) ber_bvarray_free( bdb->bi_db_config ); bdb->bi_db_config = NULL; + if( bdb->bi_dbenv ) { + /* Free cache locker if we enabled locking. + * TXNs must all be closed before DBs... + */ + if ( !( slapMode & SLAP_TOOL_QUICK ) && bdb->bi_cache.c_txn ) { + TXN_ABORT( bdb->bi_cache.c_txn ); + bdb->bi_cache.c_txn = NULL; + } + bdb_reader_flush( bdb->bi_dbenv ); + } + while( bdb->bi_databases && bdb->bi_ndatabases-- ) { db = bdb->bi_databases[bdb->bi_ndatabases]; rc = db->bdi_db->close( db->bdi_db, 0 ); @@ -614,13 +625,6 @@ bdb_db_close( BackendDB *be, ConfigReply *cr ) /* close db environment */ if( bdb->bi_dbenv ) { - /* Free cache locker if we enabled locking */ - if ( !( slapMode & SLAP_TOOL_QUICK ) && bdb->bi_cache.c_txn ) { - TXN_ABORT( bdb->bi_cache.c_txn ); - bdb->bi_cache.c_txn = NULL; - } - bdb_reader_flush( bdb->bi_dbenv ); - /* force a checkpoint, but not if we were ReadOnly, * and not in Quick mode since there are no transactions there. */ diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 459490b4ee..3754a258f2 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -349,11 +349,13 @@ int backend_shutdown( Backend *be ) } if ( be->bd_info->bi_db_close ) { - be->bd_info->bi_db_close( be, NULL ); + rc = be->bd_info->bi_db_close( be, NULL ); + if ( rc ) return rc; } if( be->bd_info->bi_close ) { - be->bd_info->bi_close( be->bd_info ); + rc = be->bd_info->bi_close( be->bd_info ); + if ( rc ) return rc; } return 0; diff --git a/servers/slapd/slapacl.c b/servers/slapd/slapacl.c index 67cf7b3b56..c0a06e279c 100644 --- a/servers/slapd/slapacl.c +++ b/servers/slapd/slapacl.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * Copyright 2004-2008 The OpenLDAP Foundation. @@ -399,7 +400,8 @@ destroy:; } } - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; } diff --git a/servers/slapd/slapadd.c b/servers/slapd/slapadd.c index 468dcea671..442446c1d2 100644 --- a/servers/slapd/slapadd.c +++ b/servers/slapd/slapadd.c @@ -447,7 +447,8 @@ slapadd( int argc, char **argv ) } } - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; } diff --git a/servers/slapd/slapauth.c b/servers/slapd/slapauth.c index 8934df3b29..0b27326384 100644 --- a/servers/slapd/slapauth.c +++ b/servers/slapd/slapauth.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * Copyright 2004-2008 The OpenLDAP Foundation. @@ -166,7 +167,8 @@ destroy:; if ( !BER_BVISNULL( &authzID ) ) { op->o_tmpfree( authzID.bv_val, op->o_tmpmemctx ); } - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; } diff --git a/servers/slapd/slapcat.c b/servers/slapd/slapcat.c index 6ea1952006..80586ef651 100644 --- a/servers/slapd/slapcat.c +++ b/servers/slapd/slapcat.c @@ -134,6 +134,7 @@ slapcat( int argc, char **argv ) be->be_entry_close( be ); - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; } diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c index 6050629cd3..fad2bb9a96 100644 --- a/servers/slapd/slapcommon.c +++ b/servers/slapd/slapcommon.c @@ -740,13 +740,16 @@ startup:; } } -void slap_tool_destroy( void ) +int slap_tool_destroy( void ) { + int rc = 0; if ( !dryrun ) { if ( need_shutdown ) { - slap_shutdown( be ); + if ( slap_shutdown( be )) + rc = EXIT_FAILURE; } - slap_destroy(); + if ( slap_destroy()) + rc = EXIT_FAILURE; } #ifdef SLAPD_MODULES if ( slapMode == SLAP_SERVER_MODE ) { @@ -772,4 +775,5 @@ void slap_tool_destroy( void ) if ( ldiffp && ldiffp != &dummy ) { ldif_close( ldiffp ); } + return rc; } diff --git a/servers/slapd/slapcommon.h b/servers/slapd/slapcommon.h index 9cc22fed48..32138d1c22 100644 --- a/servers/slapd/slapcommon.h +++ b/servers/slapd/slapcommon.h @@ -101,6 +101,6 @@ void slap_tool_init LDAP_P(( int tool, int argc, char **argv )); -void slap_tool_destroy LDAP_P((void)); +int slap_tool_destroy LDAP_P((void)); #endif /* SLAPCOMMON_H_ */ diff --git a/servers/slapd/slapdn.c b/servers/slapd/slapdn.c index 2aa12232b2..95af1a37d8 100644 --- a/servers/slapd/slapdn.c +++ b/servers/slapd/slapdn.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * Copyright 2004-2008 The OpenLDAP Foundation. @@ -99,7 +100,8 @@ slapdn( int argc, char **argv ) } } - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; } diff --git a/servers/slapd/slapindex.c b/servers/slapd/slapindex.c index 6b1f9bb92a..81ddf6ee93 100644 --- a/servers/slapd/slapindex.c +++ b/servers/slapd/slapindex.c @@ -99,6 +99,7 @@ slapindex( int argc, char **argv ) (void) be->be_entry_close( be ); - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return( rc ); } diff --git a/servers/slapd/slaptest.c b/servers/slapd/slaptest.c index c47abf85d7..bf48c7e641 100644 --- a/servers/slapd/slaptest.c +++ b/servers/slapd/slaptest.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * * Copyright 2004-2008 The OpenLDAP Foundation. @@ -108,7 +109,8 @@ slaptest( int argc, char **argv ) fprintf( stderr, "config file testing succeeded\n"); } - slap_tool_destroy(); + if ( slap_tool_destroy()) + rc = EXIT_FAILURE; return rc; }