Skip to content

Commit 92869a9

Browse files
committed
Fix ip.TOS and ipv6 comparison bug & bump version.
1 parent 90da7a9 commit 92869a9

File tree

4 files changed

+57
-42
lines changed

4 files changed

+57
-42
lines changed

CHANGELOG

+3
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,6 @@ WinDivert 1.1.7
5858
* WinDivert driver now calculates checksums for IPV6 packets.
5959
* WinDivert can now handle IPV6 extension headers.
6060
* Fixed WinDivertHelperParseIPv6Address().
61+
WinDivert 1.1.8
62+
- Fix ip.TOS handling bug.
63+
- Fix IPv6 comparison bug.

VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.7
1+
1.1.8

sys/windivert.c

+50-38
Original file line numberDiff line numberDiff line change
@@ -2764,6 +2764,46 @@ static void windivert_update_checksums(void *header, size_t len,
27642764
}
27652765
}
27662766

2767+
/*
2768+
* Big number comparison.
2769+
*/
2770+
static int windivert_big_num_compare(const UINT32 *a, const UINT32 *b)
2771+
{
2772+
if (a[3] < b[3])
2773+
{
2774+
return -1;
2775+
}
2776+
if (a[3] > b[3])
2777+
{
2778+
return 1;
2779+
}
2780+
if (a[2] < b[2])
2781+
{
2782+
return -1;
2783+
}
2784+
if (a[2] > b[2])
2785+
{
2786+
return 1;
2787+
}
2788+
if (a[1] < b[1])
2789+
{
2790+
return -1;
2791+
}
2792+
if (a[1] > b[1])
2793+
{
2794+
return 1;
2795+
}
2796+
if (a[0] < b[0])
2797+
{
2798+
return -1;
2799+
}
2800+
if (a[0] > b[0])
2801+
{
2802+
return 1;
2803+
}
2804+
return 0;
2805+
}
2806+
27672807
/*
27682808
* Checks if the given packet is of interest.
27692809
*/
@@ -2926,6 +2966,7 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx,
29262966
while (ttl-- != 0)
29272967
{
29282968
BOOL result;
2969+
int cmp;
29292970
UINT32 field[4];
29302971
field[1] = 0;
29312972
field[2] = 0;
@@ -2998,7 +3039,7 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx,
29983039
field[0] = (UINT32)ip_header->HdrLength;
29993040
break;
30003041
case WINDIVERT_FILTER_FIELD_IP_TOS:
3001-
field[0] = (UINT32)RtlUshortByteSwap(ip_header->TOS);
3042+
field[0] = (UINT32)ip_header->TOS;
30023043
break;
30033044
case WINDIVERT_FILTER_FIELD_IP_LENGTH:
30043045
field[0] = (UINT32)RtlUshortByteSwap(ip_header->Length);
@@ -3160,55 +3201,26 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx,
31603201
field[0] = 0;
31613202
break;
31623203
}
3204+
cmp = windivert_big_num_compare(field, filter[ip].arg);
31633205
switch (filter[ip].test)
31643206
{
31653207
case WINDIVERT_FILTER_TEST_EQ:
3166-
result = (field[0] == filter[ip].arg[0] &&
3167-
field[1] == filter[ip].arg[1] &&
3168-
field[2] == filter[ip].arg[2] &&
3169-
field[3] == filter[ip].arg[3]);
3208+
result = (cmp == 0);
31703209
break;
31713210
case WINDIVERT_FILTER_TEST_NEQ:
3172-
result = (field[0] != filter[ip].arg[0] ||
3173-
field[1] != filter[ip].arg[1] ||
3174-
field[2] != filter[ip].arg[2] ||
3175-
field[3] != filter[ip].arg[3]);
3211+
result = (cmp != 0);
31763212
break;
31773213
case WINDIVERT_FILTER_TEST_LT:
3178-
result = (field[3] < filter[ip].arg[3] ||
3179-
(field[3] == filter[ip].arg[3] &&
3180-
field[2] < filter[ip].arg[2] ||
3181-
(field[2] == filter[ip].arg[2] &&
3182-
field[1] < filter[ip].arg[1] ||
3183-
(field[1] == filter[ip].arg[1] &&
3184-
field[0] < filter[ip].arg[0]))));
3214+
result = (cmp < 0);
31853215
break;
31863216
case WINDIVERT_FILTER_TEST_LEQ:
3187-
result = (field[3] < filter[ip].arg[3] ||
3188-
(field[3] == filter[ip].arg[3] &&
3189-
field[2] < filter[ip].arg[2] ||
3190-
(field[2] == filter[ip].arg[2] &&
3191-
field[1] < filter[ip].arg[1] ||
3192-
(field[1] == filter[ip].arg[1] &&
3193-
field[0] <= filter[ip].arg[0]))));
3217+
result = (cmp <= 0);
31943218
break;
31953219
case WINDIVERT_FILTER_TEST_GT:
3196-
result = (field[3] > filter[ip].arg[3] ||
3197-
(field[3] == filter[ip].arg[3] &&
3198-
field[2] > filter[ip].arg[2] ||
3199-
(field[2] == filter[ip].arg[2] &&
3200-
field[1] > filter[ip].arg[1] ||
3201-
(field[1] == filter[ip].arg[1] &&
3202-
field[0] > filter[ip].arg[0]))));
3220+
result = (cmp > 0);
32033221
break;
32043222
case WINDIVERT_FILTER_TEST_GEQ:
3205-
result = (field[3] > filter[ip].arg[3] ||
3206-
(field[3] == filter[ip].arg[3] &&
3207-
field[2] > filter[ip].arg[2] ||
3208-
(field[2] == filter[ip].arg[2] &&
3209-
field[1] > filter[ip].arg[1] ||
3210-
(field[1] == filter[ip].arg[1] &&
3211-
field[0] >= filter[ip].arg[0]))));
3223+
result = (cmp >= 0);
32123224
break;
32133225
default:
32143226
result = FALSE;
@@ -3465,6 +3477,7 @@ static filter_t windivert_filter_compile(windivert_ioctl_filter_t ioctl_filter,
34653477
goto windivert_filter_compile_exit;
34663478
}
34673479
break;
3480+
case WINDIVERT_FILTER_FIELD_IP_TOS:
34683481
case WINDIVERT_FILTER_FIELD_IP_TTL:
34693482
case WINDIVERT_FILTER_FIELD_IP_PROTOCOL:
34703483
case WINDIVERT_FILTER_FIELD_IPV6_TRAFFICCLASS:
@@ -3485,7 +3498,6 @@ static filter_t windivert_filter_compile(windivert_ioctl_filter_t ioctl_filter,
34853498
goto windivert_filter_compile_exit;
34863499
}
34873500
break;
3488-
case WINDIVERT_FILTER_FIELD_IP_TOS:
34893501
case WINDIVERT_FILTER_FIELD_IP_LENGTH:
34903502
case WINDIVERT_FILTER_FIELD_IP_ID:
34913503
case WINDIVERT_FILTER_FIELD_IP_CHECKSUM:

sys/windivert.rc

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
" (donate: 1C5vZVSbizPeZ8ydTYhUfm4LA2cNwBfcYh)"
2828
#define VER_INTERNALNAME_STR "WinDivert.sys"
2929
#define VER_ORIGINALFILENAME_STR "WinDivert.sys"
30-
#define VER_PRODUCTVERSION 1.1.7
31-
#define VER_PRODUCTVERSION_STR "1.1.7"
30+
#define VER_PRODUCTVERSION 1.1.8
31+
#define VER_PRODUCTVERSION_STR "1.1.8"
3232
#define VER_COMPANYNAME_STR "Basil"
33-
#define VER_LEGALCOPYRIGHT_YEARS "2011-2014"
33+
#define VER_LEGALCOPYRIGHT_YEARS "2011-2015"
3434
#define VER_LEGALCOPYRIGHT_STR \
3535
"Copyright \251 " VER_COMPANYNAME_STR " " VER_LEGALCOPYRIGHT_YEARS
3636
#define VER_FILEVERSION VER_PRODUCTVERSION

0 commit comments

Comments
 (0)