From: Jeffrey Altman Date: Thu, 3 Jun 2010 15:54:04 +0000 (-0400) Subject: Windows: Fix usage of cm_FreeServerList X-Git-Tag: openafs-devel-1_5_75~193 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=a546f1cd58abcdc129035cf4614c4b55f1e1b1f8 Windows: Fix usage of cm_FreeServerList 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 Reviewed-by: Derrick Brashear Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index a54c0cb..317cd73 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -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); diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 6534904..33ac4c8 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -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; } diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 2b3bde0..f7ffda8 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -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;