Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ffde671 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[NETFILTER]: Fix div64_64 in ipt_connbytes

parent 9d810fd2
Loading
Loading
Loading
Loading
+10 −14
Original line number Original line Diff line number Diff line
@@ -22,23 +22,19 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
MODULE_DESCRIPTION("iptables match for matching number of pkts/bytes per connection");
MODULE_DESCRIPTION("iptables match for matching number of pkts/bytes per connection");


/* 64bit divisor, dividend and result. dynamic precision */
/* 64bit divisor, dividend and result. dynamic precision */
static u_int64_t div64_64(u_int64_t divisor, u_int64_t dividend)
static u_int64_t div64_64(u_int64_t dividend, u_int64_t divisor)
{
{
	u_int64_t result = divisor;
	u_int32_t d = divisor;


	if (dividend > 0xffffffff) {
	if (divisor > 0xffffffffULL) {
		int first_bit = find_first_bit((unsigned long *) &dividend, sizeof(dividend));
		unsigned int shift = fls(divisor >> 32);
		/* calculate number of bits to shift. shift exactly enough
		 * bits to make dividend fit in 32bits. */
		int num_shift = (64 - 32 - first_bit);
		/* first bit has to be < 32, since dividend was > 0xffffffff */
		result = result >> num_shift;
		dividend = dividend >> num_shift;
	}


	do_div(divisor, dividend);
		d = divisor >> shift;
		dividend >>= shift;
	}


	return divisor;
	do_div(dividend, d);
	return dividend;
}
}


static int
static int