From b452e1ce29325b059c1d06521c826f945575b717 Mon Sep 17 00:00:00 2001 From: basil00 Date: Mon, 17 Nov 2014 23:57:49 +0800 Subject: [PATCH] - Fix failing test case caused by bad word ordering. --- dll/windivert.c | 10 ++++++++++ sys/windivert.c | 24 ++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/dll/windivert.c b/dll/windivert.c index d8eec2e..77f5d5e 100644 --- a/dll/windivert.c +++ b/dll/windivert.c @@ -1014,6 +1014,16 @@ static BOOL WinDivertTokenizeFilter(const char *filter, WINDIVERT_LAYER layer, SetLastError(0); if (WinDivertHelperParseIPv6Address(token, tokens[tp].val)) { + // Work-around the different word orderings between the + // DLL vs SYS. + UINT32 tmp; + tmp = tokens[tp].val[0]; + tokens[tp].val[0] = tokens[tp].val[3]; + tokens[tp].val[3] = tmp; + tmp = tokens[tp].val[1]; + tokens[tp].val[1] = tokens[tp].val[2]; + tokens[tp].val[2] = tmp; + tokens[tp].kind = FILTER_TOKEN_NUMBER; tp++; continue; diff --git a/sys/windivert.c b/sys/windivert.c index f84b136..b22de73 100644 --- a/sys/windivert.c +++ b/sys/windivert.c @@ -3048,23 +3048,23 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx, field[0] = (UINT32)ipv6_header->HopLimit; break; case WINDIVERT_FILTER_FIELD_IPV6_SRCADDR: - field[0] = - (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[0]); - field[1] = - (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[1]); - field[2] = - (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[2]); field[3] = + (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[0]); + field[2] = + (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[1]); + field[1] = + (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[2]); + field[0] = (UINT32)RtlUlongByteSwap(ipv6_header->SrcAddr[3]); break; case WINDIVERT_FILTER_FIELD_IPV6_DSTADDR: - field[0] = - (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[0]); - field[1] = - (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[1]); - field[2] = - (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[2]); field[3] = + (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[0]); + field[2] = + (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[1]); + field[1] = + (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[2]); + field[0] = (UINT32)RtlUlongByteSwap(ipv6_header->DstAddr[3]); break; case WINDIVERT_FILTER_FIELD_ICMP_TYPE: