Windows: Fix usage of cm_FreeServerList
[openafs.git] / src / WINNT / afsd / cm_cell.c
index c166bba..317cd73 100644 (file)
@@ -18,6 +18,8 @@
 #include <malloc.h>
 #include <osi.h>
 #include <string.h>
+#define STRSAFE_NO_DEPRECATE
+#include <strsafe.h>
 
 #include "afsd.h"
 
@@ -76,29 +78,28 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
 {
     long code = 0;
     cm_cell_rock_t rock;
+    afs_uint32 mxheld = 0;
 
     if (cp == NULL)
         return NULL;
 
     lock_ObtainMutex(&cp->mx);
+    mxheld = 1;
     if ((cp->vlServersp == NULL 
 #ifdef AFS_FREELANCE_CLIENT
           && !(cp->flags & CM_CELLFLAG_FREELANCE)
 #endif
           ) || (time(0) > cp->timeout)
-#ifdef AFS_AFSDB_ENV
         || (cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) &&
          ((cp->flags & CM_CELLFLAG_VLSERVER_INVALID)))
-#endif
             ) 
     {
         lock_ReleaseMutex(&cp->mx);
+        mxheld = 0;
 
         /* must empty cp->vlServersp */
-        if (cp->vlServersp) {
+        if (cp->vlServersp)
             cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
-            cp->vlServersp = NULL;
-        }
 
         rock.cellp = cp;
         rock.flags = flags;
@@ -107,10 +108,9 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
             code = cm_SearchCellFileEx(cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
         if (code == 0) {
             lock_ObtainMutex(&cp->mx);
+            mxheld = 1;
            cp->timeout = time(0) + 7200;
-            lock_ReleaseMutex(&cp->mx);
         }
-#ifdef AFS_AFSDB_ENV
         else {
             if (cm_dnsEnabled) {
                 int ttl;
@@ -118,10 +118,10 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
                 code = cm_SearchCellByDNS(cp->name, NULL, &ttl, cm_AddCellProc, &rock);
                 if (code == 0) {   /* got cell from DNS */
                     lock_ObtainMutex(&cp->mx);
+                    mxheld = 1;
                     cp->flags |= CM_CELLFLAG_DNS;
                     cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID;
                    cp->timeout = time(0) + ttl;
-                    lock_ReleaseMutex(&cp->mx);
 #ifdef DEBUG
                     fprintf(stderr, "cell %s: ttl=%d\n", cp->name, ttl);
 #endif
@@ -130,19 +130,19 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
                      * current entry alone 
                     */
                     lock_ObtainMutex(&cp->mx);
+                    mxheld = 1;
                     cp->flags |= CM_CELLFLAG_VLSERVER_INVALID;
-                    lock_ReleaseMutex(&cp->mx);
                 }
            }
        }
-#endif /* AFS_AFSDB_ENV */
-    } else {
-        lock_ReleaseMutex(&cp->mx);
     }
 
     if (code == 0)
         cm_RandomizeServer(&cp->vlServersp);
 
+    if (mxheld)
+        lock_ReleaseMutex(&cp->mx);
+
     return code ? NULL : cp;
 }
 
@@ -292,7 +292,6 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
                       osi_LogSaveString(afsd_logp,namep), code, osi_LogSaveString(afsd_logp,fullname),
                       osi_LogSaveString(afsd_logp,linkedName));
 
-#ifdef AFS_AFSDB_ENV
             if (cm_dnsEnabled) {
                 int ttl;
 
@@ -318,7 +317,6 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags)
                 }
             } 
             else 
-#endif
             {
                 lock_ObtainMutex(&cp->mx);
                 lock_ObtainWrite(&cm_cellLock);