From a0b5d98ddf544a39d687e5422032205945c9c784 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 29 Nov 2007 16:02:14 +0000 Subject: [PATCH] DEVEL15-windows-daemon-shutdown-20071129 The cm_Daemon() thread did not check after each operation whether or not the service is in the process of shutting down. As a result the thread could access data, locks, etc. that had been freed by other threads. WER 572098933-1-0407879071 (cherry picked from commit baef5ba97f4d042d75fe1ac8e11325be459a3d9a) --- src/WINNT/afsd/cm_daemon.c | 47 ++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/WINNT/afsd/cm_daemon.c b/src/WINNT/afsd/cm_daemon.c index 2eb07abe0..45cff1c59 100644 --- a/src/WINNT/afsd/cm_daemon.c +++ b/src/WINNT/afsd/cm_daemon.c @@ -367,7 +367,10 @@ void cm_Daemon(long parm) */ smb_RestartListeners(); - if (configureFirewall) { + if (daemon_ShutdownFlag == 1) + return; + + if (configureFirewall) { /* Open Microsoft Firewall to allow in port 7001 */ switch (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) { case 0: @@ -392,55 +395,79 @@ void cm_Daemon(long parm) now = osi_Time(); /* check down servers */ - if (now > lastDownServerCheck + cm_daemonCheckDownInterval) { + if (now > lastDownServerCheck + cm_daemonCheckDownInterval && + daemon_ShutdownFlag == 0) { lastDownServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckDownServers"); cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } /* check up servers */ - if (now > lastUpServerCheck + cm_daemonCheckUpInterval) { + if (now > lastUpServerCheck + cm_daemonCheckUpInterval && + daemon_ShutdownFlag == 0) { lastUpServerCheck = now; osi_Log0(afsd_logp, "cm_Daemon CheckUpServers"); cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastVolCheck + cm_daemonCheckVolInterval) { + if (now > lastVolCheck + cm_daemonCheckVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_RefreshVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } if (cm_daemonCheckVolCBInterval && - now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval) { + now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval && + daemon_ShutdownFlag == 0) { lastVolCBRenewalCheck = now; cm_VolumeRenewROCallbacks(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) { + if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval && + daemon_ShutdownFlag == 0) { lastVolCheck = now; cm_CheckOfflineVolumes(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval) { + if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval && + daemon_ShutdownFlag == 0) { lastCBExpirationCheck = now; cm_CheckCBExpiration(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastLockCheck + cm_daemonCheckLockInterval) { + if (now > lastLockCheck + cm_daemonCheckLockInterval && + daemon_ShutdownFlag == 0) { lastLockCheck = now; cm_CheckLocks(); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } - if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval) { + if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval && + daemon_ShutdownFlag == 0) { lastTokenCacheCheck = now; cm_CheckTokenCache(now); + if (daemon_ShutdownFlag == 1) + return; now = osi_Time(); } @@ -463,9 +490,9 @@ void cm_Daemon(long parm) } } - thrd_Sleep(30 * 1000); /* sleep 30 seconds */ if (daemon_ShutdownFlag == 1) return; + thrd_Sleep(30 * 1000); /* sleep 30 seconds */ } } -- 2.39.5