diff --git a/CHANGES b/CHANGES index 73b2eedf16134e4e9f25aaeb1f9748faf7ad8ea2..83ddf32133c6826de56e57089ad92fa989fbe9c8 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 5de029303bc6cb0984a1c4bac16f876535db9271..a0bfcc16fa8d22d81f0865394b64f3467e9284e3 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 459490b4ee8eea9be6561c47dde6b548d4d3629e..3754a258f20af6203dbce3bc5d295c85632fd207 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 67cf7b3b56b62ee8e14659fd7f67c7e06a8ea9cb..c0a06e279c2a980c833ccca40b767952a1171b70 100644 --- a/servers/slapd/slapacl.c +++ b/servers/slapd/slapacl.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * 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 468dcea6716c6f1d14b8660bc6c4e2cbebc88abf..442446c1d26ffa416d71a3f4b22e0467566b50b0 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 8934df3b29faad7016f84f37db954fd4aec7bd8b..0b273263842a5f62f4c2f2174bfc51f022fe6176 100644 --- a/servers/slapd/slapauth.c +++ b/servers/slapd/slapauth.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * 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 6ea1952006502541080756408981bf00ea2f8039..80586ef65111b75b0fc19e7ed306a9ef8a92e8bd 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 6050629cd3b25de64dfb5e36c3a4d9ba47bec27c..fad2bb9a960e7be359a1de93af9108e0c6e93bc5 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 9cc22fed48d0f8867879e1b60b81cf7ab6ef8bbf..32138d1c22d474d1c4170b5eff4c1770e365cfb6 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 2aa12232b23e50ac1c4c57836ac3852ce6771415..95af1a37d8c4d21dbdb4df78d6c7f71bb23354df 100644 --- a/servers/slapd/slapdn.c +++ b/servers/slapd/slapdn.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * 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 6b1f9bb92a879b8b31545ce4d11478717118a393..81ddf6ee93feaaac04e6c6bde7b8da03e4ade845 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 c47abf85d78098755cd962b63162a42678fa6a04..bf48c7e6414ce66b249d08108c35096e8148e33a 100644 --- a/servers/slapd/slaptest.c +++ b/servers/slapd/slaptest.c @@ -1,3 +1,4 @@ +/* $OpenLDAP$ */ /* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * 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; }