From ef5ea5120ea0af85d73fa7588dd0efc947a174d9 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 22 Mar 2013 00:54:36 -0400 Subject: [PATCH] Windows: AFSDeleteObjectInfo InterlockedExchange Use InterlockedExchangePointer to disconnect the ObjectInformationCB pointer from the caller. This ensures that only one thread can successfully call AFSDeleteObjectInfo on the same object at a time. Change-Id: Ie70f52fc443f88c3cb4be41f12caa91466d92905 Reviewed-on: http://gerrit.openafs.org/9644 Tested-by: BuildBot Reviewed-by: Peter Scott Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index d607b4f42..1854c0c4b 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -6822,13 +6822,13 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo) { BOOLEAN bAcquiredTreeLock = FALSE; - AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo); - BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE); + AFSObjectInfoCB *pObjectInfo = NULL; + BOOLEAN bHeldInService; AFSObjectInfoCB * pParentObjectInfo = NULL; AFSFileID FileId; LONG lCount; - if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME)) + if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME)) { // @@ -6841,9 +6841,19 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo) return; } + pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo, + NULL, + (PVOID *)ppObjectInfo); + + if ( pObjectInfo == NULL) + { + + return; + } + ASSERT( pObjectInfo->ObjectReferenceCount == 0); - (*ppObjectInfo) = NULL; + bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE); if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock)) { -- 2.39.5