Windows: AFSInsertHashEntry can fail
authorJeffrey Altman <jaltman@your-file-system.com>
Sat, 31 Dec 2011 01:24:49 +0000 (20:24 -0500)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 31 Dec 2011 21:21:36 +0000 (13:21 -0800)
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 <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>

src/WINNT/afsrdr/kernel/lib/AFSBTreeSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSFcbSupport.cpp
src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp

index c09f8c5..c155de3 100644 (file)
@@ -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;
index cda97c5..bfdbbe8 100644 (file)
@@ -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)
             {
index 4abd76e..98811ac 100644 (file)
@@ -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);