From c4e3b49fd7581d3229974e8c5f7cb13203a99cd9 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 14 Aug 2011 00:14:10 -0400 Subject: [PATCH] Windows: prevent cm_server races Use interlocked operations to modified the flags field. Close a race in cm_NewServer() which can result in multiple cm_server objecs being created for the same addr/port/type tuple. Reviewed-on: http://gerrit.openafs.org/5266 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit c20010850e2b43a0b9a6d74357ea6111dbf3409e) Change-Id: If13f23a921f598db097b391348513a3300d3b10c Reviewed-on: http://gerrit.openafs.org/5267 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsd/afsd_init.c | 12 ++-- src/WINNT/afsd/cm_callback.c | 17 ++---- src/WINNT/afsd/cm_cell.c | 2 +- src/WINNT/afsd/cm_conn.c | 2 +- src/WINNT/afsd/cm_ioctl.c | 6 +- src/WINNT/afsd/cm_server.c | 103 ++++++++++++++++++----------------- src/WINNT/afsd/cm_server.h | 6 +- src/WINNT/afsd/cm_volume.c | 4 +- 8 files changed, 74 insertions(+), 78 deletions(-) diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index b4217765e..d9761f519 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -300,12 +300,12 @@ static void afsd_InitServerPreferences(void) saddr.sin_family = AF_INET; dwRank += (rand() & 0x000f); - tsp = cm_FindServer(&saddr, CM_SERVER_VLDB); + tsp = cm_FindServer(&saddr, CM_SERVER_VLDB, FALSE); if ( tsp ) /* an existing server - ref count increased */ { lock_ObtainMutex(&tsp->mx); tsp->ipRank = (USHORT)dwRank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); @@ -318,7 +318,7 @@ static void afsd_InitServerPreferences(void) tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ lock_ObtainMutex(&tsp->mx); tsp->ipRank = (USHORT)dwRank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); } @@ -376,12 +376,12 @@ static void afsd_InitServerPreferences(void) saddr.sin_family = AF_INET; dwRank += (rand() & 0x000f); - tsp = cm_FindServer(&saddr, CM_SERVER_FILE); + tsp = cm_FindServer(&saddr, CM_SERVER_FILE, FALSE); if ( tsp ) /* an existing server - ref count increased */ { lock_ObtainMutex(&tsp->mx); tsp->ipRank = (USHORT)dwRank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); @@ -397,7 +397,7 @@ static void afsd_InitServerPreferences(void) tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ lock_ObtainMutex(&tsp->mx); tsp->ipRank = (USHORT)dwRank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); } diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 097201dbe..266053615 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -366,7 +366,7 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray host = rx_HostOf(peerp); port = rx_PortOf(peerp); - tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE); + tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE); if (tsp) { cellp = tsp->cellp; cm_PutServer(tsp); @@ -965,7 +965,6 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) { char *p = NULL; - struct sockaddr_in taddr; cm_server_t *tsp = NULL; cm_scache_t *scp = NULL; cm_cell_t* cellp = NULL; @@ -989,10 +988,10 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) RpcStringFree(&p); } - tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE); + tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE, FALSE); } if (!tsp) - tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE); + tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE); if (tsp) { cellp = tsp->cellp; cm_PutServer(tsp); @@ -1012,11 +1011,7 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid) } if (connp && peerp) { - taddr.sin_family = AF_INET; - taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(callp))); - taddr.sin_port = rx_PortOf(rx_PeerOf(rx_ConnectionOf(callp))); - - tsp = cm_FindServer(&taddr, CM_SERVER_FILE); + tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE); osi_Log1(afsd_logp, "InitCallbackState3 server %x", tsp); @@ -2043,7 +2038,7 @@ cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown) lock_ObtainMutex(&tsp->mx); if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - tsp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); tsp->downTime = time(NULL); } /* Now update the volume status */ @@ -2162,7 +2157,7 @@ cm_GiveUpAllCallbacksAllServersMulti(afs_int32 markDown) lock_ObtainMutex(&tsp->mx); if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - tsp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); tsp->downTime = time(NULL); } /* Now update the volume status */ diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 5a6c134d7..dbb9e1ac5 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -42,7 +42,7 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep, uns probe = !(cellrockp->flags & CM_FLAG_NOPROBE); /* if this server was previously created by fs setserverprefs */ - if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB)) + if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB, FALSE)) { if ( !tsp->cellp ) tsp->cellp = cellp; diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 085831021..28c8629eb 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -789,7 +789,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, if (errorCode == RX_CALL_DEAD && (reqp->flags & CM_REQ_NEW_CONN_FORCED)) { if (!(serverp->flags & CM_SERVERFLAG_DOWN)) { - serverp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&serverp->flags, CM_SERVERFLAG_DOWN); serverp->downTime = time(NULL); } } else { diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index a8ce8b1ea..6e94b8a38 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1873,12 +1873,12 @@ cm_IoctlSetSPrefs(struct cm_ioctl *ioctlp, struct cm_user *userp) } tmp.sin_family = AF_INET; - tsp = cm_FindServer(&tmp, type); + tsp = cm_FindServer(&tmp, type, FALSE); if ( tsp ) /* an existing server - ref count increased */ { lock_ObtainMutex(&tsp->mx); tsp->ipRank = rank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); @@ -1902,7 +1902,7 @@ cm_IoctlSetSPrefs(struct cm_ioctl *ioctlp, struct cm_user *userp) tsp = cm_NewServer(&tmp, type, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */ lock_ObtainMutex(&tsp->mx); tsp->ipRank = rank; - tsp->flags |= CM_SERVERFLAG_PREF_SET; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET); tsp->adminRank = tsp->ipRank; lock_ReleaseMutex(&tsp->mx); tsp->ipRank = rank; diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 224037c68..c915f2c6d 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -128,13 +128,13 @@ cm_PingServer(cm_server_t *tsp) lock_ObtainMutex(&tsp->mx); tsp->waitCount--; if (tsp->waitCount == 0) - tsp->flags &= ~CM_SERVERFLAG_PINGING; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING); else osi_Wakeup((LONG_PTR)tsp); lock_ReleaseMutex(&tsp->mx); return; } - tsp->flags |= CM_SERVERFLAG_PINGING; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING); wasDown = tsp->flags & CM_SERVERFLAG_DOWN; afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr); lock_ReleaseMutex(&tsp->mx); @@ -171,7 +171,7 @@ cm_PingServer(cm_server_t *tsp) lock_ObtainMutex(&tsp->mx); if (code >= 0 || code == RXGEN_OPCODE) { /* mark server as up */ - tsp->flags &= ~CM_SERVERFLAG_DOWN; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN); tsp->downTime = 0; /* we currently handle 32-bits of capabilities */ @@ -215,7 +215,7 @@ cm_PingServer(cm_server_t *tsp) } else { /* mark server as down */ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - tsp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); tsp->downTime = time(NULL); } if (code != VRESTARTING) { @@ -254,7 +254,7 @@ cm_PingServer(cm_server_t *tsp) } if (tsp->waitCount == 0) - tsp->flags &= ~CM_SERVERFLAG_PINGING; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING); else osi_Wakeup((LONG_PTR)tsp); lock_ReleaseMutex(&tsp->mx); @@ -410,7 +410,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) continue; } - tsp->flags |= CM_SERVERFLAG_PINGING; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING); lock_ReleaseMutex(&tsp->mx); serversp[nconns] = tsp; @@ -454,7 +454,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) if (results[i] >= 0 || results[i] == RXGEN_OPCODE) { /* mark server as up */ - tsp->flags &= ~CM_SERVERFLAG_DOWN; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN); tsp->downTime = 0; /* we currently handle 32-bits of capabilities */ @@ -499,7 +499,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) } else { /* mark server as down */ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - tsp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); tsp->downTime = time(NULL); } if (code != VRESTARTING) { @@ -539,7 +539,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) } if (tsp->waitCount == 0) - tsp->flags &= ~CM_SERVERFLAG_PINGING; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING); else osi_Wakeup((LONG_PTR)tsp); @@ -574,7 +574,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) continue; } - tsp->flags |= CM_SERVERFLAG_PINGING; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING); lock_ReleaseMutex(&tsp->mx); serversp[nconns] = tsp; @@ -619,7 +619,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) if (results[i] >= 0) { /* mark server as up */ - tsp->flags &= ~CM_SERVERFLAG_DOWN; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN); tsp->downTime = 0; tsp->capabilities = 0; @@ -631,7 +631,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) } else { /* mark server as down */ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { - tsp->flags |= CM_SERVERFLAG_DOWN; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); tsp->downTime = time(NULL); } if (code != VRESTARTING) { @@ -647,7 +647,7 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp) } if (tsp->waitCount == 0) - tsp->flags &= ~CM_SERVERFLAG_PINGING; + _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING); else osi_Wakeup((LONG_PTR)tsp); @@ -745,9 +745,9 @@ void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit) { lock_ObtainMutex(&serverp->mx); if (no64bit) - serverp->flags |= CM_SERVERFLAG_NO64BIT; + _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NO64BIT); else - serverp->flags &= ~CM_SERVERFLAG_NO64BIT; + _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NO64BIT); lock_ReleaseMutex(&serverp->mx); } @@ -755,9 +755,9 @@ void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no) { lock_ObtainMutex(&serverp->mx); if (no) - serverp->flags |= CM_SERVERFLAG_NOINLINEBULK; + _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NOINLINEBULK); else - serverp->flags &= ~CM_SERVERFLAG_NOINLINEBULK; + _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NOINLINEBULK); lock_ReleaseMutex(&serverp->mx); } @@ -831,6 +831,20 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family"); + lock_ObtainWrite(&cm_serverLock); /* get server lock */ + tsp = cm_FindServer(socketp, type, TRUE); + if (tsp) { + /* we might have found a server created by set server prefs */ + if (uuidp && !afs_uuid_is_nil(uuidp) && + !(tsp->flags & CM_SERVERFLAG_UUID)) + { + tsp->uuid = *uuidp; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID); + } + lock_ReleaseWrite(&cm_serverLock); + return tsp; + } + tsp = malloc(sizeof(*tsp)); if (tsp) { memset(tsp, 0, sizeof(*tsp)); @@ -838,7 +852,7 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell tsp->cellp = cellp; if (uuidp && !afs_uuid_is_nil(uuidp)) { tsp->uuid = *uuidp; - tsp->flags |= CM_SERVERFLAG_UUID; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID); } tsp->refCount = 1; lock_InitializeMutex(&tsp->mx, "cm_server_t mutex", LOCK_HIERARCHY_SERVER); @@ -846,7 +860,6 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell cm_SetServerPrefs(tsp); - lock_ObtainWrite(&cm_serverLock); /* get server lock */ tsp->allNextp = cm_allServersp; cm_allServersp = tsp; @@ -858,23 +871,25 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell cm_numFileServers++; break; } + } + lock_ReleaseWrite(&cm_serverLock); /* release server lock */ - lock_ReleaseWrite(&cm_serverLock); /* release server lock */ - - if ( !(flags & CM_FLAG_NOPROBE) ) { - tsp->flags |= CM_SERVERFLAG_DOWN; /* assume down; ping will mark up if available */ - cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */ - } + if (!(flags & CM_FLAG_NOPROBE) && tsp) { + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN); /* assume down; ping will mark up if available */ + cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */ } + return tsp; } cm_server_t * -cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type) +cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type, int locked) { cm_server_t *tsp; - lock_ObtainRead(&cm_serverLock); + if (!locked) + lock_ObtainRead(&cm_serverLock); + for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { if (tsp->type == type && tsp->addr.sin_addr.S_un.S_addr == ipaddr && @@ -886,17 +901,20 @@ cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type) if (tsp) cm_GetServerNoLock(tsp); - lock_ReleaseRead(&cm_serverLock); + if (!locked) + lock_ReleaseRead(&cm_serverLock); return tsp; } cm_server_t * -cm_FindServerByUuid(afsUUID *serverUuid, int type) +cm_FindServerByUuid(afsUUID *serverUuid, int type, int locked) { cm_server_t *tsp; - lock_ObtainRead(&cm_serverLock); + if (locked) + lock_ObtainRead(&cm_serverLock); + for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) { if (tsp->type == type && !afs_uuid_equal(&tsp->uuid, serverUuid)) break; @@ -906,35 +924,18 @@ cm_FindServerByUuid(afsUUID *serverUuid, int type) if (tsp) cm_GetServerNoLock(tsp); - lock_ReleaseRead(&cm_serverLock); + if (!locked) + lock_ReleaseRead(&cm_serverLock); return tsp; } /* find a server based on its properties */ -cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type) +cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked) { - cm_server_t *tsp; - osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value"); - lock_ObtainRead(&cm_serverLock); - for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) { - if (tsp->type == type && - tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr && - (tsp->addr.sin_port == addrp->sin_port || tsp->addr.sin_port == 0)) - break; - } - - /* bump ref count if we found the server */ - if (tsp) - cm_GetServerNoLock(tsp); - - /* drop big table lock */ - lock_ReleaseRead(&cm_serverLock); - - /* return what we found */ - return tsp; + return cm_FindServerByIP(addrp->sin_addr.s_addr, addrp->sin_port, type, locked); } cm_server_vols_t *cm_NewServerVols(void) { diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h index 665e3207d..adf47893d 100644 --- a/src/WINNT/afsd/cm_server.h +++ b/src/WINNT/afsd/cm_server.h @@ -100,7 +100,7 @@ extern void cm_PutServer(cm_server_t *); extern void cm_PutServerNoLock(cm_server_t *); -extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type); +extern cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked); extern osi_rwlock_t cm_serverLock; @@ -136,9 +136,9 @@ extern void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit); extern void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no); -extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type); +extern cm_server_t * cm_FindServerByIP(afs_uint32 addr, unsigned short port, int type, int locked); -extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type); +extern cm_server_t * cm_FindServerByUuid(afsUUID* uuid, int type, int locked); extern void cm_SetLanAdapterChangeDetected(void); diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index cca42b151..187ba2be1 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -520,7 +520,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * tsockAddr.sin_family = AF_INET; tempAddr = htonl(serverNumber[i]); tsockAddr.sin_addr.s_addr = tempAddr; - tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE); + tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE, FALSE); #ifdef MULTIHOMED if (tsp && (method == 2) && (tsp->flags & CM_SERVERFLAG_UUID)) { /* @@ -566,7 +566,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * if ( (method == 2) && !(tsp->flags & CM_SERVERFLAG_UUID) && !afs_uuid_is_nil(&serverUUID[i])) { tsp->uuid = serverUUID[i]; - tsp->flags |= CM_SERVERFLAG_UUID; + _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID); } /* and add it to the list(s). */ -- 2.39.5