NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
ULONG ulFileAttribs = 0;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
Buffer->CreationTime = DirectoryCB->ObjectInformation->CreationTime;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
if( *Length >= sizeof( FILE_STANDARD_INFORMATION))
{
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
RtlZeroMemory( Buffer,
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
{
ulFileAttribs = stFileInfo.FileAttributes;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
Buffer->Directory = BooleanFlagOn( ulFileAttribs, FILE_ATTRIBUTE_DIRECTORY);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
Buffer->CreationTime.QuadPart = DirectoryCB->ObjectInformation->CreationTime.QuadPart;
NTSTATUS ntStatus = STATUS_BUFFER_TOO_SMALL;
ULONG ulCopyLength = 0;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ AFSFcb *pFcb = NULL;
AFSCcb *pCcb = NULL;
PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSFileInfoCB stFileInfo;
ulFileAttribs = DirectoryCB->ObjectInformation->FileAttributes;
+ pFcb = (AFSFcb *)pIrpSp->FileObject->FsContext;
+ pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
if( DirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
pParentDirectoryCB = AFSGetParentEntry( pCcb->NameArray);
AFSRetrieveParentPath( &pCcb->FullFileName,
RtlZeroMemory( &stFileInfo,
sizeof( AFSFileInfoCB));
+ //
+ // Can't hold the Fcb while evaluating the path, leads to lock inversion
+ //
+
+ AFSReleaseResource( &pFcb->NPFcb->Resource);
+
if( NT_SUCCESS( AFSRetrieveFileAttributes( pParentDirectoryCB,
DirectoryCB,
&uniParentPath,
ulFileAttribs |= FILE_ATTRIBUTE_REPARSE_POINT;
}
+
+ AFSAcquireShared( &pFcb->NPFcb->Resource,
+ TRUE);
}
Buffer->FileAttributes = ulFileAttribs;