mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-10-29 19:18:39 -05:00 
			
		
		
		
	sys: ea: return STATUS_EA_CORRUPT_ERROR when appropriate
This commit is contained in:
		| @@ -1288,6 +1288,7 @@ typedef struct FSP_FILE_NODE | |||||||
|     ULONG StreamInfoChangeNumber; |     ULONG StreamInfoChangeNumber; | ||||||
|     UINT64 Ea; |     UINT64 Ea; | ||||||
|     ULONG EaChangeNumber; |     ULONG EaChangeNumber; | ||||||
|  |     ULONG EaChangeCount; | ||||||
|     BOOLEAN TruncateOnClose; |     BOOLEAN TruncateOnClose; | ||||||
|     FILE_LOCK FileLock; |     FILE_LOCK FileLock; | ||||||
| #if (NTDDI_VERSION < NTDDI_WIN8) | #if (NTDDI_VERSION < NTDDI_WIN8) | ||||||
| @@ -1327,6 +1328,7 @@ typedef struct | |||||||
|     UINT64 DirInfo; |     UINT64 DirInfo; | ||||||
|     ULONG DirInfoCacheHint; |     ULONG DirInfoCacheHint; | ||||||
|     ULONG EaIndex; |     ULONG EaIndex; | ||||||
|  |     ULONG EaChangeCount; | ||||||
|     /* stream support */ |     /* stream support */ | ||||||
|     HANDLE MainFileHandle; |     HANDLE MainFileHandle; | ||||||
|     PFILE_OBJECT MainFileObject; |     PFILE_OBJECT MainFileObject; | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								src/sys/ea.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/sys/ea.c
									
									
									
									
									
								
							| @@ -285,6 +285,7 @@ static VOID FspFsvolQueryEaCopy( | |||||||
|     PAGED_CODE(); |     PAGED_CODE(); | ||||||
|  |  | ||||||
|     PFILE_OBJECT FileObject = IrpSp->FileObject; |     PFILE_OBJECT FileObject = IrpSp->FileObject; | ||||||
|  |     FSP_FILE_NODE *FileNode = FileObject->FsContext; | ||||||
|     FSP_FILE_DESC *FileDesc = FileObject->FsContext2; |     FSP_FILE_DESC *FileDesc = FileObject->FsContext2; | ||||||
|     BOOLEAN RestartScan = BooleanFlagOn(IrpSp->Flags, SL_RESTART_SCAN); |     BOOLEAN RestartScan = BooleanFlagOn(IrpSp->Flags, SL_RESTART_SCAN); | ||||||
|     BOOLEAN IndexSpecified = BooleanFlagOn(IrpSp->Flags, SL_INDEX_SPECIFIED); |     BOOLEAN IndexSpecified = BooleanFlagOn(IrpSp->Flags, SL_INDEX_SPECIFIED); | ||||||
| @@ -293,6 +294,8 @@ static VOID FspFsvolQueryEaCopy( | |||||||
|     ULONG EaListLength = IrpSp->Parameters.QueryEa.EaListLength; |     ULONG EaListLength = IrpSp->Parameters.QueryEa.EaListLength; | ||||||
|     ULONG EaIndex; |     ULONG EaIndex; | ||||||
|  |  | ||||||
|  |     ASSERT(FileNode == FileDesc->FileNode); | ||||||
|  |  | ||||||
|     if (0 != EaList) |     if (0 != EaList) | ||||||
|     { |     { | ||||||
|         FspFsvolQueryEaGetCopy( |         FspFsvolQueryEaGetCopy( | ||||||
| @@ -305,6 +308,15 @@ static VOID FspFsvolQueryEaCopy( | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|  |         if (!IndexSpecified && | ||||||
|  |             !RestartScan && | ||||||
|  |             0 != FileDesc->EaIndex && | ||||||
|  |             FileNode->EaChangeCount != FileDesc->EaChangeCount) | ||||||
|  |         { | ||||||
|  |             IoStatus->Status = STATUS_EA_CORRUPT_ERROR; | ||||||
|  |             IoStatus->Information = 0; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         if (IndexSpecified) |         if (IndexSpecified) | ||||||
|             EaIndex = IrpSp->Parameters.QueryEa.EaIndex; |             EaIndex = IrpSp->Parameters.QueryEa.EaIndex; | ||||||
|         else if (RestartScan) |         else if (RestartScan) | ||||||
| @@ -319,7 +331,10 @@ static VOID FspFsvolQueryEaCopy( | |||||||
|             DstBufBgn, DstSize, |             DstBufBgn, DstSize, | ||||||
|             IoStatus); |             IoStatus); | ||||||
|         if (NT_SUCCESS(IoStatus->Status) || STATUS_BUFFER_OVERFLOW == IoStatus->Status) |         if (NT_SUCCESS(IoStatus->Status) || STATUS_BUFFER_OVERFLOW == IoStatus->Status) | ||||||
|  |         { | ||||||
|             FileDesc->EaIndex = EaIndex; |             FileDesc->EaIndex = EaIndex; | ||||||
|  |             FileDesc->EaChangeCount = FileNode->EaChangeCount; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -576,6 +591,8 @@ NTSTATUS FspFsvolSetEaComplete( | |||||||
|         FspFileNodeSetEa(FileNode, 0, 0); |         FspFileNodeSetEa(FileNode, 0, 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     FileNode->EaChangeCount++; | ||||||
|  |  | ||||||
|     FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_EA, FILE_ACTION_MODIFIED, FALSE); |     FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_EA, FILE_ACTION_MODIFIED, FALSE); | ||||||
|  |  | ||||||
|     FspIopRequestContext(Request, RequestFileNode) = 0; |     FspIopRequestContext(Request, RequestFileNode) = 0; | ||||||
|   | |||||||
| @@ -645,6 +645,10 @@ static void ea_check_ea2(HANDLE Handle) | |||||||
|     } Ea; |     } Ea; | ||||||
|     struct ea_check_ea_context Context; |     struct ea_check_ea_context Context; | ||||||
|  |  | ||||||
|  |     memset(&Context, 0, sizeof Context); | ||||||
|  |     Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, FALSE); | ||||||
|  |     ASSERT(STATUS_EA_CORRUPT_ERROR == Result); | ||||||
|  |  | ||||||
|     memset(&Context, 0, sizeof Context); |     memset(&Context, 0, sizeof Context); | ||||||
|     Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, TRUE); |     Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, TRUE); | ||||||
|     ASSERT(STATUS_SUCCESS == Result); |     ASSERT(STATUS_SUCCESS == Result); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user