Fix for amb519: geoip_code2 and geoip_code3 will overflow the result buffer on an unsuccessful lookup.

Added two replacement natives for those two: geoip_code2_ex and geoip_code3_ex, could not modify the old natives without breaking backwards compatibility.
This commit is contained in:
Steve Dudenhoeffer 2007-07-19 18:37:13 +00:00
parent 8316318c31
commit 4b02ffa920
2 changed files with 86 additions and 4 deletions

View File

@ -28,6 +28,39 @@ static cell AMX_NATIVE_CALL amx_geoip_code3(AMX *amx, cell *params)
const char *ccode = GeoIP_country_code3_by_addr(gi, ip); const char *ccode = GeoIP_country_code3_by_addr(gi, ip);
return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 4); return MF_SetAmxString(amx, params[2], ccode?ccode:"error", 4);
} }
static cell AMX_NATIVE_CALL amx_geoip_code2_ex(AMX *amx, cell *params)
{
int len = 0;
char *ip = MF_GetAmxString(amx, params[1], 0, &len);
StripPort(ip);
const char *ccode = GeoIP_country_code_by_addr(gi, ip);
if (ccode == NULL)
{
return 0;
}
MF_SetAmxString(amx, params[2], ccode, 2);
return 1;
}
static cell AMX_NATIVE_CALL amx_geoip_code3_ex(AMX *amx, cell *params)
{
int len = 0;
char *ip = MF_GetAmxString(amx, params[1], 0, &len);
StripPort(ip);
const char *ccode = GeoIP_country_code3_by_addr(gi, ip);
if (ccode == NULL)
{
return 0;
}
MF_SetAmxString(amx, params[2], ccode, 3);
return 1;
}
static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_geoip_country(AMX *amx, cell *params)
{ {
@ -60,6 +93,10 @@ void OnAmxxDetach()
AMX_NATIVE_INFO geoip_natives[] = { AMX_NATIVE_INFO geoip_natives[] = {
{"geoip_code2", amx_geoip_code2}, {"geoip_code2", amx_geoip_code2},
{"geoip_code3", amx_geoip_code3}, {"geoip_code3", amx_geoip_code3},
{"geoip_code2_ex", amx_geoip_code2_ex},
{"geoip_code3_ex", amx_geoip_code3_ex},
{"geoip_country", amx_geoip_country}, {"geoip_country", amx_geoip_country},
{NULL, NULL}, {NULL, NULL},
}; };

View File

@ -17,13 +17,58 @@
#pragma library geoip #pragma library geoip
#endif #endif
//IP address can contain ports, the ports will be stripped out /// IP addresses passed to these natives can contain ports, the ports will be ignored.
//get a two character country code (eg US, CA etc) /**
* Lookup the two character country code for a given IP address.
* e.g: "US", "CA", etc.
*
* @param ip The IP address to lookup.
* @param result The result buffer. If the lookup does not succeed, the buffer is not modified.
* @return true on a successful lookup, false on a failed lookup.
*/
native bool:geoip_code2_ex(const ip[], result[3]);
/**
* Lookup the three character country code for a given IP address.
* e.g: "USA", "cAN", etc.
*
* @param ip The IP address to lookup.
* @param result The result buffer. If the lookup does not succeed, the buffer is not modified.
* @return true on a successful lookup, false on a failed lookup.
*/
native bool:geoip_code3_ex(const ip[], result[4]);
/**
* @deprecated
* Lookup the two character country code for a given IP address.
*
* @note This native will overflow the buffer by one cell on an unknown ip lookup!
* @note Use geoip_code2_ex instead!
*
* @param ip The IP address to lookup.
* @param result The result buffer.
*/
native geoip_code2(const ip[], ccode[3]); native geoip_code2(const ip[], ccode[3]);
//get a three character country code (eg USA, cAN etc) /**
* @deprecated
* Lookup the three character country code for a given IP address.
*
* @note This native will overflow the buffer by one cell on an unknown ip lookup!
* @note Use geoip_code3_ex instead!
*
* @param ip The IP address to lookup.
* @param result The result buffer.
*/
native geoip_code3(const ip[], result[4]); native geoip_code3(const ip[], result[4]);
//get a full country name. max name is 45 chars /**
* Lookup the full country name for the given IP address. Sets the buffer to "error" on
* an unsuccessful lookup.
*
* @param ip The IP address to lookup.
* @param result The result of the geoip lookup.
* @param len The maximum length of the result buffer.
*/
native geoip_country(const ip[], result[], len=45); native geoip_country(const ip[], result[], len=45);