Windows: Fix usage of cm_FreeServerList
authorJeffrey Altman <jaltman@your-file-system.com>
Thu, 3 Jun 2010 15:54:04 +0000 (11:54 -0400)
committerJeffrey Altman <jaltman@openafs.org>
Thu, 3 Jun 2010 22:59:01 +0000 (15:59 -0700)
cm_FreeServerList will set the input variable to NULL if the
contents of the list could in fact be freed.  If they could not
be freed, the individual entries are marked for deletion and will
not be subsequently used.  Do not set the list variable to NULL
after calling cm_FreeServerList otherwise memory can be leaked.

LICENSE MIT

Change-Id: Ia3cacd760d7395a2dd6b063643a8aa86f9e468b9
Reviewed-on: http://gerrit.openafs.org/2078
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>

src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_ioctl.c

index a54c0cb..317cd73 100644 (file)
@@ -94,15 +94,13 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
          ((cp->flags & CM_CELLFLAG_VLSERVER_INVALID)))
             ) 
     {
-        /* must empty cp->vlServersp */
-        if (cp->vlServersp) {
-            cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
-            cp->vlServersp = NULL;
-        }
-
         lock_ReleaseMutex(&cp->mx);
         mxheld = 0;
 
+        /* must empty cp->vlServersp */
+        if (cp->vlServersp)
+            cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
+
         rock.cellp = cp;
         rock.flags = flags;
         code = cm_SearchCellRegistry(1, cp->name, NULL, cp->linkedName, cm_AddCellProc, &rock);
index 6534904..33ac4c8 100644 (file)
@@ -406,7 +406,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                         lock_ReleaseWrite(&cm_serverLock);
                         if (free_svr_list) {
                             cm_FreeServerList(serverspp, 0);
-                            serverspp = NULL;
                             serversp = NULL;
                             free_svr_list = 0;
                         }
@@ -508,7 +507,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
 
         if (free_svr_list) {
             cm_FreeServerList(serverspp, 0);
-            serverspp = NULL;
             serversp = NULL;
             free_svr_list = 0;
         }
@@ -608,7 +606,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
         /* Free the server list before cm_ForceUpdateVolume is called */
         if (free_svr_list) {
             cm_FreeServerList(serverspp, 0);
-            serverspp = NULL;
             serversp = NULL;
             free_svr_list = 0;
         }
index 2b3bde0..f7ffda8 100644 (file)
@@ -1486,7 +1486,6 @@ cm_IoctlNewCell(struct cm_ioctl *ioctlp, struct cm_user *userp)
 
         /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/
         cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE);
-        cp->vlServersp = NULL;
         lock_ReleaseWrite(&cm_cellLock);
 
         rock.cellp = cp;