Skip to content

Commit 9cb3811

Browse files
committed
lib - Add DispatchGetEventInformationLength to ensure we send at least EVENT_INFORMATION buffer size.
1 parent 5530a69 commit 9cb3811

13 files changed

+29
-25
lines changed

dokan/cleanup.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ VOID DispatchCleanup(HANDLE Handle, PEVENT_CONTEXT EventContext,
2626
PEVENT_INFORMATION eventInfo;
2727
DOKAN_FILE_INFO fileInfo;
2828
PDOKAN_OPEN_INFO openInfo;
29-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
29+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
3030

3131
CheckFileName(EventContext->Operation.Cleanup.FileName);
3232

dokan/close.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ VOID DispatchClose(HANDLE Handle, PEVENT_CONTEXT EventContext,
2626
PEVENT_INFORMATION eventInfo;
2727
DOKAN_FILE_INFO fileInfo;
2828
PDOKAN_OPEN_INFO openInfo;
29-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
29+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
3030

3131
UNREFERENCED_PARAMETER(Handle);
3232

dokan/directory.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,9 @@ VOID DispatchDirectoryInformation(HANDLE Handle, PEVENT_CONTEXT EventContext,
525525
PDOKAN_OPEN_INFO openInfo;
526526
NTSTATUS status = STATUS_SUCCESS;
527527
ULONG fileInfoClass = EventContext->Operation.Directory.FileInformationClass;
528-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION) - 8 +
529-
EventContext->Operation.Directory.BufferLength;
530-
531528
BOOLEAN patternCheck = TRUE;
529+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(
530+
EventContext->Operation.Directory.BufferLength);
532531

533532
CheckFileName(EventContext->Operation.Directory.DirectoryName);
534533

dokan/dokan.c

+8
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,14 @@ VOID CheckFileName(LPWSTR FileName) {
570570
FileName[len - 1] = '\0';
571571
}
572572

573+
ULONG DispatchGetEventInformationLength(ULONG bufferSize) {
574+
// EVENT_INFORMATION has a buffer of size 8 already
575+
// we remote it to the struct size and add the requested buffer size
576+
// but we need at least to have enough space to set EVENT_INFORMATION
577+
return max((ULONG)sizeof(EVENT_INFORMATION),
578+
sizeof(EVENT_INFORMATION) - 8 + bufferSize);
579+
}
580+
573581
PEVENT_INFORMATION
574582
DispatchCommon(PEVENT_CONTEXT EventContext, ULONG SizeOfEventInfo,
575583
PDOKAN_INSTANCE DokanInstance, PDOKAN_FILE_INFO DokanFileInfo,

dokan/dokani.h

+2
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ BOOL IsMountPointDriveLetter(LPCWSTR mountPoint);
119119
VOID SendEventInformation(HANDLE Handle, PEVENT_INFORMATION EventInfo,
120120
ULONG EventLength, PDOKAN_INSTANCE DokanInstance);
121121

122+
ULONG DispatchGetEventInformationLength(ULONG bufferSize);
123+
122124
PEVENT_INFORMATION
123125
DispatchCommon(PEVENT_CONTEXT EventContext, ULONG SizeOfEventInfo,
124126
PDOKAN_INSTANCE DokanInstance, PDOKAN_FILE_INFO DokanFileInfo,

dokan/fileinfo.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,8 @@ VOID DispatchQueryInformation(HANDLE Handle, PEVENT_CONTEXT EventContext,
419419
ULONG remainingLength;
420420
NTSTATUS status = STATUS_INVALID_PARAMETER;
421421
PDOKAN_OPEN_INFO openInfo;
422-
ULONG sizeOfEventInfo;
423-
424-
sizeOfEventInfo =
425-
sizeof(EVENT_INFORMATION) - 8 + EventContext->Operation.File.BufferLength;
422+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(
423+
EventContext->Operation.File.BufferLength);
426424

427425
CheckFileName(EventContext->Operation.File.FileName);
428426

dokan/flush.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ VOID DispatchFlush(HANDLE Handle, PEVENT_CONTEXT EventContext,
2525
PDOKAN_INSTANCE DokanInstance) {
2626
DOKAN_FILE_INFO fileInfo;
2727
PEVENT_INFORMATION eventInfo;
28-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
2928
PDOKAN_OPEN_INFO openInfo;
3029
NTSTATUS status;
30+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
3131

3232
CheckFileName(EventContext->Operation.Flush.FileName);
3333

dokan/lock.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ VOID DispatchLock(HANDLE Handle, PEVENT_CONTEXT EventContext,
2626
PDOKAN_INSTANCE DokanInstance) {
2727
DOKAN_FILE_INFO fileInfo;
2828
PEVENT_INFORMATION eventInfo;
29-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
3029
PDOKAN_OPEN_INFO openInfo;
3130
NTSTATUS status;
31+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
3232

3333
CheckFileName(EventContext->Operation.Lock.FileName);
3434

dokan/read.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ VOID DispatchRead(HANDLE Handle, PEVENT_CONTEXT EventContext,
2828
ULONG readLength = 0;
2929
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
3030
DOKAN_FILE_INFO fileInfo;
31-
ULONG sizeOfEventInfo;
32-
33-
sizeOfEventInfo =
34-
sizeof(EVENT_INFORMATION) - 8 + EventContext->Operation.Read.BufferLength;
31+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(
32+
EventContext->Operation.Read.BufferLength);
3533

3634
CheckFileName(EventContext->Operation.Read.FileName);
3735

dokan/security.c

+3-5
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,11 @@ VOID DispatchQuerySecurity(HANDLE Handle, PEVENT_CONTEXT EventContext,
131131
PEVENT_INFORMATION eventInfo;
132132
DOKAN_FILE_INFO fileInfo;
133133
PDOKAN_OPEN_INFO openInfo;
134-
ULONG eventInfoLength;
135134
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
136135
ULONG lengthNeeded = 0;
136+
ULONG eventInfoLength = DispatchGetEventInformationLength(
137+
EventContext->Operation.Security.BufferLength);
137138

138-
eventInfoLength = sizeof(EVENT_INFORMATION) - 8 +
139-
EventContext->Operation.Security.BufferLength;
140139
CheckFileName(EventContext->Operation.Security.FileName);
141140

142141
eventInfo = DispatchCommon(EventContext, eventInfoLength, DokanInstance,
@@ -184,11 +183,10 @@ VOID DispatchSetSecurity(HANDLE Handle, PEVENT_CONTEXT EventContext,
184183
PEVENT_INFORMATION eventInfo;
185184
DOKAN_FILE_INFO fileInfo;
186185
PDOKAN_OPEN_INFO openInfo;
187-
ULONG eventInfoLength;
188186
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
189187
PSECURITY_DESCRIPTOR securityDescriptor;
188+
ULONG eventInfoLength = DispatchGetEventInformationLength(0);
190189

191-
eventInfoLength = sizeof(EVENT_INFORMATION);
192190
CheckFileName(EventContext->Operation.SetSecurity.FileName);
193191

194192
eventInfo = DispatchCommon(EventContext, eventInfoLength, DokanInstance,

dokan/setfile.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,14 @@ VOID DispatchSetInformation(HANDLE Handle, PEVENT_CONTEXT EventContext,
235235
PDOKAN_OPEN_INFO openInfo;
236236
DOKAN_FILE_INFO fileInfo;
237237
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
238-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
238+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
239239

240240
if (EventContext->Operation.SetFile.FileInformationClass == FileRenameInformation
241241
|| EventContext->Operation.SetFile.FileInformationClass == FileRenameInformationEx) {
242242
PDOKAN_RENAME_INFORMATION renameInfo = (PDOKAN_RENAME_INFORMATION)(
243243
(PCHAR)EventContext + EventContext->Operation.SetFile.BufferOffset);
244-
sizeOfEventInfo += renameInfo->FileNameLength;
244+
sizeOfEventInfo =
245+
DispatchGetEventInformationLength(renameInfo->FileNameLength);
245246
}
246247

247248
CheckFileName(EventContext->Operation.SetFile.FileName);

dokan/volume.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,8 @@ VOID DispatchQueryVolumeInformation(HANDLE Handle, PEVENT_CONTEXT EventContext,
314314
PEVENT_INFORMATION eventInfo;
315315
DOKAN_FILE_INFO fileInfo;
316316
PDOKAN_OPEN_INFO openInfo;
317-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION) - 8 +
318-
EventContext->Operation.Volume.BufferLength;
317+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(
318+
EventContext->Operation.Volume.BufferLength);
319319

320320
eventInfo = (PEVENT_INFORMATION)malloc(sizeOfEventInfo);
321321
if (eventInfo == NULL) {

dokan/write.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ VOID DispatchWrite(HANDLE Handle, PEVENT_CONTEXT EventContext,
6464
NTSTATUS status;
6565
DOKAN_FILE_INFO fileInfo;
6666
BOOL bufferAllocated = FALSE;
67-
ULONG sizeOfEventInfo = sizeof(EVENT_INFORMATION);
6867
ULONG returnedLength = 0;
6968
BOOL SendWriteRequestStatus = TRUE; // otherwise DokanInstance->DokanOperations->WriteFile cannot be called
7069
DWORD SendWriteRequestLastError = 0;
70+
ULONG sizeOfEventInfo = DispatchGetEventInformationLength(0);
7171

7272
eventInfo = DispatchCommon(EventContext, sizeOfEventInfo, DokanInstance,
7373
&fileInfo, &openInfo);

0 commit comments

Comments
 (0)