xt_geoip: avoid recursive function calls

The stack memory is very limited in Linux kernel.

Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
This commit is contained in:
Changli Gao
2011-03-07 16:14:29 +08:00
committed by Jan Engelhardt
parent 757bf0e993
commit a5355e74ea
2 changed files with 29 additions and 19 deletions

View File

@@ -1,6 +1,8 @@
HEAD
====
Changes:
- xt_geoip: avoid recursive function calls
v1.35 (2011-04-11)

View File

@@ -167,16 +167,20 @@ static bool geoip_bsearch6(const struct geoip_subnet6 *range,
{
int mid;
if (hi <= lo)
return false;
mid = (lo + hi) / 2;
if (ipv6_cmp(&range[mid].begin, addr) <= 0 &&
ipv6_cmp(addr, &range[mid].end) <= 0)
return true;
if (ipv6_cmp(&range[mid].begin, addr) > 0)
return geoip_bsearch6(range, addr, lo, mid);
else if (ipv6_cmp(&range[mid].end, addr) < 0)
return geoip_bsearch6(range, addr, mid + 1, hi);
while (true) {
if (hi <= lo)
return false;
mid = (lo + hi) / 2;
if (ipv6_cmp(&range[mid].begin, addr) <= 0 &&
ipv6_cmp(addr, &range[mid].end) <= 0)
return true;
if (ipv6_cmp(&range[mid].begin, addr) > 0)
hi = mid;
else if (ipv6_cmp(&range[mid].end, addr) < 0)
lo = mid + 1;
else
break;
}
WARN_ON(true);
return false;
@@ -218,15 +222,19 @@ static bool geoip_bsearch4(const struct geoip_subnet4 *range,
{
int mid;
if (hi <= lo)
return false;
mid = (lo + hi) / 2;
if (range[mid].begin <= addr && addr <= range[mid].end)
return true;
if (range[mid].begin > addr)
return geoip_bsearch4(range, addr, lo, mid);
else if (range[mid].end < addr)
return geoip_bsearch4(range, addr, mid + 1, hi);
while (true) {
if (hi <= lo)
return false;
mid = (lo + hi) / 2;
if (range[mid].begin <= addr && addr <= range[mid].end)
return true;
if (range[mid].begin > addr)
hi = mid;
else if (range[mid].end < addr)
lo = mid + 1;
else
break;
}
WARN_ON(true);
return false;