diff options
author | dnobori <da.git@softether.co.jp> | 2015-10-19 15:30:51 +0300 |
---|---|---|
committer | dnobori <da.git@softether.co.jp> | 2015-10-19 15:30:51 +0300 |
commit | d3a1b26413acf3b387475f9ec5c4cbd93c5ffffe (patch) | |
tree | e248aa6f09b05d45696ecac1da7ecfa540fac91c /src/Wfp/Wfp.c | |
parent | 4e862a7e40c095ac6ac8b1417890008fbd614ebb (diff) |
v4.19-9599-beta
Diffstat (limited to 'src/Wfp/Wfp.c')
-rw-r--r-- | src/Wfp/Wfp.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/src/Wfp/Wfp.c b/src/Wfp/Wfp.c index e23b6f29..eb81ca87 100644 --- a/src/Wfp/Wfp.c +++ b/src/Wfp/Wfp.c @@ -172,22 +172,49 @@ NTSTATUS DriverDispatch(DEVICE_OBJECT *device_object, IRP *irp) case IRP_MJ_WRITE: // Write
if ((stack->Parameters.Write.Length % sizeof(WFP_LOCAL_IP)) == 0)
{
- UINT size = MIN(WFP_MAX_LOCAL_IP_COUNT * sizeof(WFP_LOCAL_IP), stack->Parameters.Write.Length);
- UCHAR *copied_buf = Malloc(size);
- UCHAR *old_buf;
- Copy(copied_buf, buf, size);
-
- SpinLock(wfp->LocalIPListLock);
+ // Address check
+ bool check_ok = true;
+ __try
+ {
+ ProbeForRead(buf, stack->Parameters.Write.Length, 1);
+ }
+ __except (EXCEPTION_EXECUTE_HANDLER)
{
- old_buf = wfp->LocalIPListData;
- wfp->LocalIPListData = copied_buf;
- wfp->LocalIPListSize = size;
+ check_ok = false;
}
- SpinUnlock(wfp->LocalIPListLock);
- if (old_buf != NULL)
+ if (check_ok)
{
- Free(old_buf);
+ MDL *mdl = IoAllocateMdl(buf, stack->Parameters.Write.Length, false, false, NULL);
+ UINT size = MIN(WFP_MAX_LOCAL_IP_COUNT * sizeof(WFP_LOCAL_IP), stack->Parameters.Write.Length);
+ UCHAR *copied_buf = Malloc(size);
+ UCHAR *old_buf;
+
+ if (mdl != NULL)
+ {
+ MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
+ }
+
+ Copy(copied_buf, buf, size);
+
+ SpinLock(wfp->LocalIPListLock);
+ {
+ old_buf = wfp->LocalIPListData;
+ wfp->LocalIPListData = copied_buf;
+ wfp->LocalIPListSize = size;
+ }
+ SpinUnlock(wfp->LocalIPListLock);
+
+ if (old_buf != NULL)
+ {
+ Free(old_buf);
+ }
+
+ if (mdl != NULL)
+ {
+ MmUnlockPages(mdl);
+ IoFreeMdl(mdl);
+ }
}
}
irp->IoStatus.Information = stack->Parameters.Write.Length;
|