[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
(ITS#5855) slapd crash at hang or shutdown
Full_Name: Carl Traub
Version: all ?
OS: Windows
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (141.202.248.52)
On Windows,I have found that by simply starting slapd, waiting a few minutes for
it to get fully loaded, and then hitting Ctrl-C, slapd will often hang and not
terminate properly. It occasionally crashed, and that may been related.
The problem is that in slapd_daemon_destroy(), tcp_close() was being called for
both wake_sds[1] and wake_sds[0], and the 2 values were always the same. This
meant that Windows was being asked to close a connection that had already been
closed and was no longer valid.
A coworker stated that on Windows, these 2 values are always the same, but he
thought that on Unix they would always be different.
I uploaded the diff file "carlTraub-121208.diff". I wasn't clear on using the
diff tool.
Below is the diff.
--- P:\temp\daemon.c_bef Fri Dec 12 10:05:38 2008
+++ P:\temp\daemon.c_after Fri Dec 12 10:24:30 2008
@@ -1645,14 +1645,10 @@
slapd_daemon_destroy( void )
{
connections_destroy();
+ // If the 2 connections are actually the same, closing it twice can cause
bad things, like hangs or crashes.
+ // It may be that they are always the same on Windows, always different on
Unix.
+ if (wake_sds[1] != wake_sds[0] ) {
#ifdef HAVE_WINSOCK
+ if ( wake_sds[1] != INVALID_SOCKET )
- if ( wake_sds[1] != INVALID_SOCKET )
#endif /* HAVE_WINSOCK */
+ tcp_close( SLAP_FD2SOCK(wake_sds[1]) );
+ }
- tcp_close( SLAP_FD2SOCK(wake_sds[1]) );
#ifdef HAVE_WINSOCK
if ( wake_sds[0] != INVALID_SOCKET )
#endif /* HAVE_WINSOCK */