From cedb9298735485a737524fe08205d40ba7e4e656 Mon Sep 17 00:00:00 2001 From: basil00 Date: Sat, 15 Jun 2019 07:31:56 +0800 Subject: [PATCH] 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. --- dll/windivert.def | 4 +-- dll/windivert_helper.c | 57 ++++++++++++++++---------------- examples/netdump/netdump.c | 6 ++-- examples/netfilter/netfilter.c | 6 ++-- examples/streamdump/streamdump.c | 2 +- examples/webfilter/webfilter.c | 4 +-- include/windivert.h | 4 +-- 7 files changed, 41 insertions(+), 42 deletions(-) diff --git a/dll/windivert.def b/dll/windivert.def index 523bfda..5f9e485 100644 --- a/dll/windivert.def +++ b/dll/windivert.def @@ -26,5 +26,5 @@ EXPORTS WinDivertHelperHtonl WinDivertHelperNtohll WinDivertHelperHtonll - WinDivertHelperNtohIpv6Address - WinDivertHelperHtonIpv6Address + WinDivertHelperNtohIPv6Address + WinDivertHelperHtonIPv6Address diff --git a/dll/windivert_helper.c b/dll/windivert_helper.c index 3e1429f..4a75f5d 100644 --- a/dll/windivert_helper.c +++ b/dll/windivert_helper.c @@ -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); } diff --git a/examples/netdump/netdump.c b/examples/netdump/netdump.c index 9bd76cd..52fbd9e 100644 --- a/examples/netdump/netdump.c +++ b/examples/netdump/netdump.c @@ -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, diff --git a/examples/netfilter/netfilter.c b/examples/netfilter/netfilter.c index fccb265..604a5e7 100644 --- a/examples/netfilter/netfilter.c +++ b/examples/netfilter/netfilter.c @@ -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, diff --git a/examples/streamdump/streamdump.c b/examples/streamdump/streamdump.c index 7d84019..b4d9547 100644 --- a/examples/streamdump/streamdump.c +++ b/examples/streamdump/streamdump.c @@ -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 diff --git a/examples/webfilter/webfilter.c b/examples/webfilter/webfilter.c index bd320a8..4f0c65b 100644 --- a/examples/webfilter/webfilter.c +++ b/examples/webfilter/webfilter.c @@ -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. diff --git a/include/windivert.h b/include/windivert.h index 26099c3..14811fc 100644 --- a/include/windivert.h +++ b/include/windivert.h @@ -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);