From 3e4af71581fa8d174a0127bb225e7fba2450aaae Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 22 Jan 2014 22:17:56 -0500 Subject: [PATCH] Windows: cm_GetCell_gen Fixup cm_server cellp on race If a race occurs during the instantiation of a new cm_cell_t object, the created servers will point at the wrong cm_cell_t object after the race is detected. Before cm_GetCell_gen completes the cm_server_t objects must be fixed to point to the correct cm_cell_t. Change-Id: I8341c2cfd2a8ac7be31699d11f78b4b9ced257af Reviewed-on: http://gerrit.openafs.org/10777 Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- src/WINNT/afsd/cm_cell.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 990584b77..b552a3b88 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -342,6 +342,8 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags) } if (cp2) { + cm_server_t *tsp; + if (!hasMutex) { lock_ObtainMutex(&cp->mx); hasMutex = 1; @@ -352,7 +354,24 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, afs_uint32 flags) cm_RemoveCellFromNameHashTable(cp); lock_ReleaseMutex(&cp->mx); hasMutex = 0; - cm_FreeCell(cp); + + /* Replace cells references in servers */ + lock_ObtainRead(&cm_serverLock); + for (tsp = cm_serversAllFirstp; + tsp; + tsp = (cm_server_t *)osi_QNext(&tsp->allq)) { + if (tsp->cellp == cp) { + osi_Log4(afsd_logp, "cm_GetCell_gen race: replacing cell (%u) %s with cell (%u) %s", + cp->cellID, + osi_LogSaveString(afsd_logp,cp->name), + cp2->cellID, + osi_LogSaveString(afsd_logp,cp2->name)); + tsp->cellp = cp2; + } + } + lock_ReleaseRead(&cm_serverLock); + + cm_FreeCell(cp); cp = cp2; goto done; } -- 2.39.5