Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/SoftEtherVPN/SoftEtherVPN_Stable.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordnobori <da.git@softether.co.jp>2015-10-19 15:30:51 +0300
committerdnobori <da.git@softether.co.jp>2015-10-19 15:30:51 +0300
commitd3a1b26413acf3b387475f9ec5c4cbd93c5ffffe (patch)
treee248aa6f09b05d45696ecac1da7ecfa540fac91c /src/Wfp/Wfp.c
parent4e862a7e40c095ac6ac8b1417890008fbd614ebb (diff)
v4.19-9599-beta
Diffstat (limited to 'src/Wfp/Wfp.c')
-rw-r--r--src/Wfp/Wfp.c51
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;