From: Jeffrey Altman Date: Sat, 31 Dec 2011 01:24:49 +0000 (-0500) Subject: Windows: AFSInsertHashEntry can fail X-Git-Tag: openafs-stable-1_8_0pre1~2879 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=36657b8505e3b232158a63b4ecad12fa59548b3a Windows: AFSInsertHashEntry can fail If AFSInsertHashEntry() fails, the object information structure that was being inserted is not in the btree. Therefore, ensure that the object does not have the AFS_OBJECT_INSERTED_HASH_TREE or AFS_VOLUME_INSERTED_HASH_TREE flag set (as appropriate). This permits the unreferenced object to be garbage collected. Change-Id: I023f765571a7ba014556d9505ab2d46ec930f1a2 Reviewed-on: http://gerrit.openafs.org/6458 Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp index c09f8c5..c155de3 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp @@ -1462,8 +1462,6 @@ AFSInsertHashEntry( IN AFSBTreeEntry *TopNode, "AFSInsertHashEntry Attempt to re-insert a CRC %I64X\n", FileIDEntry->HashIndex); - ASSERT( FALSE); - ntStatus = STATUS_UNSUCCESSFUL; break; diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp index cda97c5..bfdbbe8 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp @@ -620,15 +620,19 @@ AFSInitVolume( IN GUID *AuthGroup, { pDeviceExt->Specific.RDR.VolumeTree.TreeHead = &pVolumeCB->TreeEntry; + + SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE); } else { - AFSInsertHashEntry( pDeviceExt->Specific.RDR.VolumeTree.TreeHead, - &pVolumeCB->TreeEntry); - } + if ( NT_SUCCESS( AFSInsertHashEntry( pDeviceExt->Specific.RDR.VolumeTree.TreeHead, + &pVolumeCB->TreeEntry))) + { - SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE); + SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE); + } + } if( pDeviceExt->Specific.RDR.VolumeListHead == NULL) { diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 4abd76e..98811ac 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -2453,8 +2453,17 @@ AFSSetRenameInfo( IN PIRP Irp) else { - AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead, - &pSrcObject->TreeEntry); + if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead, + &pSrcObject->TreeEntry))) + { + + // + // Lost a race, an ObjectInfo object already exists for this FID. + // Let this copy be garbage collected. + // + + ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE); + } } AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);