Skip to contentSkip to conversation

fixes libipt_geoip.c country check-up and print() output

PATCH New Samuel Jean 1 participant 1 message Nov 16, 2004 netfilter

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fixes libipt_geoip.c country check-up and print() output

Hi there,

I know that geoip isn't in the svn yet, but here's the patch anyway. *For those who need it*

It removes useless static country check-up.
This wasn't smart as it prevents users from using newly-added countries in the db. (and vice-versa)

Anyway, they will get warned if the country isn't in the database.

This patch also adds a trailing space for a correct --list output.

Nicolas, please rebuild a new package with this patch.

Thanks,

Samuel
CookingLinux TM

[diff -Nru -p1 geoip.orig/iptables/extensions/libipt_geoip.c geoip/iptables/extensions/libipt_geoip.c]

iptables/extensions/libipt_geoip.c +8 -49
@@ -27,28 +27,2 @@
 
-// We need it to verify inputed country code
-// This shouldn't go in ipt_geoip.h because only this library needs it.
-// Also, those country codes *MUST* stand in alphabetic order due to the
-// algorithm used to seek through this list.
-#define COUNTRYCOUNT    243      /* Always re-adjust this value when
-                                    adding/removing a country */
-#define COUNTRYCODESZ   2        // This value shouldn't be changed.
-static char *cc_list[COUNTRYCOUNT] = {
-"A1","A2", // Anonymous Proxies and Satellite Providers
-"AD","AE","AF","AG","AI","AL","AM","AN","AO","AQ","AR","AS","AT","AU","AW","AZ",
-"BA","BB","BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO","BR","BS","BT","BV",
-"BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR",
-"CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER",
-"ES","ET","FI","FJ","FK","FM","FO","FR","FX","GA","GB","GD","GE","GF","GH","GI",
-"GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT",
-"HU","ID","IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO","JP","KE","KG","KH",
-"KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT",
-"LU","LV","LY","MA","MC","MD","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR",
-"MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO",
-"NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS",
-"PT","PW","PY","QA","RE","RO","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI",
-"SJ","SK","SL","SM","SN","SO","SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH",
-"TJ","TK","TM","TN","TO","TP","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY",
-"UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","YU","ZA","ZM","ZR",
-"ZW" };
-
 static void help(void)
@@ -90,16 +64,2 @@ static void geoip_free(struct geoip_info
 
-static u_int8_t
-binary_search(const char *key, u_int8_t low, u_int8_t hi)
-{
-   u_int8_t mid = (hi-low)/2 + low;
-   if (low >= hi)
-      return strncmp(key, cc_list[mid], 2);
-   if (!strncmp(key, cc_list[mid], 2))
-      return 0;
-   if (strncmp(key, cc_list[mid], 2) > 0)
-      return binary_search(key, mid+1, hi);
-   else
-      return binary_search(key, low, mid);
-}
-
 struct geoip_index {
@@ -196,3 +156,3 @@ check_geoip_cc(char *cc, u_int16_t cc_us
 
-   if (strlen(cc) != COUNTRYCODESZ) /* Country must be 2 chars long according
+   if (strlen(cc) != 2) /* Country must be 2 chars long according
                                         to the ISO3166 standard */
@@ -203,10 +163,9 @@ check_geoip_cc(char *cc, u_int16_t cc_us
    // Make sure they are..
-   for (i = 0; i < COUNTRYCODESZ; i++)
-      cc[i] = toupper(cc[i]);
+   for (i = 0; i < 2; i++)
+      if (isalnum(cc[i]) != 0)
+         cc[i] = toupper(cc[i]);
+      else
+         exit_error(PARAMETER_PROBLEM,
+               "geoip match:  invalid country code '%s'", cc);
 
-   // Verify for a valid value against the country code list.
-   if (binary_search(cc, 0, COUNTRYCOUNT-1) != 0)
-   exit_error(PARAMETER_PROBLEM,
-         "geoip match: invalid country code '%s'", cc);
- 
    /* Convert chars into a single 16 bit integer.
@@ -338,2 +297,3 @@ print(const struct ipt_ip *ip,
        printf("%s%c%c", i ? "," : "", COUNTRY(info->cc[i]));
+   printf(" ");
 }
@@ -357,3 +317,2 @@ save(const struct ipt_ip *ip,
       printf("%s%c%c", i ? "," : "", COUNTRY(info->cc[i]));
-   
    printf(" ");