Bug fixes.

- Fix broken WinDivertCondExecFilter().  This
  caused some callouts to be needlessly installed.
- Fix broken WinDivertByteSwap128().
- Rename "Ipv6" -> "IPv6" to keep API consistent.
- Samples now use correct MTU.
This commit is contained in:
basil00
2019-06-15 07:31:56 +08:00
parent 5d62e2a938
commit cedb929873
7 changed files with 41 additions and 42 deletions
+2 -2
View File
@@ -26,5 +26,5 @@ EXPORTS
WinDivertHelperHtonl
WinDivertHelperNtohll
WinDivertHelperHtonll
WinDivertHelperNtohIpv6Address
WinDivertHelperHtonIpv6Address
WinDivertHelperNtohIPv6Address
WinDivertHelperHtonIPv6Address
+28 -29
View File
@@ -2189,7 +2189,7 @@ static BOOL WinDivertCondExecFilter(PWINDIVERT_FILTER filter, UINT length,
UINT8 field, UINT32 arg)
{
INT16 ip;
UINT8 succ, fail;
UINT16 succ, fail;
BOOL result[WINDIVERT_FILTER_MAXLEN];
BOOL result_succ, result_fail, result_test;
@@ -2201,33 +2201,31 @@ static BOOL WinDivertCondExecFilter(PWINDIVERT_FILTER filter, UINT length,
for (ip = (INT16)(length-1); ip >= 0; ip--)
{
succ = filter[ip].success;
if (succ == WINDIVERT_FILTER_RESULT_ACCEPT || succ <= ip ||
succ >= length)
switch (succ)
{
result_succ = TRUE;
}
else if (succ == WINDIVERT_FILTER_RESULT_REJECT)
{
result_succ = FALSE;
}
else
{
result_succ = result[succ];
case WINDIVERT_FILTER_RESULT_ACCEPT:
result_succ = TRUE;
break;
case WINDIVERT_FILTER_RESULT_REJECT:
result_succ = FALSE;
break;
default:
result_succ = (succ > ip && succ < length? result[succ]: TRUE);
break;
}
fail = filter[ip].failure;
if (fail == WINDIVERT_FILTER_RESULT_ACCEPT || fail <= ip ||
fail >= length)
switch (fail)
{
result_fail = TRUE;
}
else if (fail == WINDIVERT_FILTER_RESULT_REJECT)
{
result_fail = FALSE;
}
else
{
result_fail = result[fail];
case WINDIVERT_FILTER_RESULT_ACCEPT:
result_fail = TRUE;
break;
case WINDIVERT_FILTER_RESULT_REJECT:
result_fail = FALSE;
break;
default:
result_fail = (fail > ip && fail < length? result[fail]: TRUE);
break;
}
if (result_succ && result_fail)
@@ -2243,7 +2241,7 @@ static BOOL WinDivertCondExecFilter(PWINDIVERT_FILTER filter, UINT length,
if (filter[ip].neg || filter[ip].arg[1] != 0 ||
filter[ip].arg[2] != 0 || filter[ip].arg[3] != 0)
{
result_test = FALSE;
result[ip] = TRUE;
}
else
{
@@ -2268,10 +2266,11 @@ static BOOL WinDivertCondExecFilter(PWINDIVERT_FILTER filter, UINT length,
result_test = (arg >= filter[ip].arg[0]);
break;
default:
return TRUE; // abort.
result[ip] = TRUE;
continue;
}
result[ip] = (result_test? result_succ: result_fail);
}
result[ip] = (result_test? result_succ: result_fail);
}
else
{
@@ -5039,18 +5038,18 @@ static void WinDivertByteSwap128(const UINT *inAddr, UINT *outAddr)
UINT32 tmp[4], i; // tmp[] allows overlapping inAddr/outAddr
for (i = 0; i < 4; i++)
{
tmp[3-i] = BYTESWAP32(inAddr[0]);
tmp[3-i] = BYTESWAP32(inAddr[i]);
}
for (i = 0; i < 4; i++)
{
outAddr[i] = tmp[i];
}
}
extern void WinDivertHelperNtohIpv6Address(const UINT *inAddr, UINT *outAddr)
extern void WinDivertHelperNtohIPv6Address(const UINT *inAddr, UINT *outAddr)
{
WinDivertByteSwap128(inAddr, outAddr);
}
extern void WinDivertHelperHtonIpv6Address(const UINT *inAddr, UINT *outAddr)
extern void WinDivertHelperHtonIPv6Address(const UINT *inAddr, UINT *outAddr)
{
WinDivertByteSwap128(inAddr, outAddr);
}
+3 -3
View File
@@ -51,7 +51,7 @@
#define ntohs(x) WinDivertHelperNtohs(x)
#define ntohl(x) WinDivertHelperNtohl(x)
#define MAXBUF 0xFFFF
#define MAXBUF WINDIVERT_MTU_MAX
#define INET6_ADDRSTRLEN 45
/*
@@ -197,8 +197,8 @@ int __cdecl main(int argc, char **argv)
}
if (ipv6_header != NULL)
{
WinDivertHelperNtohIpv6Address(ipv6_header->SrcAddr, src_addr);
WinDivertHelperNtohIpv6Address(ipv6_header->DstAddr, dst_addr);
WinDivertHelperNtohIPv6Address(ipv6_header->SrcAddr, src_addr);
WinDivertHelperNtohIPv6Address(ipv6_header->DstAddr, dst_addr);
WinDivertHelperFormatIPv6Address(src_addr, src_str,
sizeof(src_str));
WinDivertHelperFormatIPv6Address(dst_addr, dst_str,
+3 -3
View File
@@ -59,7 +59,7 @@
#define htons(x) WinDivertHelperHtons(x)
#define htonl(x) WinDivertHelperHtonl(x)
#define MAXBUF 0xFFFF
#define MAXBUF WINDIVERT_MTU_MAX
#define INET6_ADDRSTRLEN 45
#define IPPROTO_ICMPV6 58
@@ -223,8 +223,8 @@ int __cdecl main(int argc, char **argv)
}
if (ipv6_header != NULL)
{
WinDivertHelperNtohIpv6Address(ipv6_header->SrcAddr, src_addr);
WinDivertHelperNtohIpv6Address(ipv6_header->DstAddr, dst_addr);
WinDivertHelperNtohIPv6Address(ipv6_header->SrcAddr, src_addr);
WinDivertHelperNtohIPv6Address(ipv6_header->DstAddr, dst_addr);
WinDivertHelperFormatIPv6Address(src_addr, src_str,
sizeof(src_str));
WinDivertHelperFormatIPv6Address(dst_addr, dst_str,
+1 -1
View File
@@ -51,7 +51,7 @@
#include "windivert.h"
#define MAXBUF 0xFFFF
#define MAXBUF WINDIVERT_MTU_MAX
#define PROXY_PORT 34010
#define ALT_PORT 43010
#define MAX_LINE 65
+2 -2
View File
@@ -53,8 +53,8 @@
#define htons(x) WinDivertHelperHtons(x)
#define htonl(x) WinDivertHelperHtonl(x)
#define MAXBUF 0xFFFF
#define MAXURL 4096
#define MAXBUF WINDIVERT_MTU_MAX
#define MAXURL 4096
/*
* URL and blacklist representation.
+2 -2
View File
@@ -603,10 +603,10 @@ extern WINDIVERTEXPORT UINT64 WinDivertHelperNtohll(
__in UINT64 x);
extern WINDIVERTEXPORT UINT64 WinDivertHelperHtonll(
__in UINT64 x);
extern WINDIVERTEXPORT void WinDivertHelperNtohIpv6Address(
extern WINDIVERTEXPORT void WinDivertHelperNtohIPv6Address(
__in const UINT *inAddr,
__out UINT *outAddr);
extern WINDIVERTEXPORT void WinDivertHelperHtonIpv6Address(
extern WINDIVERTEXPORT void WinDivertHelperHtonIPv6Address(
__in const UINT *inAddr,
__out UINT *outAddr);