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 HEAD
==== ====
Changes:
- xt_geoip: avoid recursive function calls
v1.35 (2011-04-11) v1.35 (2011-04-11)

View File

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