]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-daemon-shutdown-20071129
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 29 Nov 2007 16:02:14 +0000 (16:02 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 29 Nov 2007 16:02:14 +0000 (16:02 +0000)
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

index 2eb07abe0192b24e7775aa9401b672aaabedfeb4..45cff1c59a4a2d80c1e840aeca7950469e861c9a 100644 (file)
@@ -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 */
     }
 }